From 61217655f5480ddb7eb0ac100c659ef3e7c2ec53 Mon Sep 17 00:00:00 2001 From: Dirk Stolle Date: Wed, 4 May 2022 18:16:37 +0200 Subject: [PATCH] use std::size_t as channel index type in nth_channel_view This unifies the channel index type in nth_channel_view and image_view::num_channels - the latter one already uses std::size_t. Fixes #373. --- .../dynamic_image/image_view_factory.hpp | 7 ++-- include/boost/gil/image_view_factory.hpp | 34 +++++++++---------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/include/boost/gil/extension/dynamic_image/image_view_factory.hpp b/include/boost/gil/extension/dynamic_image/image_view_factory.hpp index fe88222a14..d22a31408a 100644 --- a/include/boost/gil/extension/dynamic_image/image_view_factory.hpp +++ b/include/boost/gil/extension/dynamic_image/image_view_factory.hpp @@ -15,6 +15,7 @@ #include #include +#include #include namespace boost { namespace gil { @@ -136,7 +137,7 @@ struct nth_channel_view_fn { using result_type = ResultView; - nth_channel_view_fn(int n) : _n(n) {} + nth_channel_view_fn(std::size_t n) : _n(n) {} template auto operator()(View const& src) const -> result_type @@ -144,7 +145,7 @@ struct nth_channel_view_fn return result_type(nth_channel_view(src,_n)); } - int _n; + std::size_t _n; }; template @@ -304,7 +305,7 @@ struct nth_channel_view_type> /// \tparam Views Models Boost.MP11-compatible list of models of ImageViewConcept template inline -auto nth_channel_view(const any_image_view& src, int n) +auto nth_channel_view(const any_image_view& src, std::size_t n) -> typename nth_channel_view_type>::type { using result_view_t = typename nth_channel_view_type>::type; diff --git a/include/boost/gil/image_view_factory.hpp b/include/boost/gil/image_view_factory.hpp index 7d7774c526..2aedbff14c 100644 --- a/include/boost/gil/image_view_factory.hpp +++ b/include/boost/gil/image_view_factory.hpp @@ -309,7 +309,7 @@ namespace detail { struct __nth_channel_view_basic { using type = typename view_type::type, gray_layout_t, false, true, view_is_mutable::value>::type; - static type make(const View& src, int n) { + static type make(const View& src, std::size_t n) { using locator_t = typename type::xy_locator; using x_iterator_t = typename type::x_iterator; using x_iterator_base_t = typename iterator_adaptor_get_base::type; @@ -322,7 +322,7 @@ namespace detail { template struct __nth_channel_view_basic { using type = typename view_type::type, gray_layout_t, false, false, view_is_mutable::value>::type; - static type make(const View& src, int n) { + static type make(const View& src, std::size_t n) { using x_iterator_t = typename type::x_iterator; return interleaved_view(src.width(),src.height(),(x_iterator_t)&(src(0,0)[n]), src.pixels().row_size()); } @@ -346,7 +346,7 @@ namespace detail { public: using type = typename __nth_channel_view_basic::type; - static type make(const View& src, int n) { + static type make(const View& src, std::size_t n) { return __nth_channel_view_basic::make(src,n); } }; @@ -374,10 +374,10 @@ namespace detail { using reference = mp11::mp_if_c; using result_type = reference; - nth_channel_deref_fn(int n=0) : _n(n) {} + nth_channel_deref_fn(std::size_t n=0) : _n(n) {} template nth_channel_deref_fn(const nth_channel_deref_fn

& d) : _n(d._n) {} - int _n; // the channel to use + std::size_t _n; // the channel to use result_type operator()(argument_type srcP) const { return result_type(srcP[_n]); @@ -390,7 +390,7 @@ namespace detail { using AD = typename View::template add_deref; public: using type = typename AD::type; - static type make(const View& src, int n) { + static type make(const View& src, std::size_t n) { return AD::make(src, deref_t(n)); } }; @@ -409,13 +409,13 @@ struct nth_channel_view_type { using VB = detail::__nth_channel_view::value>; public: using type = typename VB::type; - static type make(const View& src, int n) { return VB::make(src,n); } + static type make(const View& src, std::size_t n) { return VB::make(src,n); } }; /// \ingroup ImageViewTransformationsNthChannel template -typename nth_channel_view_type::type nth_channel_view(const View& src, int n) { +typename nth_channel_view_type::type nth_channel_view(const View& src, std::size_t n) { return nth_channel_view_type::make(src,n); } @@ -430,11 +430,11 @@ typename nth_channel_view_type::type nth_channel_view(const View& src, int /// \brief single-channel (grayscale) view of the K-th channel of a given image_view. The channel index is a template parameter namespace detail { - template struct __kth_channel_view_basic; + template struct __kth_channel_view_basic; // kth_channel_view when the channels are not adjacent in memory. This can happen for multi-channel interleaved images // or images with a step - template + template struct __kth_channel_view_basic { private: using channel_t = typename kth_element_type::type; @@ -451,7 +451,7 @@ namespace detail { }; // kth_channel_view when the channels are together in memory (true for simple grayscale or planar images) - template + template struct __kth_channel_view_basic { private: using channel_t = typename kth_element_type::type; @@ -463,10 +463,10 @@ namespace detail { } }; - template struct __kth_channel_view; + template struct __kth_channel_view; // For basic (memory-based) views dispatch to __kth_channel_view_basic - template struct __kth_channel_view + template struct __kth_channel_view { private: using src_x_iterator = typename View::x_iterator; @@ -491,7 +491,7 @@ namespace detail { /// If the input is a pixel value or constant reference, the function object is immutable. Otherwise it is mutable (and returns non-const reference to the k-th channel) /// \tparam SrcP reference to PixelConcept (could be pixel value or const/non-const reference) /// Examples: pixel, pixel&, const pixel&, planar_pixel_reference, planar_pixel_reference - template + template struct kth_channel_deref_fn { static constexpr bool is_mutable = @@ -519,7 +519,7 @@ namespace detail { } }; - template struct __kth_channel_view { + template struct __kth_channel_view { private: using deref_t = kth_channel_deref_fn; using AD = typename View::template add_deref; @@ -537,7 +537,7 @@ namespace detail { /// If the channels in the source view are adjacent in memory (such as planar non-step view or single-channel view) then the /// return view is a single-channel non-step view. /// If the channels are non-adjacent (interleaved and/or step view) then the return view is a single-channel step view. -template +template struct kth_channel_view_type { private: BOOST_GIL_CLASS_REQUIRE(View, boost::gil, ImageViewConcept) @@ -548,7 +548,7 @@ struct kth_channel_view_type { }; /// \ingroup ImageViewTransformationsKthChannel -template +template typename kth_channel_view_type::type kth_channel_view(const View& src) { return kth_channel_view_type::make(src); }