Boost GIL


scanline_read_iterator.hpp
1//
2// Copyright 2007-2008 Christian Henning
3//
4// Distributed under the Boost Software License, Version 1.0
5// See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt
7//
8#ifndef BOOST_GIL_IO_SCANLINE_READ_ITERATOR_HPP
9#define BOOST_GIL_IO_SCANLINE_READ_ITERATOR_HPP
10
11#include <boost/gil/io/error.hpp>
12#include <boost/gil/io/typedefs.hpp>
13
14#include <boost/stl_interfaces/iterator_interface.hpp>
15
16#include <iterator>
17#include <memory>
18#include <vector>
19
20namespace boost { namespace gil {
21
22#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
23#pragma warning(push)
24#pragma warning(disable:4512) //assignment operator could not be generated
25#endif
26
28template <typename Reader>
30 : public boost::stl_interfaces::iterator_interface<scanline_read_iterator<Reader>, byte_t*, std::input_iterator_tag>
31{
32private:
33 using base_t = boost::stl_interfaces::iterator_interface
34 <
36 byte_t*,
37 std::input_iterator_tag
38 >;
39public:
40 scanline_read_iterator(Reader& reader, int pos = 0)
41 : reader_(reader), pos_(pos)
42 {
43 buffer_ = std::make_shared<buffer_t>(buffer_t(reader_._scanline_length));
44 buffer_start_ = &buffer_->front();
45 }
46
47 constexpr auto operator*() const noexcept { return dereference(); }
48 constexpr auto operator++() noexcept -> scanline_read_iterator& { increment(); return *this; }
49 constexpr bool operator==(scanline_read_iterator other) const noexcept { return equal(other); }
50
51private:
52 friend struct boost::stl_interfaces::access;
53
54 void increment()
55 {
56 if (skip_scanline_)
57 {
58 reader_.skip(buffer_start_, pos_);
59 }
60
61 ++pos_;
62
63 skip_scanline_ = true;
64 read_scanline_ = true;
65 }
66
67 bool equal(scanline_read_iterator const& rhs) const
68 {
69 return pos_ == rhs.pos_;
70 }
71
72 typename base_t::reference dereference() const
73 {
74 if (read_scanline_)
75 {
76 reader_.read(buffer_start_, pos_);
77 }
78 skip_scanline_ = false;
79 read_scanline_ = false;
80
81 return buffer_start_;
82 }
83
84private:
85 Reader& reader_;
86
87 mutable int pos_ = 0;
88 mutable bool read_scanline_ = true;
89 mutable bool skip_scanline_ = true;
90
91 using buffer_t = std::vector<byte_t>;
92 using buffer_ptr_t = std::shared_ptr<buffer_t>;
93 buffer_ptr_t buffer_;
94 mutable byte_t* buffer_start_ = nullptr;
95};
96
97#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
98#pragma warning(pop)
99#endif
100
101} // namespace gil
102} // namespace boost
103
104#endif
Input iterator to read images.
Definition scanline_read_iterator.hpp:31
defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
Definition algorithm.hpp:36