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>
#include <cds/container/fcqueue.h>
+#include <test/include/cds_test/fc_hevy_value.h>
#include <list>
const size_t nSize = 100;
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
// enqueue/dequeue
for ( size_t i = 0; i < nSize; ++i ) {
ASSERT_TRUE( q.enqueue( static_cast<value_type>(i)));
ASSERT_EQ( q.size(), i + 1 );
}
- ASSERT_FALSE( q.empty() );
+ ASSERT_FALSE( q.empty());
ASSERT_EQ( q.size(), nSize );
for ( size_t i = 0; i < nSize; ++i ) {
it = -1;
ASSERT_TRUE( q.dequeue( it ));
- ASSERT_EQ( it, i );
+ ASSERT_EQ( it, static_cast<value_type>( i ));
ASSERT_EQ( q.size(), nSize - i - 1 );
}
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
// push/pop
for ( size_t i = 0; i < nSize; ++i ) {
ASSERT_TRUE( q.push( static_cast<value_type>(i)));
ASSERT_EQ( q.size(), i + 1 );
}
- ASSERT_FALSE( q.empty() );
+ ASSERT_FALSE( q.empty());
ASSERT_EQ( q.size(), nSize );
for ( size_t i = 0; i < nSize; ++i ) {
it = -1;
- ASSERT_TRUE( q.pop( it ) );
- ASSERT_EQ( it, i );
+ ASSERT_TRUE( q.pop( it ));
+ ASSERT_EQ( it, static_cast<value_type>( i ));
ASSERT_EQ( q.size(), nSize - i - 1 );
}
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
// clear
for ( size_t i = 0; i < nSize; ++i ) {
ASSERT_TRUE( q.push( static_cast<value_type>( i )));
}
- ASSERT_FALSE( q.empty() );
+ ASSERT_FALSE( q.empty());
ASSERT_EQ( q.size(), nSize );
q.clear();
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
// pop from empty queue
it = nSize * 2;
ASSERT_FALSE( q.pop( it ));
- ASSERT_EQ( it, nSize * 2 );
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
-
- ASSERT_FALSE( q.dequeue( it ) );
- ASSERT_EQ( it, nSize * 2 );
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_EQ( it, static_cast<value_type>( nSize * 2 ));
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
+
+ ASSERT_FALSE( q.dequeue( it ));
+ ASSERT_EQ( it, static_cast<value_type>( nSize * 2 ));
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
}
template <class Queue>
ASSERT_FALSE( s.empty());
ASSERT_EQ( q.size(), i + 1 );
}
- ASSERT_FALSE( q.empty() );
+ ASSERT_FALSE( q.empty());
ASSERT_EQ( q.size(), nSize );
for ( size_t i = 0; i < nSize; ++i ) {
ASSERT_EQ( q.size(), nSize - i - 1 );
ASSERT_EQ( s, str[i] );
}
- ASSERT_TRUE( q.empty() );
- ASSERT_EQ( q.size(), 0 );
+ ASSERT_TRUE( q.empty());
+ ASSERT_EQ( q.size(), 0u );
}
};
test( q );
}
+ TEST_F( FCQueue, std_deque_heavy_value )
+ {
+ typedef fc_test::heavy_value<> ValueType;
+ typedef cds::container::FCQueue<ValueType> queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
+ TEST_F( FCQueue, std_empty_wait_strategy_heavy_value )
+ {
+ typedef fc_test::heavy_value<> ValueType;
+ typedef cds::container::FCQueue<ValueType, std::queue< ValueType, std::deque<ValueType>>,
+ cds::container::fcqueue::make_traits<
+ cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::empty >
+ >::type
+ > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
+ TEST_F( FCQueue, std_single_mutex_single_condvar_heavy_value )
+ {
+ typedef fc_test::heavy_value<> ValueType;
+ typedef cds::container::FCQueue<ValueType, std::queue< ValueType, std::deque<ValueType>>,
+ cds::container::fcqueue::make_traits<
+ cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<> >
+ >::type
+ > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
+ TEST_F( FCQueue, std_single_mutex_multi_condvar_heavy_value )
+ {
+ typedef fc_test::heavy_value<> ValueType;
+ typedef cds::container::FCQueue<ValueType, std::queue< ValueType, std::deque<ValueType>>,
+ cds::container::fcqueue::make_traits<
+ cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<> >
+ >::type
+ > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
+ TEST_F( FCQueue, std_multi_mutex_multi_condvar_heavy_value )
+ {
+ typedef fc_test::heavy_value<> ValueType;
+ typedef cds::container::FCQueue<ValueType, std::queue< ValueType, std::deque<ValueType>>,
+ cds::container::fcqueue::make_traits<
+ cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<> >
+ >::type
+ > queue_type;
+
+ queue_type q;
+ test( q );
+ }
+
TEST_F( FCQueue, std_single_mutex_single_condvar )
{
typedef cds::container::FCQueue<int, std::queue< int, std::deque<int>>,