8#ifndef BOOST_GIL_BIT_ALIGNED_PIXEL_ITERATOR_HPP
9#define BOOST_GIL_BIT_ALIGNED_PIXEL_ITERATOR_HPP
11#include <boost/gil/bit_aligned_pixel_reference.hpp>
12#include <boost/gil/pixel_iterator.hpp>
14#include <boost/config.hpp>
15#include <boost/stl_interfaces/iterator_interface.hpp>
20namespace boost {
namespace gil {
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>,
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>
48 using parent_t = stl_interfaces::iterator_interface<
49#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
50 bit_aligned_pixel_iterator<NonAlignedPixelReference>,
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>;
58 template <
typename Ref>
friend class bit_aligned_pixel_iterator;
60 using bit_range_t =
typename NonAlignedPixelReference::bit_range_t;
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;
67 bit_aligned_pixel_iterator() {}
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; }
71 template <
typename Ref> bit_aligned_pixel_iterator(
const bit_aligned_pixel_iterator<Ref>& p) : _bit_range(p._bit_range) {}
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) {}
76 constexpr auto operator*()
const noexcept -> reference {
return dereference(); }
78 constexpr auto operator+=(difference_type i)
noexcept -> bit_aligned_pixel_iterator& { advance(i);
return *
this; }
80 constexpr auto operator-(bit_aligned_pixel_iterator other)
const noexcept {
return -distance_to(other); }
82 auto bit_range()
const -> bit_range_t
const& {
return _bit_range; }
83 auto bit_range() -> bit_range_t& {
return _bit_range; }
86 bit_range_t _bit_range;
87 static constexpr int bit_size = NonAlignedPixelReference::bit_size;
89 auto dereference()
const -> reference {
return NonAlignedPixelReference(_bit_range); }
90 void advance(difference_type d) { _bit_range.bit_advance(d*bit_size); }
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; }
96template <
typename NonAlignedPixelReference>
103template <
typename NonAlignedPixelReference>
104struct iterator_is_mutable<bit_aligned_pixel_iterator<NonAlignedPixelReference>>
105 : std::integral_constant<bool, NonAlignedPixelReference::is_mutable>
108template <
typename NonAlignedPixelReference>
109struct is_iterator_adaptor<bit_aligned_pixel_iterator<NonAlignedPixelReference>>
117template <
typename NonAlignedPixelReference>
118struct color_space_type<
bit_aligned_pixel_iterator<NonAlignedPixelReference> > :
public color_space_type<NonAlignedPixelReference> {};
120template <
typename NonAlignedPixelReference>
121struct channel_mapping_type<
bit_aligned_pixel_iterator<NonAlignedPixelReference> > :
public channel_mapping_type<NonAlignedPixelReference> {};
123template <
typename NonAlignedPixelReference>
130template <
typename NonAlignedPixelReference>
132 : std::integral_constant<int, 8>
135template <
typename NonAlignedPixelReference>
138 return NonAlignedPixelReference::bit_size;
141template <
typename NonAlignedPixelReference>
144 return (p2.bit_range().current_byte() - p1.bit_range().current_byte())*8 + p2.bit_range().bit_offset() - p1.bit_range().bit_offset();
147template <
typename NonAlignedPixelReference>
149 p.bit_range().bit_advance(diff);
152template <
typename NonAlignedPixelReference>
155 memunit_advance(ret, diff);
159template <
typename NonAlignedPixelReference>
inline
162 return *memunit_advanced(it,diff);
168template <
typename NonAlignedPixelReference>
170 using type = memory_based_step_iterator<bit_aligned_pixel_iterator<NonAlignedPixelReference> >;
177template <
typename B,
typename C,
typename L,
bool M>
180 using type = bit_aligned_pixel_iterator<bit_aligned_pixel_reference<B,C,L,false>> ;
183template <
typename B,
typename C,
typename L,
bool M>
186 using type = bit_aligned_pixel_iterator<bit_aligned_pixel_reference<B,C,L,true>>;
189template <
typename B,
typename C,
typename L,
bool M,
bool IsPlanar,
bool IsStep,
bool IsMutable>
199template <
typename NonAlignedPixelReference>
200auto uninitialized_copy(boost::gil::bit_aligned_pixel_iterator<NonAlignedPixelReference> first,
201 boost::gil::bit_aligned_pixel_iterator<NonAlignedPixelReference> last,
202 boost::gil::bit_aligned_pixel_iterator<NonAlignedPixelReference> dst)
203 -> boost::gil::bit_aligned_pixel_iterator<NonAlignedPixelReference>
An iterator over non-byte-aligned pixels. Models PixelIteratorConcept, PixelBasedConcept,...
Definition bit_aligned_pixel_iterator.hpp:46
BOOST_FORCEINLINE auto copy(boost::gil::pixel< T, CS > *first, boost::gil::pixel< T, CS > *last, boost::gil::pixel< T, CS > *dst) -> boost::gil::pixel< T, CS > *
Copy when both src and dst are interleaved and of the same type can be just memmove.
Definition algorithm.hpp:145
defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
Definition algorithm.hpp:36
Definition pixel_iterator.hpp:124
Returns the type of an iterator just like the input iterator, except operating over immutable values.
Definition pixel_iterator.hpp:40
Base template for types that model HasDynamicXStepTypeConcept.
Definition dynamic_step.hpp:17
Returns the type of a pixel iterator given the pixel type, whether it operates on planar data,...
Definition metafunctions.hpp:277