source: trunk/lib/bitstream_iterator.hpp @ 2287

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

Removed problematic 'using namespace std;'

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>
12
13#include "bitblock.hpp" // ctzl, SIMD_type
14
15class BitStreamIterator: public std::iterator<std::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(const 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(*((scanword_t *)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        // prefix
60        inline BitStreamIterator& operator++()
61        {
62                scan_to_next();
63                return(*this);
64        }
65
66        // postfix
67        BitStreamIterator operator++(int)
68        {
69                BitStreamIterator temp(*this);
70                ++(*this);
71                return(temp);
72        }
73
74        // Returns absolute position.
75        inline int32_t operator*()
76        {
77                return pos;
78        }
79
80        /*
81        int operator->()
82        {
83                return(&*(BitStreamIterator)*this);
84        }
85        */
86
87        void debug() {
88        std::cout << "pos: " << pos << std::endl;
89        std::cout << "blk: " << blk << std::endl;
90        std::cout << "blk_pos: " << blk_pos << std::endl;
91        }
92
93
94
95private:
96        int32_t pos;
97        int32_t blk;
98        int32_t blk_pos;
99        const BitBlock * strm;
100        scanword_t scan_blk;
101        uint32_t 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 = scan_forward_zeroes(scan_blk) + blk_pos;
108                                scan_blk = scan_blk & (scan_blk-1);  // clear rightmost bit
109                                return;
110                        }
111
112                        blk_pos += (sizeof(unsigned long)*8);
113                        blk++;
114                        scan_blk = *((unsigned long *)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.