8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-23 17:23:04 +01:00
firebird-mirror/extern/libcds/test/unit/set/split_lazy_dhp.cpp
2022-10-08 20:46:39 +03:00

254 lines
7.8 KiB
C++

// Copyright (c) 2006-2018 Maxim Khizhinsky
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
#include "test_set_hp.h"
#include <cds/container/lazy_list_dhp.h>
#include <cds/container/split_list_set.h>
#include <cds/intrusive/free_list.h>
namespace {
namespace cc = cds::container;
typedef cds::gc::DHP gc_type;
class SplitListLazySet_DHP : public cds_test::container_set_hp
{
protected:
typedef cds_test::container_set_hp base_class;
void SetUp()
{
struct set_traits: public cc::split_list::traits {
typedef cc::lazy_list_tag ordered_list;
typedef hash_int hash;
struct ordered_list_traits: public cc::lazy_list::traits
{
typedef cmp compare;
};
};
typedef cc::SplitListSet< gc_type, int_item, set_traits > set_type;
cds::gc::dhp::smr::construct( set_type::c_nHazardPtrCount );
cds::threading::Manager::attachThread();
}
void TearDown()
{
cds::threading::Manager::detachThread();
cds::gc::dhp::smr::destruct();
}
};
TEST_F( SplitListLazySet_DHP, compare )
{
typedef cc::SplitListSet< gc_type, int_item,
typename cc::split_list::make_traits<
cc::split_list::ordered_list< cc::lazy_list_tag >
, cds::opt::hash< hash_int >
, cc::split_list::ordered_list_traits<
typename cc::lazy_list::make_traits<
cds::opt::compare< cmp >
>::type
>
>::type
> set_type;
set_type s( kSize, 2 );
test( s );
}
TEST_F( SplitListLazySet_DHP, less )
{
typedef cc::SplitListSet< gc_type, int_item,
typename cc::split_list::make_traits<
cc::split_list::ordered_list< cc::lazy_list_tag >
, cds::opt::hash< hash_int >
, cc::split_list::ordered_list_traits<
typename cc::lazy_list::make_traits<
cds::opt::less< less >
>::type
>
>::type
> set_type;
set_type s( kSize, 1 );
test( s );
}
TEST_F( SplitListLazySet_DHP, cmpmix )
{
typedef cc::SplitListSet< gc_type, int_item,
typename cc::split_list::make_traits<
cc::split_list::ordered_list< cc::lazy_list_tag >
, cds::opt::hash< hash_int >
, cc::split_list::ordered_list_traits<
typename cc::lazy_list::make_traits<
cds::opt::less< less >
, cds::opt::compare< cmp >
>::type
>
>::type
> set_type;
set_type s( kSize, 2 );
test( s );
}
TEST_F( SplitListLazySet_DHP, item_counting )
{
struct set_traits: public cc::split_list::traits
{
typedef cc::lazy_list_tag ordered_list;
typedef hash_int hash;
typedef cds::atomicity::item_counter item_counter;
struct ordered_list_traits: public cc::lazy_list::traits
{
typedef cmp compare;
typedef base_class::less less;
typedef cds::backoff::empty back_off;
};
};
typedef cc::SplitListSet< gc_type, int_item, set_traits > set_type;
set_type s( kSize, 4 );
test( s );
}
TEST_F( SplitListLazySet_DHP, stat )
{
struct set_traits: public cc::split_list::traits
{
typedef cc::lazy_list_tag ordered_list;
typedef hash_int hash;
typedef cds::atomicity::item_counter item_counter;
typedef cc::split_list::stat<> stat;
struct ordered_list_traits: public cc::lazy_list::traits
{
typedef base_class::less less;
typedef cds::opt::v::sequential_consistent memory_model;
};
};
typedef cc::SplitListSet< gc_type, int_item, set_traits > set_type;
set_type s( kSize, 2 );
test( s );
}
TEST_F( SplitListLazySet_DHP, back_off )
{
struct set_traits: public cc::split_list::traits
{
typedef cc::lazy_list_tag ordered_list;
typedef hash_int hash;
typedef cds::atomicity::item_counter item_counter;
typedef cds::backoff::yield back_off;
typedef cds::opt::v::sequential_consistent memory_model;
struct ordered_list_traits: public cc::lazy_list::traits
{
typedef cmp compare;
typedef cds::backoff::empty back_off;
};
};
typedef cc::SplitListSet< gc_type, int_item, set_traits > set_type;
set_type s( kSize, 3 );
test( s );
}
TEST_F( SplitListLazySet_DHP, mutex )
{
struct set_traits: public cc::split_list::traits
{
typedef cc::lazy_list_tag ordered_list;
typedef hash_int hash;
typedef cds::atomicity::item_counter item_counter;
typedef cds::backoff::yield back_off;
typedef cds::opt::v::sequential_consistent memory_model;
struct ordered_list_traits: public cc::lazy_list::traits
{
typedef cmp compare;
typedef cds::backoff::pause back_off;
typedef std::mutex lock_type;
};
};
typedef cc::SplitListSet< gc_type, int_item, set_traits > set_type;
set_type s( kSize, 2 );
test( s );
}
struct set_static_traits: public cc::split_list::traits
{
static bool const dynamic_bucket_table = false;
};
TEST_F( SplitListLazySet_DHP, static_bucket_table )
{
struct set_traits: public set_static_traits
{
typedef cc::lazy_list_tag ordered_list;
typedef hash_int hash;
typedef cds::atomicity::item_counter item_counter;
struct ordered_list_traits: public cc::lazy_list::traits
{
typedef cmp compare;
typedef cds::backoff::pause back_off;
};
};
typedef cc::SplitListSet< gc_type, int_item, set_traits > set_type;
set_type s( kSize, 4 );
test( s );
}
TEST_F( SplitListLazySet_DHP, free_list )
{
struct set_traits: public cc::split_list::traits
{
typedef cc::lazy_list_tag ordered_list;
typedef hash_int hash;
typedef cds::intrusive::FreeList free_list;
struct ordered_list_traits: public cc::lazy_list::traits
{
typedef cmp compare;
typedef base_class::less less;
typedef cds::backoff::empty back_off;
};
};
typedef cc::SplitListSet< gc_type, int_item, set_traits > set_type;
set_type s( kSize, 4 );
test( s );
}
TEST_F( SplitListLazySet_DHP, static_bucket_table_free_list )
{
struct set_traits: public set_static_traits
{
typedef cc::lazy_list_tag ordered_list;
typedef hash_int hash;
typedef cds::atomicity::item_counter item_counter;
typedef cds::intrusive::FreeList free_list;
struct ordered_list_traits: public cc::lazy_list::traits
{
typedef cmp compare;
typedef cds::backoff::pause back_off;
};
};
typedef cc::SplitListSet< gc_type, int_item, set_traits > set_type;
set_type s( kSize, 4 );
test( s );
}
} // namespace