source: trunk/lib/bitblock_iterator.hpp @ 1672

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

Added BitBlockReverseIterator? class definition.

File size: 2.6 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        // equal position and stream
27        bool operator==(const ForwardIterator& iter)
28        {
29                return ((scanner.get_strm() = iter.scanner.get_strm()) && (scanner.get_pos() == iter.scanner.get_pos));
30        }
31
32        // not equal .get_pos()ition 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        // Returns absolute position.
39        IDISA_ALWAYS_INLINE int operator*()
40        {
41                return scanner.get_pos();
42        }
43
44        // prefix increment
45        IDISA_ALWAYS_INLINE ForwardIterator& operator++()
46        {
47                scanner.scan_to_next();
48                return(*this);
49        }
50
51        // postfix increment
52        ForwardIterator operator++(int)
53        {
54                ForwardIterator temp(*this);
55                ++(*this);
56                return(temp);
57        }
58
59private:
60        ForwardScanner<bitblock_t, scanblock_t> scanner;
61};
62
63class BitBlockForwardIterator: public ForwardIterator<BitBlock, unsigned long> {
64public:
65        BitBlockForwardIterator(){}
66        BitBlockForwardIterator(BitBlock * s): ForwardIterator<BitBlock, unsigned long>(s){}
67};
68
69template<class bitblock_t, class scanblock_t>
70class ReverseIterator
71{
72public:
73        ReverseIterator() {}
74        ReverseIterator(BitBlock * s): scanner(s)
75        {
76                scanner.scan_to_next();
77        }
78
79        // equal position and stream
80        bool operator==(const ReverseIterator& iter)
81        {
82                return ((scanner.get_strm() = iter.scanner.get_strm()) && (scanner.get_pos() == iter.scanner.get_pos));
83        }
84
85        // not equal .get_pos()ition and stream
86        bool operator!=(const ReverseIterator& iter)
87        {
88                return ((scanner.get_strm() != iter.scanner.get_strm()) && (scanner.get_pos() != iter.scanner.get_pos()));
89        }
90
91        // Returns absolute position.
92        IDISA_ALWAYS_INLINE int operator*()
93        {
94                return scanner.get_pos();
95        }
96
97        // prefix decrement
98        IDISA_ALWAYS_INLINE ReverseIterator& operator--()
99        {
100                scanner.scan_to_next();
101                return(*this);
102        }
103
104        // postfix decrement
105        ReverseIterator operator--(int)
106        {
107                ReverseIterator temp(*this);
108                --(*this);
109                return(temp);
110        }
111
112private:
113        ReverseScanner<bitblock_t, scanblock_t> scanner;
114};
115
116class BitBlockReverseIterator: public ReverseIterator<BitBlock, unsigned long> {
117public:
118        BitBlockReverseIterator(){}
119        BitBlockReverseIterator(BitBlock * s): ReverseIterator<BitBlock, unsigned long>(s){}
120};
121
122
123#endif /* BITBLOCK_ITERATOR_H_ */
124
Note: See TracBrowser for help on using the repository browser.