/*============================================================================= Copyright (c) 2011-2014 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 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) { return !sprout::ascii::isdigit(*str) ? negative ? -val : val : val > (sprout::numeric_limits::max() - (*str - static_cast::value_type>('0')) - (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 - static_cast::value_type>('0')), negative ) ; } template inline SPROUT_CONSTEXPR typename std::enable_if< std::is_unsigned::value, IntType >::type ascii_to_int(NullTerminatedIterator 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(NullTerminatedIterator 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