source: trunk/lib/bitblock_iterator.hpp @ 1682

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

Updated Forward and Reverse iterators to inherit from public iterator<input_iterator_tag, int>.

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