Skip to content

Commit f0109b4

Browse files
committed
switch channel index type in nth_channel_view to boost::gil::index_t
1 parent 09d4745 commit f0109b4

File tree

3 files changed

+27
-20
lines changed

3 files changed

+27
-20
lines changed

include/boost/gil/extension/dynamic_image/image_view_factory.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <boost/gil/dynamic_step.hpp>
1414
#include <boost/gil/image_view_factory.hpp>
1515
#include <boost/gil/point.hpp>
16+
#include <boost/gil/typedefs.hpp>
1617
#include <boost/gil/detail/mp11.hpp>
1718

1819
#include <cstddef>
@@ -137,15 +138,15 @@ struct nth_channel_view_fn
137138
{
138139
using result_type = ResultView;
139140

140-
nth_channel_view_fn(std::size_t n) : _n(n) {}
141+
nth_channel_view_fn(index_t n) : _n(n) {}
141142

142143
template <typename View>
143144
auto operator()(View const& src) const -> result_type
144145
{
145146
return result_type(nth_channel_view(src,_n));
146147
}
147148

148-
std::size_t _n;
149+
index_t _n;
149150
};
150151

151152
template <typename DstP, typename ResultView, typename CC = default_color_converter>
@@ -306,7 +307,7 @@ struct nth_channel_view_type<any_image_view<Views...>>
306307
/// \tparam Views Models Boost.MP11-compatible list of models of ImageViewConcept
307308
template <typename ...Views>
308309
inline
309-
auto nth_channel_view(any_image_view<Views...> const& src, std::size_t n)
310+
auto nth_channel_view(any_image_view<Views...> const& src, index_t n)
310311
-> typename nth_channel_view_type<any_image_view<Views...>>::type
311312
{
312313
using result_view_t = typename nth_channel_view_type<any_image_view<Views...>>::type;

include/boost/gil/image_view_factory.hpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <boost/gil/image_view.hpp>
1515
#include <boost/gil/metafunctions.hpp>
1616
#include <boost/gil/point.hpp>
17+
#include <boost/gil/typedefs.hpp>
1718
#include <boost/gil/detail/mp11.hpp>
1819

1920
#include <boost/assert.hpp>
@@ -309,7 +310,7 @@ namespace detail {
309310
struct __nth_channel_view_basic<View,false> {
310311
using type = typename view_type<typename channel_type<View>::type, gray_layout_t, false, true, view_is_mutable<View>::value>::type;
311312

312-
static type make(const View& src, std::size_t n) {
313+
static type make(const View& src, index_t n) {
313314
using locator_t = typename type::xy_locator;
314315
using x_iterator_t = typename type::x_iterator;
315316
using x_iterator_base_t = typename iterator_adaptor_get_base<x_iterator_t>::type;
@@ -322,7 +323,7 @@ namespace detail {
322323
template <typename View>
323324
struct __nth_channel_view_basic<View,true> {
324325
using type = typename view_type<typename channel_type<View>::type, gray_layout_t, false, false, view_is_mutable<View>::value>::type;
325-
static type make(const View& src, std::size_t n) {
326+
static type make(const View& src, index_t n) {
326327
using x_iterator_t = typename type::x_iterator;
327328
return interleaved_view(src.width(),src.height(),(x_iterator_t)&(src(0,0)[n]), src.pixels().row_size());
328329
}
@@ -346,7 +347,7 @@ namespace detail {
346347
public:
347348
using type = typename __nth_channel_view_basic<View,adjacent>::type;
348349

349-
static type make(const View& src, std::size_t n) {
350+
static type make(const View& src, index_t n) {
350351
return __nth_channel_view_basic<View,adjacent>::make(src,n);
351352
}
352353
};
@@ -374,10 +375,10 @@ namespace detail {
374375
using reference = mp11::mp_if_c<is_mutable, ref_t, value_type>;
375376
using result_type = reference;
376377

377-
nth_channel_deref_fn(std::size_t n=0) : _n(n) {}
378+
nth_channel_deref_fn(index_t n=0) : _n(n) {}
378379
template <typename P> nth_channel_deref_fn(const nth_channel_deref_fn<P>& d) : _n(d._n) {}
379380

380-
std::size_t _n; // the channel to use
381+
index_t _n; // the channel to use
381382

382383
result_type operator()(argument_type srcP) const {
383384
return result_type(srcP[_n]);
@@ -390,7 +391,7 @@ namespace detail {
390391
using AD = typename View::template add_deref<deref_t>;
391392
public:
392393
using type = typename AD::type;
393-
static type make(const View& src, std::size_t n) {
394+
static type make(const View& src, index_t n) {
394395
return AD::make(src, deref_t(n));
395396
}
396397
};
@@ -409,13 +410,13 @@ struct nth_channel_view_type {
409410
using VB = detail::__nth_channel_view<View,view_is_basic<View>::value>;
410411
public:
411412
using type = typename VB::type;
412-
static type make(const View& src, std::size_t n) { return VB::make(src,n); }
413+
static type make(const View& src, index_t n) { return VB::make(src,n); }
413414
};
414415

415416

416417
/// \ingroup ImageViewTransformationsNthChannel
417418
template <typename View>
418-
typename nth_channel_view_type<View>::type nth_channel_view(const View& src, std::size_t n) {
419+
typename nth_channel_view_type<View>::type nth_channel_view(const View& src, index_t n) {
419420
return nth_channel_view_type<View>::make(src,n);
420421
}
421422

@@ -430,11 +431,11 @@ typename nth_channel_view_type<View>::type nth_channel_view(const View& src, std
430431
/// \brief single-channel (grayscale) view of the K-th channel of a given image_view. The channel index is a template parameter
431432

432433
namespace detail {
433-
template <std::size_t K, typename View, bool AreChannelsTogether> struct __kth_channel_view_basic;
434+
template <index_t K, typename View, bool AreChannelsTogether> struct __kth_channel_view_basic;
434435

435436
// kth_channel_view when the channels are not adjacent in memory. This can happen for multi-channel interleaved images
436437
// or images with a step
437-
template <std::size_t K, typename View>
438+
template <index_t K, typename View>
438439
struct __kth_channel_view_basic<K,View,false> {
439440
private:
440441
using channel_t = typename kth_element_type<typename View::value_type,K>::type;
@@ -451,7 +452,7 @@ namespace detail {
451452
};
452453

453454
// kth_channel_view when the channels are together in memory (true for simple grayscale or planar images)
454-
template <std::size_t K, typename View>
455+
template <index_t K, typename View>
455456
struct __kth_channel_view_basic<K,View,true> {
456457
private:
457458
using channel_t = typename kth_element_type<typename View::value_type, K>::type;
@@ -463,10 +464,10 @@ namespace detail {
463464
}
464465
};
465466

466-
template <std::size_t K, typename View, bool IsBasic> struct __kth_channel_view;
467+
template <index_t K, typename View, bool IsBasic> struct __kth_channel_view;
467468

468469
// For basic (memory-based) views dispatch to __kth_channel_view_basic
469-
template <std::size_t K, typename View> struct __kth_channel_view<K,View,true>
470+
template <index_t K, typename View> struct __kth_channel_view<K,View,true>
470471
{
471472
private:
472473
using src_x_iterator = typename View::x_iterator;
@@ -491,7 +492,7 @@ namespace detail {
491492
/// 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)
492493
/// \tparam SrcP reference to PixelConcept (could be pixel value or const/non-const reference)
493494
/// Examples: pixel<T,L>, pixel<T,L>&, const pixel<T,L>&, planar_pixel_reference<T&,L>, planar_pixel_reference<const T&,L>
494-
template <std::size_t K, typename SrcP>
495+
template <index_t K, typename SrcP>
495496
struct kth_channel_deref_fn
496497
{
497498
static constexpr bool is_mutable =
@@ -519,7 +520,7 @@ namespace detail {
519520
}
520521
};
521522

522-
template <std::size_t K, typename View> struct __kth_channel_view<K,View,false> {
523+
template <index_t K, typename View> struct __kth_channel_view<K,View,false> {
523524
private:
524525
using deref_t = kth_channel_deref_fn<K,typename View::reference>;
525526
using AD = typename View::template add_deref<deref_t>;
@@ -537,7 +538,7 @@ namespace detail {
537538
/// If the channels in the source view are adjacent in memory (such as planar non-step view or single-channel view) then the
538539
/// return view is a single-channel non-step view.
539540
/// If the channels are non-adjacent (interleaved and/or step view) then the return view is a single-channel step view.
540-
template <std::size_t K, typename View>
541+
template <index_t K, typename View>
541542
struct kth_channel_view_type {
542543
private:
543544
BOOST_GIL_CLASS_REQUIRE(View, boost::gil, ImageViewConcept)
@@ -548,7 +549,7 @@ struct kth_channel_view_type {
548549
};
549550

550551
/// \ingroup ImageViewTransformationsKthChannel
551-
template <std::size_t K, typename View>
552+
template <index_t K, typename View>
552553
typename kth_channel_view_type<K,View>::type kth_channel_view(const View& src) {
553554
return kth_channel_view_type<K,View>::make(src);
554555
}

include/boost/gil/typedefs.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//
22
// Copyright 2005-2007 Adobe Systems Incorporated
33
// Copyright 2018 Mateusz Loskot <[email protected]>
4+
// Copyright 2022 Dirk Stolle
45
//
56
// Use, modification and distribution are subject to the Boost Software License,
67
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -16,6 +17,7 @@
1617
#include <boost/gil/rgb.hpp>
1718
#include <boost/gil/rgba.hpp>
1819

20+
#include <cstddef>
1921
#include <cstdint>
2022
#include <memory>
2123

@@ -91,6 +93,9 @@ template <typename B, typename Mn, typename Mx> struct scoped_channel_value;
9193
template <typename T> struct float_point_zero;
9294
template <typename T> struct float_point_one;
9395

96+
// general-purpose index type
97+
using index_t = std::ptrdiff_t;
98+
9499
//////////////////////////////////////////////////////////////////////////////////////////
95100
/// Built-in channel models
96101
//////////////////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)