1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
//
// 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/pixel.hpp>
#include <boost/gil/concepts/pixel.hpp>
#include <boost/gil/typedefs.hpp>
#include <boost/mp11.hpp>
#include <type_traits>
namespace gil = boost::gil;
using namespace boost::mp11;
template <typename Pixel>
struct assert_compatible
{
template <typename CompatiblePixel>
void operator()(CompatiblePixel&&)
{
using result_t = typename gil::pixels_are_compatible<Pixel, CompatiblePixel>::type;
static_assert(result_t::value, "pixels should be compatible");
// TODO: Refine after MPL -> MP11 switch
static_assert(
std::is_same<result_t, std::true_type>::value,
"pixels_are_compatible result type should be std::true_type");
static_assert(
!std::is_same<result_t, std::false_type>::value,
"pixels_are_compatible result type should no be std::false_type");
}
};
template <typename Pixel>
struct assert_not_compatible
{
template <typename NotCompatiblePixel>
void operator()(NotCompatiblePixel&&)
{
static_assert(
!gil::pixels_are_compatible<Pixel, NotCompatiblePixel>::value,
"pixels should not be compatible");
}
};
template <typename Pixel, typename... CompatiblePixels>
void test_compatible()
{
mp_for_each<CompatiblePixels...>(assert_compatible<Pixel>());
}
template <typename Pixel, typename... CompatiblePixels>
void test_not_compatible()
{
mp_for_each<CompatiblePixels...>(assert_not_compatible<Pixel>());
}
int main()
{
test_compatible<gil::gray8_pixel_t, mp_list<
gil::gray8_pixel_t,
gil::gray8c_pixel_t>>();
test_compatible<gil::gray8s_pixel_t, mp_list<
gil::gray8s_pixel_t,
gil::gray8sc_pixel_t>>();
test_not_compatible<gil::gray8_pixel_t, mp_list<
gil::gray8s_pixel_t,
gil::gray8sc_pixel_t>>();
test_compatible<gil::gray16_pixel_t, mp_list<
gil::gray16_pixel_t,
gil::gray16c_pixel_t>>();
test_compatible<gil::gray16s_pixel_t, mp_list<
gil::gray16s_pixel_t,
gil::gray16sc_pixel_t>>();
test_not_compatible<gil::gray16_pixel_t, mp_list<
gil::gray16s_pixel_t,
gil::gray16sc_pixel_t>>();
test_compatible<gil::rgb8_pixel_t, mp_list<
gil::bgr8_pixel_t,
gil::bgr8c_pixel_t,
gil::rgb8_pixel_t,
gil::rgb8c_pixel_t>>();
test_compatible<gil::rgb8s_pixel_t, mp_list<
gil::bgr8s_pixel_t,
gil::bgr8sc_pixel_t,
gil::rgb8s_pixel_t,
gil::rgb8sc_pixel_t>>();
test_not_compatible<gil::rgb8_pixel_t, mp_list<
gil::argb8_pixel_t,
gil::abgr8_pixel_t,
gil::rgba8_pixel_t,
gil::bgr8s_pixel_t,
gil::bgr8sc_pixel_t,
gil::rgb8s_pixel_t,
gil::rgb8sc_pixel_t>>();
test_compatible<gil::rgba8_pixel_t, mp_list<
gil::abgr8_pixel_t,
gil::argb8_pixel_t,
gil::bgra8_pixel_t,
gil::bgra8c_pixel_t,
gil::rgba8_pixel_t,
gil::rgba8c_pixel_t>>();
test_not_compatible<gil::rgba8_pixel_t, mp_list<
gil::rgb8_pixel_t,
gil::rgb16_pixel_t,
gil::rgba16_pixel_t,
gil::cmyk8_pixel_t,
gil::cmyk16_pixel_t>>();
test_compatible<gil::cmyk8_pixel_t, mp_list<
gil::cmyk8_pixel_t,
gil::cmyk8c_pixel_t>>();
test_compatible<gil::cmyk8s_pixel_t, mp_list<
gil::cmyk8s_pixel_t,
gil::cmyk8sc_pixel_t>>();
test_not_compatible<gil::cmyk8_pixel_t, mp_list<
gil::cmyk8s_pixel_t,
gil::cmyk8sc_pixel_t>>();
test_compatible<gil::cmyk32f_pixel_t, mp_list<
gil::cmyk32f_pixel_t,
gil::cmyk32fc_pixel_t>>();
}
|