File: bit_reversal.cpp

package info (click to toggle)
libcds 2.3.3-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,632 kB
  • sloc: cpp: 135,002; ansic: 7,234; perl: 243; sh: 237; makefile: 6
file content (62 lines) | stat: -rw-r--r-- 1,772 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// 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 <cds_test/ext_gtest.h>
#include <cds/algo/bit_reversal.h>

namespace {

    template <typename UInt>
    class bit_reversal: public ::testing::Test
    {
        typedef UInt uint_type;
#ifdef CDS_DEBUG
        static size_t const c_size = 1'000'000;
#else
        static size_t const c_size = 50'000'000;
#endif

    public:
        template <typename Algo>
        void test()
        {
            Algo f;
            for ( uint_type i = 0; i < c_size; ++i ) {
                EXPECT_EQ( i, f( f( i ) ));
                EXPECT_EQ( ~i, f( f( ~i ) ));
            }
        }

        template <typename Algo>
        void test_eq()
        {
            Algo f;
            for ( uint_type i = 0; i < c_size; ++i ) {
                EXPECT_EQ( cds::algo::bit_reversal::swar()( i ), f( i ) ) << "i=" << i;
                EXPECT_EQ( cds::algo::bit_reversal::swar()( ~i ), f( ~i ) ) << "~i=" << ~i;
            }
        }
    };

    typedef bit_reversal<uint32_t> bit_reversal32;
    typedef bit_reversal<uint64_t> bit_reversal64;

#define TEST_32BIT( x ) \
    TEST_F( bit_reversal32, x )      { test<cds::algo::bit_reversal::x>(); } \
    TEST_F( bit_reversal32, x##_eq ) { test_eq<cds::algo::bit_reversal::x>(); }

#define TEST_64BIT( x ) \
    TEST_F( bit_reversal64, x )      { test<cds::algo::bit_reversal::x>(); } \
    TEST_F( bit_reversal64, x##_eq ) { test_eq<cds::algo::bit_reversal::x>(); }

    TEST_32BIT( swar )
    TEST_32BIT( lookup )
    TEST_32BIT( muldiv )

    TEST_64BIT( swar )
    TEST_64BIT( lookup )
    TEST_64BIT( muldiv )

} // namespace