1 //
2 // Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
3 //
4 // Distributed under the Boost Software License, Version 1.0
5 // See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt
7 //
8 #include <boost/gil/pixel.hpp>
9 #include <boost/gil/concepts/pixel.hpp>
10 #include <boost/gil/typedefs.hpp>
11
12 #include <boost/mp11.hpp>
13
14 namespace gil = boost::gil;
15 using namespace boost::mp11;
16
17 template <std::size_t NumChannels>
18 struct assert_num_channels
19 {
20 template <typename Pixel>
operator ()assert_num_channels21 void operator()(Pixel&&)
22 {
23 static_assert(
24 gil::num_channels<Pixel>::value == NumChannels,
25 "pixels does not have expected number of channels");
26
27 // TODO: Verify num_channels type with std::is_same
28 // e.g. is std::integral_constant<T, ...>
29 }
30 };
31
32 template <std::size_t NumChannels, typename... Pixels>
test()33 void test()
34 {
35 mp_for_each<Pixels...>(assert_num_channels<NumChannels>());
36 }
37
38
main()39 int main()
40 {
41 using one = mp_list
42 <
43 gil::gray8_pixel_t,
44 gil::gray8c_pixel_t,
45 gil::gray8s_pixel_t,
46 gil::gray8sc_pixel_t,
47 gil::gray16_pixel_t,
48 gil::gray16c_pixel_t,
49 gil::gray16s_pixel_t,
50 gil::gray16sc_pixel_t,
51 gil::gray16_pixel_t,
52 gil::gray32_pixel_t,
53 gil::gray32c_pixel_t,
54 gil::gray32f_pixel_t,
55 gil::gray32fc_pixel_t,
56 gil::gray32s_pixel_t,
57 gil::gray32sc_pixel_t
58 >;
59 test<1, one>();
60
61 using three = mp_list
62 <
63 gil::bgr8_pixel_t,
64 gil::bgr8c_pixel_t,
65 gil::bgr8s_pixel_t,
66 gil::bgr8sc_pixel_t,
67 gil::bgr16_pixel_t,
68 gil::bgr16c_pixel_t,
69 gil::bgr16s_pixel_t,
70 gil::bgr16sc_pixel_t,
71 gil::bgr32_pixel_t,
72 gil::bgr32c_pixel_t,
73 gil::bgr32f_pixel_t,
74 gil::bgr32fc_pixel_t,
75 gil::bgr32s_pixel_t,
76 gil::bgr32sc_pixel_t,
77 gil::rgb8_pixel_t,
78 gil::rgb8c_pixel_t,
79 gil::rgb8s_pixel_t,
80 gil::rgb8sc_pixel_t,
81 gil::rgb16_pixel_t,
82 gil::rgb16c_pixel_t,
83 gil::rgb16s_pixel_t,
84 gil::rgb16sc_pixel_t,
85 gil::rgb32_pixel_t,
86 gil::rgb32c_pixel_t,
87 gil::rgb32f_pixel_t,
88 gil::rgb32fc_pixel_t,
89 gil::rgb32s_pixel_t,
90 gil::rgb32sc_pixel_t
91 >;
92 test<3, three>();
93
94 using four = mp_list
95 <
96 gil::abgr8_pixel_t,
97 gil::abgr8c_pixel_t,
98 gil::abgr8s_pixel_t,
99 gil::abgr8sc_pixel_t,
100 gil::abgr16_pixel_t,
101 gil::abgr16c_pixel_t,
102 gil::abgr16s_pixel_t,
103 gil::abgr16sc_pixel_t,
104 gil::abgr32_pixel_t,
105 gil::abgr32c_pixel_t,
106 gil::abgr32f_pixel_t,
107 gil::abgr32fc_pixel_t,
108 gil::abgr32s_pixel_t,
109 gil::abgr32sc_pixel_t,
110 gil::bgra8_pixel_t,
111 gil::bgra8c_pixel_t,
112 gil::bgra8s_pixel_t,
113 gil::bgra8sc_pixel_t,
114 gil::bgra16_pixel_t,
115 gil::bgra16c_pixel_t,
116 gil::bgra16s_pixel_t,
117 gil::bgra16sc_pixel_t,
118 gil::bgra32_pixel_t,
119 gil::bgra32c_pixel_t,
120 gil::bgra32f_pixel_t,
121 gil::bgra32fc_pixel_t,
122 gil::bgra32s_pixel_t,
123 gil::bgra32sc_pixel_t,
124 gil::cmyk8_pixel_t,
125 gil::cmyk8c_pixel_t,
126 gil::cmyk8s_pixel_t,
127 gil::cmyk8sc_pixel_t,
128 gil::cmyk16_pixel_t,
129 gil::cmyk16c_pixel_t,
130 gil::cmyk16s_pixel_t,
131 gil::cmyk16sc_pixel_t,
132 gil::cmyk32_pixel_t,
133 gil::cmyk32c_pixel_t,
134 gil::cmyk32f_pixel_t,
135 gil::cmyk32fc_pixel_t,
136 gil::cmyk32s_pixel_t,
137 gil::cmyk32sc_pixel_t,
138 gil::rgba8_pixel_t,
139 gil::rgba8c_pixel_t,
140 gil::rgba8s_pixel_t,
141 gil::rgba8sc_pixel_t,
142 gil::rgba16_pixel_t,
143 gil::rgba16c_pixel_t,
144 gil::rgba16s_pixel_t,
145 gil::rgba16sc_pixel_t,
146 gil::rgba32_pixel_t,
147 gil::rgba32c_pixel_t,
148 gil::rgba32f_pixel_t,
149 gil::rgba32fc_pixel_t,
150 gil::rgba32s_pixel_t,
151 gil::rgba32sc_pixel_t
152 >;
153 test<4, four>();
154 }
155