source: trunk/lib/bit_stream_iterator.hpp @ 1609

Last change on this file since 1609 was 1609, checked in by ksherdy, 7 years ago

Removed ScanBlock? typedef.

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