File indexing completed on 2025-12-16 09:51:51
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_HOMOGENEOUS_HPP
0009 #define BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_HOMOGENEOUS_HPP
0010
0011 #include <boost/gil/pixel.hpp>
0012 #include <boost/gil/detail/mp11.hpp>
0013
0014 #include <type_traits>
0015
0016 namespace boost{ namespace gil {
0017
0018
0019
0020
0021 template<typename C,typename CMP, int Next, int Last>
0022 struct is_homogeneous_impl;
0023
0024 template<typename C, typename CMP, int Last>
0025 struct is_homogeneous_impl<C, CMP, Last, Last> : std::true_type {};
0026
0027 template<typename C, typename CMP, int Next, int Last>
0028 struct is_homogeneous_impl
0029 : mp11::mp_and
0030 <
0031 is_homogeneous_impl<C, CMP, Next + 1, Last>,
0032 std::is_same<CMP, mp11::mp_at_c<C, Next>>
0033 >
0034 {};
0035
0036 template <typename P>
0037 struct is_homogeneous : std::false_type {};
0038
0039
0040 template <typename C, typename L>
0041 struct is_homogeneous<pixel<C, L>> : std::true_type {};
0042
0043 template <typename C, typename L >
0044 struct is_homogeneous<pixel<C, L> const> : std::true_type {};
0045
0046 template <typename C, typename L>
0047 struct is_homogeneous<pixel<C, L>&> : std::true_type {};
0048
0049 template <typename C, typename L>
0050 struct is_homogeneous<pixel<C, L> const&> : std::true_type {};
0051
0052
0053 template <typename Channel, typename ColorSpace>
0054 struct is_homogeneous<planar_pixel_reference<Channel, ColorSpace>> : std::true_type {};
0055
0056 template <typename Channel, typename ColorSpace>
0057 struct is_homogeneous<planar_pixel_reference<Channel, ColorSpace> const> : std::true_type {};
0058
0059 template<typename C, typename CMP, int I, int Last>
0060 struct is_homogeneous_impl_p {};
0061
0062
0063 template <typename B, typename C, typename L>
0064 struct is_homogeneous<packed_pixel<B, C, L>>
0065 : is_homogeneous_impl_p
0066 <
0067 C,
0068 mp11::mp_at_c<C, 0>,
0069 1,
0070 mp11::mp_size<C>::value
0071 > {};
0072
0073 template< typename B
0074 , typename C
0075 , typename L
0076 >
0077 struct is_homogeneous<packed_pixel<B, C, L> const>
0078 : is_homogeneous_impl_p
0079 <
0080 C,
0081 mp11::mp_at_c<C, 0>,
0082 1,
0083 mp11::mp_size<C>::value
0084 > {};
0085
0086
0087 template <typename B, typename C, typename L, bool M>
0088 struct is_homogeneous<bit_aligned_pixel_reference<B, C, L, M>>
0089 : is_homogeneous_impl<C, mp11::mp_at_c<C, 0>, 1, mp11::mp_size<C>::value>
0090 {};
0091
0092 template <typename B, typename C, typename L, bool M>
0093 struct is_homogeneous<const bit_aligned_pixel_reference<B, C, L, M> >
0094 : is_homogeneous_impl<C, mp11::mp_at_c<C, 0>, 1, mp11::mp_size<C>::value>
0095 {};
0096
0097 }}
0098
0099 #endif