Source code repo: http://github.com/khizmax/libcds/
Download: http://sourceforge.net/projects/libcds/files/
-
+
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <gtest/gtest.h>
for ( size_t i = 0; i < nSize; ++i )
arr[i].nVal = static_cast<int>(i);
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
// pop from empty queue
pv = q.pop();
ASSERT_TRUE( pv == nullptr );
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
pv = q.dequeue();
ASSERT_TRUE( pv == nullptr );
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
// push/pop test
for ( size_t i = 0; i < nSize; ++i ) {
q.push( arr[i] );
else
q.enqueue( arr[i] );
- ASSERT_FALSE( q.empty() );
+ ASSERT_FALSE( q.empty());
ASSERT_EQ( q.size(), i + 1 );
}
for ( size_t i = 0; i < nSize; ++i ) {
- ASSERT_FALSE( q.empty() );
+ ASSERT_FALSE( q.empty());
ASSERT_EQ( q.size(), nSize - i );
if ( i & 1 )
pv = q.pop();
else
pv = q.dequeue();
ASSERT_FALSE( pv == nullptr );
- ASSERT_EQ( pv->nVal, static_cast<int>(i) );
+ ASSERT_EQ( pv->nVal, static_cast<int>(i));
}
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
// pop() doesn't call disposer
for ( size_t i = 0; i < nSize; ++i ) {
for ( size_t i = 0; i < nSize; ++i )
q.push( arr[i] );
- ASSERT_FALSE( q.empty() );
+ ASSERT_FALSE( q.empty());
ASSERT_EQ( q.size(), nSize );
q.clear( true );
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
for ( size_t i = 0; i < nSize; ++i ) {
ASSERT_EQ( arr[i].nDisposeCount, 1 );
q.push( arr[i] );
q.clear();
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
for ( size_t i = 0; i < nSize; ++i ) {
ASSERT_EQ( arr[i].nDisposeCount, 1 );
test( q );
}
+ TEST_F( IntrusiveFCQueue, base_empty_wait_strategy )
+ {
+ typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+ struct traits: public cds::intrusive::fcqueue::traits
+ {
+ typedef IntrusiveFCQueue::disposer disposer;
+ typedef cds::algo::flat_combining::wait_strategy::empty wait_strategy;
+ typedef cds::intrusive::fcqueue::stat<> stat;
+ };
+ typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >, traits > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
+ TEST_F( IntrusiveFCQueue, base_single_mutex_single_condvar )
+ {
+ typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+ struct traits: public cds::intrusive::fcqueue::traits
+ {
+ typedef IntrusiveFCQueue::disposer disposer;
+ typedef cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<> wait_strategy;
+ typedef cds::intrusive::fcqueue::stat<> stat;
+ };
+ typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >, traits > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
TEST_F( IntrusiveFCQueue, base_mutex )
{
typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
test( q );
}
+ TEST_F( IntrusiveFCQueue, base_mutex_single_mutex_multi_condvar )
+ {
+ typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+ struct traits: public cds::intrusive::fcqueue::traits
+ {
+ typedef IntrusiveFCQueue::disposer disposer;
+ typedef std::mutex lock_type;
+ typedef cds::intrusive::fcqueue::stat<> stat;
+ typedef cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<> wait_strategy;
+ };
+ typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >, traits > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
TEST_F( IntrusiveFCQueue, base_elimination )
{
typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
test( q );
}
+ TEST_F( IntrusiveFCQueue, base_elimination_multi_mutex_multi_condvar )
+ {
+ typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+ struct traits: public
+ cds::intrusive::fcqueue::make_traits <
+ cds::intrusive::opt::disposer< disposer >
+ , cds::opt::enable_elimination < true >
+ , cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
+ > ::type
+ {};
+ typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >, traits > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
TEST_F( IntrusiveFCQueue, member )
{
typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
test( q );
}
+ TEST_F( IntrusiveFCQueue, member_empty_wait_strategy )
+ {
+ 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::wait_strategy< cds::algo::flat_combining::wait_strategy::empty >
+ >::type
+ > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
+ TEST_F( IntrusiveFCQueue, member_single_mutex_single_condvar )
+ {
+ 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::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<2>>
+ >::type
+ > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
+ TEST_F( IntrusiveFCQueue, member_multi_mutex_multi_condvar )
+ {
+ 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::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
+ >::type
+ > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
TEST_F( IntrusiveFCQueue, member_elimination )
{
typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
test( q );
}
+ TEST_F( IntrusiveFCQueue, member_elimination_single_mutex_multi_condvar )
+ {
+ 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::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<2>>
+ >::type
+ > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
TEST_F( IntrusiveFCQueue, slist_base )
{
typedef base_hook_item< boost::intrusive::slist_base_hook<>> value_type;