source: trunk/lib/bit_stream_iterator.hpp @ 1604

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

Added bit stream iterator the lib directory.

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