source: trunk/lib/bitblock_iterator.hpp @ 1896

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

Updated scanword_t type.

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