#ifndef SPROUT_CSTDLIB_DECIMAL_TO_INT_HPP #define SPROUT_CSTDLIB_DECIMAL_TO_INT_HPP #include #include #include #include #include #include namespace sprout { namespace detail { // Copyright (c) 2011 osyo-manga : http://d.hatena.ne.jp/osyo-manga/ template inline SPROUT_CONSTEXPR IntType ascii_to_int_impl(CStrIterator str, IntType val, bool negative) { return !sprout::ascii::isdigit(*str) ? negative ? -val : val : val > (std::numeric_limits::max() - (*str - static_cast::value_type>('0')) - (negative ? 1 : 0)) / 10 ? (negative ? std::numeric_limits::min() : std::numeric_limits::max()) : sprout::detail::ascii_to_int_impl( sprout::next(str), val * 10 + (*str - static_cast::value_type>('0')), negative ) ; } template inline SPROUT_CONSTEXPR typename std::enable_if< std::is_unsigned::value, IntType >::type ascii_to_int(CStrIterator str) { return sprout::ascii::isspace(*str) ? sprout::detail::ascii_to_int(sprout::next(str)) : *str == static_cast::value_type>('+') ? sprout::detail::ascii_to_int_impl(sprout::next(str), IntType(), false) : sprout::detail::ascii_to_int_impl(str, IntType(), false) ; } template inline SPROUT_CONSTEXPR typename std::enable_if< std::is_signed::value, IntType >::type ascii_to_int(CStrIterator str) { return sprout::ascii::isspace(*str) ? sprout::detail::ascii_to_int(sprout::next(str)) : *str == static_cast::value_type>('-') ? sprout::detail::ascii_to_int_impl(sprout::next(str), IntType(), true) : *str == static_cast::value_type>('+') ? sprout::detail::ascii_to_int_impl(sprout::next(str), IntType(), false) : sprout::detail::ascii_to_int_impl(str, IntType(), false) ; } } // namespace detail // // ascii_to_int // template inline SPROUT_CONSTEXPR typename std::enable_if< std::is_integral::value, IntType >::type ascii_to_int(Char const* str) { return sprout::detail::ascii_to_int(str); } } // namespace sprout #endif // #ifndef SPROUT_CSTDLIB_DECIMAL_TO_INT_HPP