source: trunk/lib/bitblock_iterator.hpp @ 2288

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

Removed problematic 'using namespace std;'

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