19 #ifndef BOOST_GIL_PROMOTE_INTEGRAL_HPP 20 #define BOOST_GIL_PROMOTE_INTEGRAL_HPP 22 #include <boost/mp11/list.hpp> 26 #include <type_traits> 28 namespace boost {
namespace gil
31 namespace detail {
namespace promote_integral
38 bool IsFundamental = std::is_fundamental<T>::value
44 struct bit_size<T, true> : std::integral_constant<std::size_t, (CHAR_BIT * sizeof(T))> {};
49 typename IntegralTypes,
52 struct promote_to_larger
54 using current_type = boost::mp11::mp_first<IntegralTypes>;
55 using list_after_front = boost::mp11::mp_rest<IntegralTypes>;
57 using type =
typename std::conditional
59 (bit_size<current_type>::value >= MinSize),
61 typename promote_to_larger
72 template <
typename T, std::
size_t MinSize>
73 struct promote_to_larger<T, boost::mp11::mp_list<>, MinSize>
117 bool PromoteUnsignedToUnsigned =
false,
118 bool UseCheckedInteger =
false,
119 bool IsIntegral = std::is_integral<T>::value
124 static bool const is_unsigned = std::is_unsigned<T>::value;
126 using bit_size_type = detail::promote_integral::bit_size<T>;
135 using min_bit_size_type =
typename std::conditional
137 (PromoteUnsignedToUnsigned && is_unsigned),
138 std::integral_constant<std::size_t, (2 * bit_size_type::value)>,
139 typename std::conditional
142 std::integral_constant<std::size_t, (2 * bit_size_type::value + 1)>,
143 std::integral_constant<std::size_t, (2 * bit_size_type::value - 1)>
149 using signed_integral_types = boost::mp11::mp_list
152 #if defined(BOOST_HAS_LONG_LONG) 153 , boost::long_long_type
159 using unsigned_integral_types = boost::mp11::mp_list
161 unsigned short,
unsigned int,
unsigned long, std::size_t
162 #if defined(BOOST_HAS_LONG_LONG) 163 , boost::ulong_long_type
170 using integral_types =
typename std::conditional
172 (is_unsigned && PromoteUnsignedToUnsigned),
173 unsigned_integral_types,
174 signed_integral_types
178 using type =
typename detail::promote_integral::promote_to_larger
182 min_bit_size_type::value
187 template <
typename T,
bool PromoteUn
signedToUn
signed,
bool UseCheckedInteger>
190 T, PromoteUnsignedToUnsigned, UseCheckedInteger, false
199 #endif // BOOST_GIL_PROMOTE_INTEGRAL_HPP