test_treiber_stack.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright (c) 2006-2018 Maxim Khizhinsky
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef CDSUNIT_STACK_TREIBER_STACK_H
  6. #define CDSUNIT_STACK_TREIBER_STACK_H
  7. #include <cds_test/ext_gtest.h>
  8. namespace cds_test {
  9. class TreiberStack : public ::testing::Test
  10. {
  11. protected:
  12. template <class Stack>
  13. void test( Stack& stack )
  14. {
  15. typedef typename Stack::value_type value_type;
  16. value_type v;
  17. ASSERT_TRUE( stack.empty());
  18. ASSERT_TRUE( stack.push( 1 ));
  19. ASSERT_TRUE( !stack.empty());
  20. ASSERT_TRUE( stack.push( 2 ));
  21. ASSERT_TRUE( !stack.empty());
  22. ASSERT_TRUE( stack.push( 3 ));
  23. ASSERT_TRUE( !stack.empty());
  24. ASSERT_TRUE( stack.pop( v ));
  25. ASSERT_EQ( v, 3 );
  26. ASSERT_TRUE( !stack.empty());
  27. ASSERT_TRUE( stack.pop_with( [&v]( value_type& src ) { v = src; } ));
  28. ASSERT_EQ( v, 2 );
  29. ASSERT_TRUE( !stack.empty());
  30. ASSERT_TRUE( stack.pop( v ));
  31. ASSERT_EQ( v, 1 );
  32. ASSERT_TRUE( stack.empty());
  33. v = 1000;
  34. ASSERT_TRUE( !stack.pop( v ));
  35. ASSERT_EQ( v, 1000 );
  36. ASSERT_TRUE( stack.empty());
  37. ASSERT_TRUE( stack.push( 10 ));
  38. ASSERT_TRUE( stack.push( 20 ));
  39. ASSERT_TRUE( stack.push( 30 ));
  40. ASSERT_TRUE( !stack.empty());
  41. ASSERT_TRUE( stack.emplace( 100 ));
  42. ASSERT_TRUE( stack.pop( v ));
  43. ASSERT_EQ( v, 100 );
  44. stack.clear();
  45. ASSERT_TRUE( stack.empty());
  46. Stack::gc::scan();
  47. }
  48. };
  49. } // namespace cds_test
  50. #endif // CDSUNIT_STACK_TREIBER_STACK_H