/*============================================================================= Copyright (c) 2011-2015 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #ifndef SPROUT_CSTDLIB_DECIMAL_TO_INT_HPP #define SPROUT_CSTDLIB_DECIMAL_TO_INT_HPP #include #include #include #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(NullTerminatedIterator str, IntType val, bool negative) { typedef typename std::iterator_traits::value_type value_type; SPROUT_STATIC_ASSERT(sprout::detail::is_char_type_of_consecutive_digits::value); return !sprout::ascii::isdigit(*str) ? negative ? -val : val : val > (sprout::numeric_limits::max() - (*str - SPROUT_CHAR_LITERAL('0', value_type)) - (negative ? 1 : 0)) / 10 ? (negative ? sprout::numeric_limits::min() : sprout::numeric_limits::max()) : sprout::detail::ascii_to_int_impl( sprout::next(str), val * 10 + (*str - SPROUT_CHAR_LITERAL('0', value_type)), negative ) ; } template inline SPROUT_CONSTEXPR typename std::enable_if< sprout::is_unsigned::value, IntType >::type ascii_to_int(NullTerminatedIterator str) { typedef typename std::iterator_traits::value_type value_type; return sprout::ascii::isspace(*str) ? sprout::detail::ascii_to_int(sprout::next(str)) : *str == SPROUT_CHAR_LITERAL('+', 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< sprout::is_signed::value, IntType >::type ascii_to_int(NullTerminatedIterator str) { typedef typename std::iterator_traits::value_type value_type; return sprout::ascii::isspace(*str) ? sprout::detail::ascii_to_int(sprout::next(str)) : *str == SPROUT_CHAR_LITERAL('-', value_type) ? sprout::detail::ascii_to_int_impl(sprout::next(str), IntType(), true) : *str == SPROUT_CHAR_LITERAL('+', 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