libs/gil/test/core/algorithm/std_uninitialized_fill.cpp
// // Copyright 2019 Mateusz Loskot <mateusz at loskot dot net> // // 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 <boost/gil.hpp> #include <boost/mp11.hpp> #include <boost/core/lightweight_test.hpp> #include <memory> #include <random> #include <type_traits> #include <vector> #include "test_utility_output_stream.hpp" #include "core/channel/test_fixture.hpp" #include "core/image/test_fixture.hpp" #include "core/pixel/test_fixture.hpp" namespace boost { namespace gil { namespace test { namespace fixture { template <typename Pixel> struct pixel_array { using iterator = Pixel*; #ifdef NDEBUG constexpr static std::size_t default_x_size = 256; constexpr static std::size_t default_y_size = 128; #else constexpr static std::size_t default_x_size = 16; constexpr static std::size_t default_y_size = 8; #endif pixel_array(std::size_t x_size = default_x_size, std::size_t y_size = default_y_size) : pixels_(new Pixel[x_size * y_size]) , x_size_(x_size) , y_size_(y_size) {} auto begin() -> iterator { return pixels_.get(); } auto end() -> iterator { return pixels_.get() + x_size_ * y_size_; } private: std::unique_ptr<Pixel[]> pixels_; std::size_t x_size_; std::size_t y_size_; }; }}}} namespace gil = boost::gil; namespace fixture = boost::gil::test::fixture; struct fill_with_pixel_integer_types { template <typename Pixel> void operator()(Pixel const &) { using pixel_t = Pixel; auto min_pixel = fixture::pixel_generator<pixel_t>::min(); auto max_pixel = fixture::pixel_generator<pixel_t>::max(); auto rnd_pixel = fixture::pixel_generator<pixel_t>::random(); for (auto const &fill_pixel : {min_pixel, max_pixel, rnd_pixel}) { fixture::pixel_array<pixel_t> pixels; std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel); for (pixel_t const &p : pixels) BOOST_TEST_EQ(p, fill_pixel); } } static void run() { boost::mp11::mp_for_each<fixture::pixel_integer_types>(fill_with_pixel_integer_types{}); } }; struct fill_with_pixel_float_types { template <typename Pixel> void operator()(Pixel const &) { using pixel_t = Pixel; auto min_pixel = fixture::pixel_generator<pixel_t>::min(); auto max_pixel = fixture::pixel_generator<pixel_t>::max(); for (auto const &fill_pixel : {min_pixel, max_pixel}) { fixture::pixel_array<Pixel> pixels; std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel); for (Pixel const &p : pixels) BOOST_TEST_EQ(p, fill_pixel); } } static void run() { boost::mp11::mp_for_each<fixture::pixel_float_types>(fill_with_pixel_float_types{}); } }; void test_fill_with_packed_pixel_gray3() { auto min_pixel = fixture::packed_pixel_gray3{0}; auto mid_pixel = fixture::packed_pixel_gray3{3}; auto max_pixel = fixture::packed_pixel_gray3{7}; for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} ) { fixture::pixel_array<fixture::packed_pixel_gray3> pixels; std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel); for (fixture::packed_pixel_gray3 const& p : pixels) { BOOST_TEST_EQ(p, fill_pixel); BOOST_TEST_EQ((int)get_color(p, gil::gray_color_t()), (int)get_color(fill_pixel, gil::gray_color_t())); } } } void test_fill_with_packed_pixel_bgr121() { auto min_pixel = fixture::packed_pixel_bgr121{0}; auto mid_pixel = fixture::packed_pixel_bgr121{8}; auto max_pixel = fixture::packed_pixel_bgr121{17}; for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} ) { fixture::pixel_array<fixture::packed_pixel_bgr121> pixels; std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel); for (fixture::packed_pixel_bgr121 const& p : pixels) { BOOST_TEST_EQ(p, fill_pixel); BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t())); BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t())); BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t())); } } } void test_fill_with_packed_pixel_rgb535() { fixture::packed_pixel_rgb535 min_pixel(0, 0, 0); fixture::packed_pixel_rgb535 mid_pixel(15, 3, 15); fixture::packed_pixel_rgb535 max_pixel(31, 7, 31); for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} ) { fixture::pixel_array<fixture::packed_pixel_rgb535> pixels; std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel); for (fixture::packed_pixel_rgb535 const& p : pixels) { BOOST_TEST_EQ(p, fill_pixel); BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t())); BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t())); BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t())); } } } void test_bit_aligned_pixel_bgr232() { fixture::bit_aligned_pixel_bgr232 min_pixel(0, 0, 0); fixture::bit_aligned_pixel_bgr232 mid_pixel(1, 4, 2); fixture::bit_aligned_pixel_bgr232 max_pixel(3, 7, 3); for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} ) { fixture::pixel_array<fixture::bit_aligned_pixel_bgr232> pixels; std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel); for (fixture::bit_aligned_pixel_bgr232 const& p : pixels) { BOOST_TEST_EQ(p, fill_pixel); BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t())); BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t())); BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t())); } } } void test_bit_aligned_pixel_rgb567() { fixture::bit_aligned_pixel_rgb567 min_pixel(0, 0, 0); fixture::bit_aligned_pixel_rgb567 mid_pixel(15, 31, 63); fixture::bit_aligned_pixel_rgb567 max_pixel(31, 63, 127); for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} ) { fixture::pixel_array<fixture::bit_aligned_pixel_rgb567> pixels; std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel); for (fixture::bit_aligned_pixel_rgb567 const& p : pixels) { BOOST_TEST_EQ(p, fill_pixel); BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t())); BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t())); BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t())); } } } int main() { fill_with_pixel_integer_types::run(); fill_with_pixel_float_types::run(); test_fill_with_packed_pixel_gray3(); test_fill_with_packed_pixel_bgr121(); test_fill_with_packed_pixel_rgb535(); test_bit_aligned_pixel_bgr232(); test_bit_aligned_pixel_rgb567(); return ::boost::report_errors(); }