8 #ifndef BOOST_GIL_UTILITIES_HPP
9 #define BOOST_GIL_UTILITIES_HPP
11 #include <boost/gil/detail/mp11.hpp>
13 #include <boost/config.hpp>
15 #if defined(BOOST_CLANG)
16 #pragma clang diagnostic push
17 #pragma clang diagnostic ignored "-Wconversion"
20 #if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
21 #pragma GCC diagnostic push
22 #pragma GCC diagnostic ignored "-Wconversion"
25 #include <boost/iterator/iterator_adaptor.hpp>
26 #include <boost/iterator/iterator_facade.hpp>
28 #if defined(BOOST_CLANG)
29 #pragma clang diagnostic pop
32 #if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
33 #pragma GCC diagnostic pop
42 #include <type_traits>
44 namespace boost {
namespace gil {
53 inline std::ptrdiff_t iround(
float x)
55 return static_cast<std::ptrdiff_t
>(x + (x < 0.0f ? -0.5f : 0.5f));
58 inline std::ptrdiff_t iround(
double x)
60 return static_cast<std::ptrdiff_t
>(x + (x < 0.0 ? -0.5 : 0.5));
63 inline std::ptrdiff_t ifloor(
float x)
65 return static_cast<std::ptrdiff_t
>(std::floor(x));
68 inline std::ptrdiff_t ifloor(
double x)
70 return static_cast<std::ptrdiff_t
>(std::floor(x));
73 inline std::ptrdiff_t iceil(
float x)
75 return static_cast<std::ptrdiff_t
>(std::ceil(x));
78 inline std::ptrdiff_t iceil(
double x)
80 return static_cast<std::ptrdiff_t
>(std::ceil(x));
88 inline T align(T val, std::size_t alignment)
90 return val+(alignment - val%alignment)%alignment;
101 typename ConstReference,
108 using argument_type = ArgType;
109 using result_type = ResultType;
110 using const_t = ConstT;
111 using value_type = Value;
112 using reference = Reference;
113 using const_reference = ConstReference;
114 static constexpr
bool is_mutable = IsMutable;
120 template <
typename D1,
typename D2>
123 deref_compose<typename D1::const_t, typename D2::const_t>,
124 typename D1::value_type,
125 typename D1::reference,
126 typename D1::const_reference,
127 typename D2::argument_type,
128 typename D1::result_type,
129 D1::is_mutable && D2::is_mutable
136 using argument_type =
typename D2::argument_type;
137 using result_type =
typename D1::result_type;
140 deref_compose(
const D1& x,
const D2& y) : _fn1(x), _fn2(y) {}
143 template <
typename _D1,
typename _D2>
145 : _fn1(dc._fn1), _fn2(dc._fn2)
148 result_type operator()(argument_type x)
const {
return _fn1(_fn2(x)); }
149 result_type operator()(argument_type x) {
return _fn1(_fn2(x)); }
153 template <
typename OutPtr,
typename In>
155 auto gil_reinterpret_cast(In* p) -> OutPtr
157 return static_cast<OutPtr
>(
static_cast<void*
>(p));
160 template <
typename OutPtr,
typename In>
162 auto gil_reinterpret_cast_c(In
const* p) -> OutPtr
const
164 return static_cast<OutPtr const
>(
static_cast<void const*
>(p));
173 template <
class InputIter,
class Size,
class OutputIter>
174 auto _copy_n(InputIter first, Size count, OutputIter result, std::input_iterator_tag)
175 -> std::pair<InputIter, OutputIter>
177 for ( ; count > 0; --count)
183 return std::pair<InputIter, OutputIter>(first, result);
186 template <
class RAIter,
class Size,
class OutputIter>
187 inline auto _copy_n(RAIter first, Size count, OutputIter result, std::random_access_iterator_tag)
188 -> std::pair<RAIter, OutputIter>
190 RAIter last = first + count;
191 return std::pair<RAIter, OutputIter>(last,
std::copy(first, last, result));
194 template <
class InputIter,
class Size,
class OutputIter>
195 inline auto _copy_n(InputIter first, Size count, OutputIter result)
196 -> std::pair<InputIter, OutputIter>
198 return _copy_n(first, count, result,
typename std::iterator_traits<InputIter>::iterator_category());
201 template <
class InputIter,
class Size,
class OutputIter>
202 inline auto copy_n(InputIter first, Size count, OutputIter result)
203 -> std::pair<InputIter, OutputIter>
205 return detail::_copy_n(first, count, result);
209 template <
typename T>
212 using argument_type = T;
213 using result_type = T;
214 const T& operator()(
const T& val)
const {
return val; }
218 template <
typename T1,
typename T2>
220 using first_argument_type = T1;
221 using second_argument_type = T2;
222 using result_type = T1;
223 T1 operator()(T1 f1, T2 f2)
const
230 template <
typename T>
233 using argument_type = T;
234 using result_type = T;
235 T operator()(T x)
const {
return ++x; }
239 template <
typename T>
242 using argument_type = T;
243 using result_type = T;
244 T operator()(T x)
const {
return --x; }
249 template <
typename Types,
typename T>
252 static_assert(mp11::mp_contains<Types, T>::value,
"T should be element of Types");
262 typename ChannelMapping = mp11::mp_iota
264 std::integral_constant<int, mp11::mp_size<ColorSpace>::value>
269 using color_space_t = ColorSpace;
270 using channel_mapping_t = ChannelMapping;
272 static_assert(mp11::mp_size<ColorSpace>::value > 0,
273 "color space should not be empty sequence");
278 template <
typename Value,
typename T1,
typename T2>
279 void swap_proxy(T1& left, T2& right)
287 BOOST_FORCEINLINE
bool little_endian()
289 short tester = 0x0001;
290 return *(
char*)&tester!=0;
293 BOOST_FORCEINLINE
bool big_endian()
295 return !little_endian();
Composes two dereference function objects. Similar to std::unary_compose but needs to pull some alias...
Definition: utilities.hpp:131
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
Helper base class for pixel dereference adaptors.
Definition: utilities.hpp:107
operator– wrapped in a function object
Definition: utilities.hpp:241
identity taken from SGI STL.
Definition: utilities.hpp:211
operator++ wrapped in a function object
Definition: utilities.hpp:232
plus function object whose arguments may be of different type.
Definition: utilities.hpp:219
Returns the index corresponding to the first occurrance of a given given type in.
Definition: utilities.hpp:251
Represents a color space and ordering of channels in memory.
Definition: utilities.hpp:268