16 #ifndef BOOST_GIL_PROMOTE_INTEGRAL_HPP
17 #define BOOST_GIL_PROMOTE_INTEGRAL_HPP
21 #include <type_traits>
23 #include <boost/mpl/begin.hpp>
24 #include <boost/mpl/deref.hpp>
25 #include <boost/mpl/end.hpp>
26 #include <boost/mpl/list.hpp>
27 #include <boost/mpl/next.hpp>
29 namespace boost {
namespace gil
32 namespace detail {
namespace promote_integral
39 bool IsFundamental = std::is_fundamental<T>::type::value
45 struct bit_size<T, true> : std::integral_constant<std::size_t, (CHAR_BIT * sizeof(T))> {};
54 struct promote_to_larger
56 typedef typename boost::mpl::deref<Iterator>::type current_type;
58 typedef typename std::conditional
60 (bit_size<current_type>::type::value >= MinSize),
62 typename promote_to_larger
65 typename boost::mpl::next<Iterator>::type,
74 template <
typename T,
typename EndIterator, std::
size_t MinSize>
75 struct promote_to_larger<T, EndIterator, EndIterator, MinSize>
119 bool PromoteUnsignedToUnsigned =
false,
120 bool UseCheckedInteger =
false,
121 bool IsIntegral = std::is_integral<T>::type::value
126 static bool const is_unsigned = std::is_unsigned<T>::type::value;
128 typedef detail::promote_integral::bit_size<T> bit_size_type;
137 typedef typename std::conditional
139 (PromoteUnsignedToUnsigned && is_unsigned),
140 std::integral_constant<std::size_t, (2 * bit_size_type::value)>,
141 typename std::conditional
144 std::integral_constant<std::size_t, (2 * bit_size_type::value + 1)>,
145 std::integral_constant<std::size_t, (2 * bit_size_type::value - 1)>
147 >::type min_bit_size_type;
151 typedef boost::mpl::list
154 #if defined(BOOST_HAS_LONG_LONG)
155 , boost::long_long_type
157 > signed_integral_types;
161 typedef boost::mpl::list
163 unsigned short,
unsigned int,
unsigned long, std::size_t
164 #if defined(BOOST_HAS_LONG_LONG)
165 , boost::ulong_long_type
167 > unsigned_integral_types;
172 typedef typename std::conditional
174 (is_unsigned && PromoteUnsignedToUnsigned),
175 unsigned_integral_types,
176 signed_integral_types
177 >::type integral_types;
180 typedef typename detail::promote_integral::promote_to_larger
183 typename boost::mpl::begin<integral_types>::type,
184 typename boost::mpl::end<integral_types>::type,
185 min_bit_size_type::value
190 template <
typename T,
bool PromoteUn
signedToUn
signed,
bool UseCheckedInteger>
193 T, PromoteUnsignedToUnsigned, UseCheckedInteger, false
202 #endif // BOOST_GIL_PROMOTE_INTEGRAL_HPP