source: trunk/lib/bitblock_iterator.hpp @ 2152

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

Updated comments format.

File size: 3.0 KB
Line 
1#ifndef BITBLOCK_ITERATOR_H_
2#define BITBLOCK_ITERATOR_H_
3
4/*=============================================================================
5  bitblock_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"
15#include "bitblock_scan.hpp"
16
17template<class bitblock_t, class scanblock_t>
18class ForwardIterator : public iterator<input_iterator_tag, int>
19{
20public:
21        ForwardIterator() {}
22
23        ForwardIterator(bitblock_t * s): scanner(s)
24        {
25                scanner.scan_to_next();
26        }
27
28        void init(bitblock_t * s)
29        {
30                scanner.init(s);
31                scanner.scan_to_next();
32        }
33
34        // equal position and stream
35        bool operator==(const ForwardIterator& iter)
36        {
37                return ((scanner.get_strm() = iter.scanner.get_strm()) && (scanner.get_pos() == iter.scanner.get_pos));
38        }
39
40        // not equal .get_pos()ition and stream
41        bool operator!=(const ForwardIterator& iter)
42        {
43                return ( (scanner.get_strm() != iter.scanner.get_strm()) && (scanner.get_pos() != iter.scanner.get_pos()));
44        }
45
46        // Returns absolute position.
47        IDISA_ALWAYS_INLINE int32_t operator*()
48        {
49                return scanner.get_pos();
50        }
51
52        // prefix increment
53        IDISA_ALWAYS_INLINE ForwardIterator& operator++()
54        {
55                scanner.scan_to_next();
56                return(*this);
57        }
58
59        // postfix increment
60        ForwardIterator operator++(int)
61        {
62                ForwardIterator temp(*this);
63                ++(*this);
64                return(temp);
65        }
66
67private:
68        ForwardScanner<bitblock_t, scanblock_t> scanner;
69};
70
71class BitBlockForwardIterator: public ForwardIterator<BitBlock, scanword_t> {
72public:
73        BitBlockForwardIterator(){}
74        BitBlockForwardIterator(BitBlock * s): ForwardIterator<BitBlock, scanword_t>(s){}
75};
76
77template<class bitblock_t, class scanblock_t>
78class ReverseIterator : public iterator<input_iterator_tag, int>
79{
80public:
81        ReverseIterator() {}
82        ReverseIterator(BitBlock * s): scanner(s)
83        {
84                scanner.scan_to_next();
85        }
86
87        void init(bitblock_t * s)
88        {
89                scanner.init(s);
90                scanner.scan_to_next();
91        }
92
93        // equal position and stream
94        bool operator==(const ReverseIterator& iter)
95        {
96                return ((scanner.get_strm() = iter.scanner.get_strm()) && (scanner.get_pos() == iter.scanner.get_pos));
97        }
98
99        // not equal .get_pos()ition and stream
100        bool operator!=(const ReverseIterator& iter)
101        {
102                return ((scanner.get_strm() != iter.scanner.get_strm()) && (scanner.get_pos() != iter.scanner.get_pos()));
103        }
104
105        // Returns absolute position.
106        IDISA_ALWAYS_INLINE int32_t operator*()
107        {
108                return scanner.get_pos();
109        }
110
111        // prefix decrement
112        IDISA_ALWAYS_INLINE ReverseIterator& operator--()
113        {
114                scanner.scan_to_next();
115                return(*this);
116        }
117
118        // postfix decrement
119        ReverseIterator operator--(int)
120        {
121                ReverseIterator temp(*this);
122                --(*this);
123                return(temp);
124        }
125
126private:
127        ReverseScanner<bitblock_t, scanblock_t> scanner;
128};
129
130class BitBlockReverseIterator: public ReverseIterator<BitBlock, scanword_t> {
131public:
132        BitBlockReverseIterator(){}
133        BitBlockReverseIterator(BitBlock * s): ReverseIterator<BitBlock, scanword_t>(s){}
134};
135
136
137#endif // BITBLOCK_ITERATOR_H_
138
Note: See TracBrowser for help on using the repository browser.