
All, Several months ago I submitted a patch to prevent warnings when performing certain channel conversions [1]. After some discussion with Christian a part of the patch was removed in favor of using the unsigned_integral_max_value metafunction. After tweaking my specializations of that metafunction my code compiled fine. Recently I modified my code to use GIL more extensively. I'm pleased with the reduced code footprint (a 5000 line file was reduced to ~150 lines), but unfortunately there are more warnings due to unsafe conversions with my now-more-extensive testing. Attached is a file which adds a base_channel_type metafunction which correctly determines the type which the channel constructor is expecting. I believe this is more correct than using unsigned_integral_max_value as the value_type of *max_value is not the same as the channel type for, e.g., 8-bit unsigned channels. Something like this metafunction has also been requested recently [2]. The following demonstrates its use for the built-in channel type models I'm aware of: ///////////BEGIN CODE//////////////////// #include <boost/cstdint.hpp> #include <boost/gil/gil_all.hpp> #include <boost/static_assert.hpp> #include <boost/type_traits/is_same.hpp> namespace gil = boost::gil; typedef gil::packed_image3_type<boost::uint16_t, 7,7,2, gil::bgr_layout_t>::type bgr772_image_t; typedef gil::kth_element_type<bgr772_image_t::value_type,0>::type b7_element_type; typedef gil::base_channel_type<b7_element_type>::type b7_type; BOOST_STATIC_ASSERT((boost::is_same<b7_type, boost::uint8_t>::value)); typedef gil::base_channel_type<gil::channel_type<gil::gray32f_pixel_t>::type>::type gray32f_type; BOOST_STATIC_ASSERT((boost::is_same<gray32f_type, float>::value)); typedef gil::base_channel_type<gil::channel_type<gil::rgb8_pixel_t>::type>::type rgb8_type; BOOST_STATIC_ASSERT((boost::is_same<rgb8_type, boost::uint8_t>::value)); int main() {} /////////END CODE///////////////// Adding the metafunction and using it to cast values prior to channel construction has removed the warnings from my testing. The diff file also contains changes to channel_algorithm.hpp to suppress warnings using the supplied metafunction. I'd be happy to write additional test cases, trac tickets, etc. The changes have been tested with g++3.4, g++4.3 and VC8 (VS2005). Thanks, Nate [1] <http://lists.boost.org/boost-users/2010/06/60066.php> [2] <http://lists.boost.org/Archives/boost/2010/07/169159.php>