source: trunk/lib/bitstream_iterator.hpp @ 2196

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

Updated comments format.

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