#ifndef SPROUT_DETAIL_CHAR_CONVERSION_HPP #define SPROUT_DETAIL_CHAR_CONVERSION_HPP #include #include #include namespace sprout { namespace detail { template inline SPROUT_CONSTEXPR Elem int_to_char(IntType val, std::size_t base){ return val >= 0 && val < 10 ? static_cast('0') + val : val >= 10 && val < base ? static_cast('a') + (val - 10) : throw std::invalid_argument("value out of bounds") ; } template inline SPROUT_CONSTEXPR Elem int_to_char(IntType val){ return val >= 0 && val < 10 ? static_cast('0') + val : throw std::invalid_argument("value out of bounds") ; } template inline SPROUT_CONSTEXPR IntType char_to_int(Elem c, std::size_t base){ return c >= static_cast('0') && c <= static_cast('9') ? c - static_cast('0') : c >= static_cast('a') && c <= static_cast('a' + (base - 11)) ? c - static_cast('a') + 10 : c >= static_cast('A') && c <= static_cast('A' + (base - 11)) ? c - static_cast('A') + 10 : static_cast(-1) ; } template inline SPROUT_CONSTEXPR IntType char_to_int(Elem c){ return c >= static_cast('0') && c <= static_cast('9') ? c - static_cast('0') : static_cast(-1) ; } } // namespace detail } // namespace sprout #endif // #ifndef SPROUT_DETAIL_CHAR_CONVERSION_HPP