bit_reversal.cpp 1.7 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. #include <cds_test/ext_gtest.h>
  6. #include <cds/algo/bit_reversal.h>
  7. namespace {
  8. template <typename UInt>
  9. class bit_reversal: public ::testing::Test
  10. {
  11. typedef UInt uint_type;
  12. #ifdef CDS_DEBUG
  13. static size_t const c_size = 1'000'000;
  14. #else
  15. static size_t const c_size = 50'000'000;
  16. #endif
  17. public:
  18. template <typename Algo>
  19. void test()
  20. {
  21. Algo f;
  22. for ( uint_type i = 0; i < c_size; ++i ) {
  23. EXPECT_EQ( i, f( f( i ) ));
  24. EXPECT_EQ( ~i, f( f( ~i ) ));
  25. }
  26. }
  27. template <typename Algo>
  28. void test_eq()
  29. {
  30. Algo f;
  31. for ( uint_type i = 0; i < c_size; ++i ) {
  32. EXPECT_EQ( cds::algo::bit_reversal::swar()( i ), f( i ) ) << "i=" << i;
  33. EXPECT_EQ( cds::algo::bit_reversal::swar()( ~i ), f( ~i ) ) << "~i=" << ~i;
  34. }
  35. }
  36. };
  37. typedef bit_reversal<uint32_t> bit_reversal32;
  38. typedef bit_reversal<uint64_t> bit_reversal64;
  39. #define TEST_32BIT( x ) \
  40. TEST_F( bit_reversal32, x ) { test<cds::algo::bit_reversal::x>(); } \
  41. TEST_F( bit_reversal32, x##_eq ) { test_eq<cds::algo::bit_reversal::x>(); }
  42. #define TEST_64BIT( x ) \
  43. TEST_F( bit_reversal64, x ) { test<cds::algo::bit_reversal::x>(); } \
  44. TEST_F( bit_reversal64, x##_eq ) { test_eq<cds::algo::bit_reversal::x>(); }
  45. TEST_32BIT( swar )
  46. TEST_32BIT( lookup )
  47. TEST_32BIT( muldiv )
  48. TEST_64BIT( swar )
  49. TEST_64BIT( lookup )
  50. TEST_64BIT( muldiv )
  51. } // namespace