algorithm_channel_arithmetic.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //
  2. // Copyright 2005-2007 Adobe Systems Incorporated
  3. // Copyright 2018 Mateusz Loskot <mateusz at loskot dot net>
  4. //
  5. // Distributed under the Boost Software License, Version 1.0
  6. // See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt
  8. //
  9. #include <boost/gil/channel_algorithm.hpp>
  10. #include <type_traits>
  11. #include <utility>
  12. #define BOOST_TEST_MODULE test_algorithm_channel_arithmetic
  13. #include "unit_test.hpp"
  14. #include "test_fixture.hpp"
  15. namespace gil = boost::gil;
  16. namespace fixture = boost::gil::test::fixture;
  17. template <typename ChannelFixtureBase>
  18. void test_channel_arithmetic_mutable(std::false_type) {}
  19. template <typename ChannelFixtureBase>
  20. void test_channel_arithmetic_mutable(std::true_type)
  21. {
  22. using fixture_t = fixture::channel<ChannelFixtureBase>;
  23. using channel_value_t = typename fixture_t::channel_value_t;
  24. fixture_t f;
  25. channel_value_t const v = f.min_v_;
  26. channel_value_t const one = 1;
  27. ++f.min_v_;
  28. f.min_v_++;
  29. --f.min_v_;
  30. f.min_v_--;
  31. BOOST_TEST(v == f.min_v_);
  32. f.min_v_ += one;
  33. f.min_v_ -= one;
  34. BOOST_TEST(v == f.min_v_);
  35. f.min_v_ *= one;
  36. f.min_v_ /= one;
  37. BOOST_TEST(v == f.min_v_);
  38. f.min_v_ = one; // assignable to scalar
  39. BOOST_TEST(f.min_v_ == one);
  40. f.min_v_ = v; // and to value type
  41. BOOST_TEST(f.min_v_ == v);
  42. // test swap
  43. channel_value_t v1 = f.min_v_;
  44. channel_value_t v2 = f.max_v_;
  45. std::swap(f.min_v_, f.max_v_);
  46. BOOST_TEST(f.min_v_ > f.max_v_);
  47. channel_value_t v3 = f.min_v_;
  48. channel_value_t v4 = f.max_v_;
  49. BOOST_TEST(v1 == v4);
  50. BOOST_TEST(v2 == v3);
  51. }
  52. template <typename ChannelFixtureBase>
  53. void test_channel_arithmetic()
  54. {
  55. using fixture_t = fixture::channel<ChannelFixtureBase>;
  56. fixture_t f;
  57. BOOST_TEST(f.min_v_ * 1 == f.min_v_);
  58. BOOST_TEST(f.min_v_ / 1 == f.min_v_);
  59. BOOST_TEST((f.min_v_ + 1) + 1 == f.min_v_ + 2);
  60. BOOST_TEST((f.max_v_ - 1) - 1 == f.max_v_ - 2);
  61. using is_mutable_t = std::integral_constant
  62. <
  63. bool,
  64. gil::channel_traits<typename fixture_t::channel_t>::is_mutable
  65. >;
  66. test_channel_arithmetic_mutable<ChannelFixtureBase>(is_mutable_t{});
  67. }
  68. BOOST_AUTO_TEST_CASE_TEMPLATE(channel_value, Channel, fixture::channel_byte_types)
  69. {
  70. using fixture_t = fixture::channel_value<Channel>;
  71. test_channel_arithmetic<fixture_t>();
  72. }
  73. BOOST_AUTO_TEST_CASE_TEMPLATE(channel_reference, Channel, fixture::channel_byte_types)
  74. {
  75. using fixture_t = fixture::channel_reference<Channel&>;
  76. test_channel_arithmetic<fixture_t>();
  77. }
  78. BOOST_AUTO_TEST_CASE_TEMPLATE(
  79. channel_reference_const, Channel, fixture::channel_byte_types)
  80. {
  81. using fixture_t = fixture::channel_reference<Channel const&>;
  82. test_channel_arithmetic<fixture_t>();
  83. }
  84. BOOST_AUTO_TEST_CASE_TEMPLATE(
  85. packed_channel_reference, BitField, fixture::channel_bitfield_types)
  86. {
  87. using channels565_t = fixture::packed_channels565<BitField>;
  88. test_channel_arithmetic<typename channels565_t::fixture_0_5_t>();
  89. test_channel_arithmetic<typename channels565_t::fixture_5_6_t >();
  90. test_channel_arithmetic<typename channels565_t::fixture_11_5_t>();
  91. }
  92. BOOST_AUTO_TEST_CASE_TEMPLATE(
  93. packed_dynamic_channel_reference, BitField, fixture::channel_bitfield_types)
  94. {
  95. using channels565_t = fixture::packed_dynamic_channels565<BitField>;
  96. test_channel_arithmetic<typename channels565_t::fixture_5_t>();
  97. test_channel_arithmetic<typename channels565_t::fixture_6_t>();
  98. }