d12f8532c25224fb7e9984558c08e4940a77890c
[libcds.git] / cds / details / bit_reverse_counter.h
1 //$$CDS-header$$
2
3 #ifndef __CDS_DETAILS_BIT_REVERSE_COUNTER_H
4 #define __CDS_DETAILS_BIT_REVERSE_COUNTER_H
5
6 #include <cds/algo/bitop.h>
7
8 //@cond
9 namespace cds { namespace bitop {
10
11     template <typename Counter = size_t>
12     class bit_reverse_counter
13     {
14     public:
15         typedef Counter     counter_type;
16
17     private:
18         counter_type        m_nCounter;
19         counter_type        m_nReversed;
20         int                 m_nHighBit;
21
22     public:
23         bit_reverse_counter()
24             : m_nCounter(0)
25             , m_nReversed(0)
26             , m_nHighBit(-1)
27         {}
28
29         counter_type inc()
30         {
31             ++m_nCounter;
32             int nBit;
33             for ( nBit = m_nHighBit - 1; nBit >= 0; --nBit ) {
34                 if ( !cds::bitop::complement( m_nReversed, nBit ))
35                     break;
36             }
37             if ( nBit < 0 ) {
38                 m_nReversed = m_nCounter;
39                 ++m_nHighBit;
40             }
41             return m_nReversed;
42         }
43
44         counter_type dec()
45         {
46             --m_nCounter;
47             int nBit;
48             for ( nBit = m_nHighBit - 1; nBit >= 0; --nBit ) {
49                 if ( cds::bitop::complement( m_nReversed, nBit ) )
50                     break;
51             }
52             if ( nBit < 0 ) {
53                 m_nReversed = m_nCounter;
54                 --m_nHighBit;
55             }
56             return m_nReversed;
57         }
58
59         counter_type    value() const
60         {
61             return m_nCounter;
62         }
63
64         counter_type    reversed_value() const
65         {
66             return m_nReversed;
67         }
68     };
69
70 }}   // namespace cds::bitop
71 //@endcond
72
73 #endif // #ifndef __CDS_DETAILS_BIT_REVERSE_COUNTER_H