123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- #ifndef BOOST_GIL_CHANNEL_NUMERIC_OPERATIONS_HPP
- #define BOOST_GIL_CHANNEL_NUMERIC_OPERATIONS_HPP
- #include <boost/gil/channel.hpp>
- namespace boost { namespace gil {
- template <typename Channel1, typename Channel2, typename ChannelResult>
- struct channel_plus_t
- {
- using ChannelRef1 = typename channel_traits<Channel1>::const_reference;
- using ChannelRef2 = typename channel_traits<Channel2>::const_reference;
- static_assert(std::is_convertible<ChannelRef1, ChannelResult>::value,
- "ChannelRef1 not convertible to ChannelResult");
- static_assert(std::is_convertible<ChannelRef2, ChannelResult>::value,
- "ChannelRef2 not convertible to ChannelResult");
-
-
- auto operator()(ChannelRef1 ch1, ChannelRef2 ch2) const -> ChannelResult
- {
- return ChannelResult(ch1) + ChannelResult(ch2);
- }
- };
- template <typename Channel1, typename Channel2, typename ChannelResult>
- struct channel_minus_t
- {
- using ChannelRef1 = typename channel_traits<Channel1>::const_reference;
- using ChannelRef2 = typename channel_traits<Channel2>::const_reference;
- static_assert(std::is_convertible<ChannelRef1, ChannelResult>::value,
- "ChannelRef1 not convertible to ChannelResult");
- static_assert(std::is_convertible<ChannelRef2, ChannelResult>::value,
- "ChannelRef2 not convertible to ChannelResult");
-
-
- auto operator()(ChannelRef1 ch1, ChannelRef2 ch2) const -> ChannelResult
- {
- return ChannelResult(ch1) - ChannelResult(ch2);
- }
- };
- template <typename Channel1, typename Channel2, typename ChannelResult>
- struct channel_multiplies_t
- {
- using ChannelRef1 = typename channel_traits<Channel1>::const_reference;
- using ChannelRef2 = typename channel_traits<Channel2>::const_reference;
- static_assert(std::is_convertible<ChannelRef1, ChannelResult>::value,
- "ChannelRef1 not convertible to ChannelResult");
- static_assert(std::is_convertible<ChannelRef2, ChannelResult>::value,
- "ChannelRef2 not convertible to ChannelResult");
-
-
- auto operator()(ChannelRef1 ch1, ChannelRef2 ch2) const -> ChannelResult
- {
- return ChannelResult(ch1) * ChannelResult(ch2);
- }
- };
- template <typename Channel1, typename Channel2, typename ChannelResult>
- struct channel_divides_t
- {
- using ChannelRef1 = typename channel_traits<Channel1>::const_reference;
- using ChannelRef2 = typename channel_traits<Channel2>::const_reference;
- static_assert(std::is_convertible<ChannelRef1, ChannelResult>::value,
- "ChannelRef1 not convertible to ChannelResult");
- static_assert(std::is_convertible<ChannelRef2, ChannelResult>::value,
- "ChannelRef2 not convertible to ChannelResult");
-
-
- auto operator()(ChannelRef1 ch1, ChannelRef2 ch2) const -> ChannelResult
- {
- return ChannelResult(ch1) / ChannelResult(ch2);
- }
- };
- template <typename Channel, typename Scalar, typename ChannelResult>
- struct channel_plus_scalar_t
- {
- using ChannelRef = typename channel_traits<Channel>::const_reference;
- static_assert(std::is_convertible<ChannelRef, ChannelResult>::value,
- "ChannelRef not convertible to ChannelResult");
- static_assert(std::is_scalar<Scalar>::value, "Scalar not a scalar");
- static_assert(std::is_convertible<Scalar, ChannelResult>::value,
- "Scalar not convertible to ChannelResult");
- auto operator()(ChannelRef channel, Scalar const& scalar) const -> ChannelResult
- {
- return ChannelResult(channel) + ChannelResult(scalar);
- }
- };
- template <typename Channel, typename Scalar, typename ChannelResult>
- struct channel_minus_scalar_t
- {
- using ChannelRef = typename channel_traits<Channel>::const_reference;
- static_assert(std::is_convertible<ChannelRef, ChannelResult>::value,
- "ChannelRef not convertible to ChannelResult");
- static_assert(std::is_scalar<Scalar>::value, "Scalar not a scalar");
- static_assert(std::is_convertible<Scalar, ChannelResult>::value,
- "Scalar not convertible to ChannelResult");
-
-
- auto operator()(ChannelRef channel, Scalar const& scalar) const -> ChannelResult
- {
-
- return ChannelResult(channel - scalar);
- }
- };
- template <typename Channel, typename Scalar, typename ChannelResult>
- struct channel_multiplies_scalar_t
- {
- using ChannelRef = typename channel_traits<Channel>::const_reference;
- static_assert(std::is_convertible<ChannelRef, ChannelResult>::value,
- "ChannelRef not convertible to ChannelResult");
- static_assert(std::is_scalar<Scalar>::value, "Scalar not a scalar");
- static_assert(std::is_convertible<Scalar, ChannelResult>::value,
- "Scalar not convertible to ChannelResult");
-
-
- auto operator()(ChannelRef channel, Scalar const& scalar) const -> ChannelResult
- {
- return ChannelResult(channel) * ChannelResult(scalar);
- }
- };
- template <typename Channel, typename Scalar, typename ChannelResult>
- struct channel_divides_scalar_t
- {
- using ChannelRef = typename channel_traits<Channel>::const_reference;
- static_assert(std::is_convertible<ChannelRef, ChannelResult>::value,
- "ChannelRef not convertible to ChannelResult");
- static_assert(std::is_scalar<Scalar>::value, "Scalar not a scalar");
- static_assert(std::is_convertible<Scalar, ChannelResult>::value,
- "Scalar not convertible to ChannelResult");
-
-
- auto operator()(ChannelRef channel, Scalar const& scalar) const -> ChannelResult
- {
- return ChannelResult(channel) / ChannelResult(scalar);
- }
- };
- template <typename Channel>
- struct channel_halves_t
- {
- using ChannelRef = typename channel_traits<Channel>::reference;
- auto operator()(ChannelRef channel) const -> ChannelRef
- {
-
-
-
- channel /= 2.0;
- return channel;
- }
- };
- template <typename Channel>
- struct channel_zeros_t
- {
- using ChannelRef = typename channel_traits<Channel>::reference;
- auto operator()(ChannelRef channel) const -> ChannelRef
- {
- channel = Channel(0);
- return channel;
- }
- };
- template <typename Channel1, typename Channel2>
- struct channel_assigns_t
- {
- using ChannelRef1 = typename channel_traits<Channel1>::const_reference;
- using ChannelRef2 = typename channel_traits<Channel2>::reference;
- static_assert(std::is_convertible<ChannelRef1, Channel2>::value,
- "ChannelRef1 not convertible to Channel2");
-
-
- auto operator()(ChannelRef1 ch1, ChannelRef2 ch2) const -> ChannelRef2
- {
- ch2 = Channel2(ch1);
- return ch2;
- }
- };
- }}
- #endif
|