// // 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 namespace gil = boost::gil; template void test_packed_channel_value_members() { static_assert(std::is_same::value, "value_type should be the same as packed_channel_value specialization"); static_assert(std::is_lvalue_reference::value, "reference should be lvalue reference type"); static_assert(std::is_lvalue_reference::value, "const_reference should be lvalue reference type"); static_assert(std::is_pointer::value, "pointer should be pointer type"); static_assert(std::is_pointer::value, "const_pointer should be pointer type"); static_assert(T::is_mutable, "packed_channel_value should be mutable by default"); static_assert(std::is_constructible::value, "packed_channel_value should be constructible from underlying integer_t"); static_assert(std::is_convertible::value, "packed_channel_value should be convertible to underlying integer_t"); } void test_packed_channel_value_with_num_bits_1() { using bits1 = gil::packed_channel_value<1>; test_packed_channel_value_members(); static_assert(std::is_same::value, "smallest integral type to store 1-bit value should be 8-bit unsigned"); BOOST_TEST_EQ(bits1::num_bits(), 1u); BOOST_TEST_EQ(bits1::min_value(), 0u); BOOST_TEST_EQ(bits1::max_value(), 1u); BOOST_TEST_EQ(gil::channel_traits::min_value(), 0u); BOOST_TEST_EQ(gil::channel_traits::max_value(), 1u); } void test_packed_channel_value_with_num_bits_8() { using bits8 = gil::packed_channel_value<8>; test_packed_channel_value_members(); static_assert(std::is_same::value, "smallest integral type to store 8-bit value should be 8-bit unsigned"); BOOST_TEST_EQ(bits8::num_bits(), 8u); BOOST_TEST_EQ(bits8::min_value(), 0u); BOOST_TEST_EQ(bits8::max_value(), 255u); BOOST_TEST_EQ(gil::channel_traits::min_value(), 0u); BOOST_TEST_EQ(gil::channel_traits::max_value(), 255u); } void test_packed_channel_value_with_num_bits15() { using bits15 = gil::packed_channel_value<15>; test_packed_channel_value_members(); static_assert(std::is_same::value, "smallest integral type to store 15-bit value should be 8-bit unsigned"); BOOST_TEST_EQ(bits15::num_bits(), 15u); BOOST_TEST_EQ(bits15::min_value(), 0u); BOOST_TEST_EQ(bits15::max_value(), 32767u); BOOST_TEST_EQ(gil::channel_traits::min_value(), 0u); BOOST_TEST_EQ(gil::channel_traits::max_value(), 32767u); } using fixture = gil::packed_channel_value<8>; void test_packed_channel_value_default_constructor() { fixture f; std::uint8_t v = f; BOOST_TEST_EQ(v, std::uint8_t{0}); } void test_packed_channel_value_user_defined_constructors() { fixture f{1}; std::uint8_t v = f; BOOST_TEST_EQ(v, std::uint8_t{1}); } void test_packed_channel_value_copy_constructors() { fixture f1{128}; fixture f2{f1}; BOOST_TEST_EQ(std::uint8_t{f1}, std::uint8_t{128}); BOOST_TEST_EQ(std::uint8_t{f1}, std::uint8_t{f2}); } void test_packed_channel_value_assignment() { fixture f; f = 64; BOOST_TEST_EQ(f, std::uint8_t{64}); } int main() { test_packed_channel_value_with_num_bits_1(); test_packed_channel_value_with_num_bits_8(); test_packed_channel_value_with_num_bits15(); test_packed_channel_value_default_constructor(); test_packed_channel_value_user_defined_constructors(); test_packed_channel_value_copy_constructors(); test_packed_channel_value_assignment(); return ::boost::report_errors(); }