Boost GIL


bit_aligned_pixel_iterator.hpp
1//
2// Copyright 2005-2007 Adobe Systems Incorporated
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_BIT_ALIGNED_PIXEL_ITERATOR_HPP
9#define BOOST_GIL_BIT_ALIGNED_PIXEL_ITERATOR_HPP
10
11#include <boost/gil/bit_aligned_pixel_reference.hpp>
12#include <boost/gil/pixel_iterator.hpp>
13
14#include <boost/config.hpp>
15#include <boost/stl_interfaces/iterator_interface.hpp>
16
17#include <functional>
18#include <type_traits>
19
20namespace boost { namespace gil {
21
24
28
35
36template <typename NonAlignedPixelReference>
37class bit_aligned_pixel_iterator : public stl_interfaces::iterator_interface<
38#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
39 bit_aligned_pixel_iterator<NonAlignedPixelReference>,
40#endif
41 std::random_access_iterator_tag,
42 typename NonAlignedPixelReference::value_type,
43 const NonAlignedPixelReference,
44 typename NonAlignedPixelReference::value_type*,
45 typename NonAlignedPixelReference::bit_range_t::difference_type>
46{
47private:
48 using parent_t = stl_interfaces::iterator_interface<
49#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
51#endif
52 std::random_access_iterator_tag,
53 typename NonAlignedPixelReference::value_type,
54 const NonAlignedPixelReference,
55 typename NonAlignedPixelReference::value_type*,
56 typename NonAlignedPixelReference::bit_range_t::difference_type>;
57
58 template <typename Ref> friend class bit_aligned_pixel_iterator;
59
60 using bit_range_t = typename NonAlignedPixelReference::bit_range_t;
61
62public:
63 using difference_type = typename parent_t::difference_type;
64 using reference = typename parent_t::reference;
65 using iterator_category = typename parent_t::iterator_concept;
66
68 bit_aligned_pixel_iterator(const bit_aligned_pixel_iterator& p) : _bit_range(p._bit_range) {}
69 bit_aligned_pixel_iterator& operator=(const bit_aligned_pixel_iterator& p) { _bit_range=p._bit_range; return *this; }
70
71 template <typename Ref> bit_aligned_pixel_iterator(const bit_aligned_pixel_iterator<Ref>& p) : _bit_range(p._bit_range) {}
72
73 bit_aligned_pixel_iterator(reference* ref) : _bit_range(ref->bit_range()) {}
74 explicit bit_aligned_pixel_iterator(typename bit_range_t::byte_t* data, int bit_offset=0) : _bit_range(data,bit_offset) {}
75
76 constexpr auto operator*() const noexcept -> reference { return dereference(); }
77
78 constexpr auto operator+=(difference_type i) noexcept -> bit_aligned_pixel_iterator& { advance(i); return *this; }
79
80 constexpr auto operator-(bit_aligned_pixel_iterator other) const noexcept { return -distance_to(other); }
81
82 auto bit_range() const -> bit_range_t const& { return _bit_range; }
83 auto bit_range() -> bit_range_t& { return _bit_range; }
84
85private:
86 bit_range_t _bit_range;
87 static constexpr int bit_size = NonAlignedPixelReference::bit_size;
88
89 auto dereference() const -> reference { return NonAlignedPixelReference(_bit_range); }
90 void advance(difference_type d) { _bit_range.bit_advance(d*bit_size); }
91
92 auto distance_to(bit_aligned_pixel_iterator const& it) const -> difference_type { return _bit_range.bit_distance_to(it._bit_range) / bit_size; }
93 bool equal(const bit_aligned_pixel_iterator& it) const { return _bit_range==it._bit_range; }
94};
95
96template <typename NonAlignedPixelReference>
97struct const_iterator_type<bit_aligned_pixel_iterator<NonAlignedPixelReference>>
98{
99 using type =
101};
102
103template <typename NonAlignedPixelReference>
104struct iterator_is_mutable<bit_aligned_pixel_iterator<NonAlignedPixelReference>>
105 : std::integral_constant<bool, NonAlignedPixelReference::is_mutable>
106{};
107
108template <typename NonAlignedPixelReference>
109struct is_iterator_adaptor<bit_aligned_pixel_iterator<NonAlignedPixelReference>>
110 : std::false_type
111{};
112
114// PixelBasedConcept
116
117template <typename NonAlignedPixelReference>
118struct color_space_type<bit_aligned_pixel_iterator<NonAlignedPixelReference> > : public color_space_type<NonAlignedPixelReference> {};
119
120template <typename NonAlignedPixelReference>
121struct channel_mapping_type<bit_aligned_pixel_iterator<NonAlignedPixelReference> > : public channel_mapping_type<NonAlignedPixelReference> {};
122
123template <typename NonAlignedPixelReference>
124struct is_planar<bit_aligned_pixel_iterator<NonAlignedPixelReference> > : public is_planar<NonAlignedPixelReference> {}; // == false
125
127// MemoryBasedIteratorConcept
129
130template <typename NonAlignedPixelReference>
131struct byte_to_memunit<bit_aligned_pixel_iterator<NonAlignedPixelReference>>
132 : std::integral_constant<int, 8>
133{};
134
135template <typename NonAlignedPixelReference>
136inline auto memunit_step(const bit_aligned_pixel_iterator<NonAlignedPixelReference>&) -> std::ptrdiff_t
137{
138 return NonAlignedPixelReference::bit_size;
139}
140
141template <typename NonAlignedPixelReference>
142inline auto memunit_distance(bit_aligned_pixel_iterator<NonAlignedPixelReference> const& p1, bit_aligned_pixel_iterator<NonAlignedPixelReference> const& p2) -> std::ptrdiff_t
143{
144 return (p2.bit_range().current_byte() - p1.bit_range().current_byte())*8 + p2.bit_range().bit_offset() - p1.bit_range().bit_offset();
145}
146
147template <typename NonAlignedPixelReference>
148inline void memunit_advance(bit_aligned_pixel_iterator<NonAlignedPixelReference>& p, std::ptrdiff_t diff) {
149 p.bit_range().bit_advance(diff);
150}
151
152template <typename NonAlignedPixelReference>
153inline auto memunit_advanced(bit_aligned_pixel_iterator<NonAlignedPixelReference> const& p, std::ptrdiff_t diff) -> bit_aligned_pixel_iterator<NonAlignedPixelReference> {
154 bit_aligned_pixel_iterator<NonAlignedPixelReference> ret=p;
155 memunit_advance(ret, diff);
156 return ret;
157}
158
159template <typename NonAlignedPixelReference> inline
160auto memunit_advanced_ref(bit_aligned_pixel_iterator<NonAlignedPixelReference> it, std::ptrdiff_t diff) -> NonAlignedPixelReference
161{
162 return *memunit_advanced(it,diff);
163}
165// HasDynamicXStepTypeConcept
167
168template <typename NonAlignedPixelReference>
169struct dynamic_x_step_type<bit_aligned_pixel_iterator<NonAlignedPixelReference> > {
170 using type = memory_based_step_iterator<bit_aligned_pixel_iterator<NonAlignedPixelReference> >;
171};
172
174// iterator_type_from_pixel
176
177template <typename B, typename C, typename L, bool M>
178struct iterator_type_from_pixel<const bit_aligned_pixel_reference<B,C,L,M>,false,false,false>
179{
180 using type = bit_aligned_pixel_iterator<bit_aligned_pixel_reference<B,C,L,false>> ;
181};
182
183template <typename B, typename C, typename L, bool M>
184struct iterator_type_from_pixel<const bit_aligned_pixel_reference<B,C,L,M>,false,false,true>
185{
186 using type = bit_aligned_pixel_iterator<bit_aligned_pixel_reference<B,C,L,true>>;
187};
188
189template <typename B, typename C, typename L, bool M, bool IsPlanar, bool IsStep, bool IsMutable>
190struct iterator_type_from_pixel<bit_aligned_pixel_reference<B,C,L,M>,IsPlanar,IsStep,IsMutable>
191 : public iterator_type_from_pixel<const bit_aligned_pixel_reference<B,C,L,M>,IsPlanar,IsStep,IsMutable> {};
192
193} } // namespace boost::gil
194
195namespace std {
196
197// It is important to provide an overload of uninitialized_copy for bit_aligned_pixel_iterator. The default STL implementation calls placement new,
198// which is not defined for bit_aligned_pixel_iterator.
199template <typename NonAlignedPixelReference>
204{
205 return std::copy(first,last,dst);
206}
207
208} // namespace std
209
210#endif
An iterator over non-byte-aligned pixels. Models PixelIteratorConcept, PixelBasedConcept,...
Definition bit_aligned_pixel_iterator.hpp:46
Definition bit_aligned_pixel_reference.hpp:34
defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
Definition algorithm.hpp:36
Returns the type of an iterator just like the input iterator, except operating over immutable values.
Definition pixel_iterator.hpp:40