// // Copyright 2019-2020 Mateusz Loskot // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // #include #include #include #include #include #include #include #include "test_fixture.hpp" namespace gil = boost::gil; namespace fixture = boost::gil::test::fixture; namespace mp11 = boost::mp11; void test_packed_pixel_gray3_definition() { // Verify packed_pixel members static_assert(std::is_same::value, "layout should be bgr"); static_assert(std::is_same::value, "value_type member should be of the same type as the packed_pixel specialization"); static_assert(std::is_reference::value, "reference member should be a reference"); static_assert(std::is_reference::value, "const_reference member should be a reference"); static_assert(std::is_same::value && fixture::packed_pixel_gray3::is_mutable, "is_mutable should be boolean"); // Verify metafunctions static_assert(mp11::mp_size::value == 1, "packed_channel_references_vector_type should define one reference to channel start bits"); using channel1_ref_t = mp11::mp_at_c; static_assert(channel1_ref_t::num_bits == 3, "1st channel of gray3 pixel should be of 3-bit size"); static_assert(std::is_same < channel1_ref_t, gil::packed_channel_reference const >::value, "1st element of packed_channel_references_vector should be packed_channel_reference of 1st channel"); // double check intermediate metafunction packed_channel_reference_type static_assert(std::is_same < gil::detail::packed_channel_reference_type < std::uint8_t, std::integral_constant, std::integral_constant >::type, channel1_ref_t >::value, "packed_channel_reference_type should return packed_channel_reference"); static_assert(std::is_same < gil::detail::packed_channel_reference_type < std::uint8_t, std::integral_constant, std::integral_constant >::type, gil::packed_channel_reference const >::value, "packed_channel_reference_type should return packed_channel_reference"); } void test_packed_pixel_gray3_assignment() { fixture::packed_pixel_gray3 p1{int{5}}; fixture::packed_pixel_gray3 p2; p2 = p1; BOOST_TEST_EQ(p1._bitfield, p2._bitfield); } void test_packed_pixel_gray3_equality() { fixture::packed_pixel_gray3 p1{int{5}}; fixture::packed_pixel_gray3 p2{int{5}}; BOOST_TEST_EQ(p1, p2); fixture::packed_pixel_gray3 p3{int{3}}; BOOST_TEST_NE(p2, p3); } void test_packed_pixel_gray3_assignment_gray_channel() { { fixture::packed_pixel_gray3 p1; // default-initialized p1 = int{5}; BOOST_TEST_EQ(p1._bitfield, int{5}); } { fixture::packed_pixel_gray3 p1{0}; // value-initialized p1 = int{5}; BOOST_TEST_EQ(p1._bitfield, int{5}); } } void test_packed_pixel_gray3_equality_gray_channel() { fixture::packed_pixel_gray3 p1{int{3}}; BOOST_TEST_EQ(p1, int{3}); } void test_packed_pixel_bgr121_definition() { // Verify packed_pixel members static_assert(std::is_same::value, "layout should be bgr"); static_assert(std::is_same::value, "value_type member should be of the same type as the packed_pixel specialization"); static_assert(std::is_reference::value, "reference member should be a reference"); static_assert(std::is_reference::value, "const_reference member should be a reference"); static_assert(std::is_same::value && fixture::packed_pixel_bgr121::is_mutable, "is_mutable should be boolean"); // Verify metafunctions static_assert(mp11::mp_size::value == 3, "packed_channel_references_vector_type should define three references to channel start bits"); using channel1_ref_t = mp11::mp_at_c; static_assert(channel1_ref_t::num_bits == 1, "1st channel of bgr121 pixel should be of 1-bit size"); using channel2_ref_t = mp11::mp_at_c; static_assert(channel2_ref_t::num_bits == 2, "2nd channel of bgr121 pixel should be of 2-bit size"); using channel3_ref_t = mp11::mp_at_c; static_assert(channel3_ref_t::num_bits == 1, "3rd channel of bgr121 pixel should be of 1-bit size"); static_assert(std::is_same < channel1_ref_t, gil::packed_channel_reference const >::value, "1st element of packed_channel_references_vector should be packed_channel_reference of 1st channel"); static_assert(std::is_same < channel2_ref_t, gil::packed_channel_reference const >::value, "2nd element of packed_channel_references_vector should be packed_channel_reference of 2nd channel"); static_assert(std::is_same < channel3_ref_t, gil::packed_channel_reference const >::value, "3rd element of packed_channel_references_vector should be packed_channel_reference of 3rd channel"); // double check intermediate metafunction packed_channel_reference_type static_assert(std::is_same < gil::detail::packed_channel_reference_type < std::uint8_t, mp11::mp_int<0>, mp11::mp_int<1> >::type, channel1_ref_t >::value, "packed_channel_reference_type should return packed_channel_reference"); static_assert(std::is_same < gil::detail::packed_channel_reference_type < std::uint8_t, mp11::mp_int<0>, mp11::mp_int<1> >::type, gil::packed_channel_reference const >::value, "packed_channel_reference_type should return packed_channel_reference"); } void test_packed_pixel_bgr121_assignment() { fixture::packed_pixel_bgr121 p1{0, 3, 1}; fixture::packed_pixel_bgr121 p2; p2 = p1; BOOST_TEST_EQ(p1._bitfield, p2._bitfield); } void test_packed_pixel_bgr121_equality() { fixture::packed_pixel_bgr121 p1{1, 3, 0}; fixture::packed_pixel_bgr121 p2{1, 3, 0}; BOOST_TEST_EQ(p1, p2); fixture::packed_pixel_bgr121 p3{0, 3, 1}; BOOST_TEST_NE(p2, p3); } void test_packed_pixel_rgb535_definition() { // Verify packed_pixel members static_assert(std::is_same::value, "layout should be bgr"); static_assert(std::is_same::value, "value_type member should be of the same type as the packed_pixel specialization"); static_assert(std::is_reference::value, "reference member should be a reference"); static_assert(std::is_reference::value, "const_reference member should be a reference"); static_assert(std::is_same::value && fixture::packed_pixel_rgb535::is_mutable, "is_mutable should be boolean"); // Verify metafunctions static_assert(mp11::mp_size::value == 3, "packed_channel_references_vector_type should define three references to channel start bits"); using channel1_ref_t = mp11::mp_at_c; static_assert(channel1_ref_t::num_bits == 5, "1st channel of rgb535 pixel should be of 5-bit size"); using channel2_ref_t = mp11::mp_at_c; static_assert(channel2_ref_t::num_bits == 3, "2nd channel of rgb535 pixel should be of 3-bit size"); using channel3_ref_t = mp11::mp_at_c; static_assert(channel3_ref_t::num_bits == 5, "3rd channel of rgb535 pixel should be of 5-bit size"); static_assert(std::is_same < channel1_ref_t, gil::packed_channel_reference const >::value, "1st element of packed_channel_references_vector should be packed_channel_reference of 1st channel"); static_assert(std::is_same < channel2_ref_t, gil::packed_channel_reference const >::value, "2nd element of packed_channel_references_vector should be packed_channel_reference of 2nd channel"); static_assert(std::is_same < channel3_ref_t, gil::packed_channel_reference const >::value, "3rd element of packed_channel_references_vector should be packed_channel_reference of 3rd channel"); // double check intermediate metafunction packed_channel_reference_type static_assert(std::is_same < gil::detail::packed_channel_reference_type < std::uint16_t, std::integral_constant, std::integral_constant >::type, channel1_ref_t >::value, "packed_channel_reference_type should return packed_channel_reference"); static_assert(std::is_same < gil::detail::packed_channel_reference_type < std::uint16_t, std::integral_constant, std::integral_constant >::type, gil::packed_channel_reference const >::value, "packed_channel_reference_type should return packed_channel_reference"); } void test_packed_pixel_rgb535_assignment() { fixture::packed_pixel_rgb535 p1{31, 7, 31}; fixture::packed_pixel_rgb535 p2; p2 = p1; BOOST_TEST_EQ(p1._bitfield, p2._bitfield); } void test_packed_pixel_rgb535_equality() { fixture::packed_pixel_rgb535 p1{7, 3, 7}; fixture::packed_pixel_rgb535 p2{7, 3, 7}; BOOST_TEST_EQ(p1, p2); fixture::packed_pixel_rgb535 p3{7, 7, 7}; BOOST_TEST_NE(p2, p3); } int main() { test_packed_pixel_gray3_definition(); test_packed_pixel_gray3_assignment(); test_packed_pixel_gray3_equality(); test_packed_pixel_gray3_assignment_gray_channel(); test_packed_pixel_gray3_equality_gray_channel(); test_packed_pixel_bgr121_definition(); test_packed_pixel_bgr121_assignment(); test_packed_pixel_bgr121_equality(); test_packed_pixel_rgb535_definition(); test_packed_pixel_rgb535_assignment(); test_packed_pixel_rgb535_equality(); return boost::report_errors(); }