source: trunk/lib/bit_block_iterator.hpp @ 1608

Last change on this file since 1608 was 1608, checked in by ksherdy, 8 years ago

Added block at a time iterator class.

File size: 2.0 KB
Line 
1/*
2 * bit_block_iterator.hpp
3 */
4
5#ifndef BIT_BLOCK_ITERATOR_H_
6#define BIT_BLOCK_ITERATOR_H_
7
8#include <iterator>
9#include <iostream>
10using namespace std;
11
12#include "bitblock.hpp" // ctzl, SIMD_type
13
14template<class T>
15class BitBlockIterator: public iterator<input_iterator_tag, int>
16{
17public:
18        BitBlockIterator():crt_pos(-1), crt_blk(-1), strm(NULL), scan_blk(-1)
19        {
20                // default constructor defines past-the-end of bit stream semantics, crt_pos == -1
21        }
22
23        BitBlockIterator(T * s):crt_pos(0),     // TODO - Update logic to support array of BitBlock * type
24                                                         crt_blk(0),
25                                                         strm(s),
26                                                         scan_blk(*((unsigned long *)s))
27        {
28                scan_forward();
29        }
30
31        virtual ~BitBlockIterator() {};
32
33        // shallow copy, bit stream iterators refer to shared data
34        BitBlockIterator& operator=(const BitBlockIterator& iter)
35        {
36                crt_pos = iter.crt_pos;
37                crt_blk = iter.crt_blk;
38                strm = iter.strm;                       // No copy, both
39                scan_blk =  iter.scan_blk;
40                return(*this);
41        }
42
43        // equal position and stream
44        bool operator==(const BitBlockIterator& iter)
45        {
46                return((strm = iter.strm) && (crt_pos == iter.crt_pos));
47        }
48
49        // not equal position and stream
50        bool operator!=(const BitBlockIterator& iter)
51        {
52                return((strm != iter.strm) && (crt_pos != iter.crt_pos));
53        }
54
55        // pre-increment
56        IDISA_ALWAYS_INLINE BitBlockIterator& operator++()
57        {
58                scan_forward();
59                return(*this);
60        }
61
62        // post-increment
63        BitBlockIterator& operator++(int)
64        {
65                BitBlockIterator temp(*this);
66                ++(*this);
67                return(temp);
68        }
69
70        // Returns absolute position.
71        IDISA_ALWAYS_INLINE int operator*()
72        {
73                return crt_pos;
74        }
75
76private:
77        int crt_pos;
78        int crt_blk;
79        T * strm;
80        unsigned long scan_blk;
81
82        // Helpers
83        IDISA_ALWAYS_INLINE void scan_forward() {
84                while (crt_blk < (sizeof(T)/sizeof(unsigned long))){
85                        if(scan_blk > 0){
86                                crt_pos = cfzl(scan_blk) + (crt_blk * (sizeof(unsigned long)*8));
87                                scan_blk = scan_blk & (scan_blk-1);  // clear rightmost bit
88                                return;
89                        }
90
91                        crt_blk++;
92                        scan_blk = *((unsigned long *)strm + crt_blk);
93                };
94
95                crt_pos = -1;
96                return;
97        }
98};
99
100#endif /* BIT_BLOCK_ITERATOR_H_ */
101
Note: See TracBrowser for help on using the repository browser.