This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[Prelim patch] Speed up ints parsing
- From: Paolo Carlini <pcarlini at suse dot de>
- To: libstdc++ <libstdc++ at gcc dot gnu dot org>
- Date: Fri, 05 Dec 2003 23:57:47 +0100
- Subject: [Prelim patch] Speed up ints parsing
Hi,
you find attached to this message what I have ready, in case
someone wants to play with it: I plan to refine it and post
a final version during the weekend or at most on monday.
The testsuite is ok, some more tests are ok, and the performance
are pretty good. Reading back a file containing 3000000 ints
(from 0 to 2999999) via:
int j;
for (int i = 0; i < 3000000; i++)
std::cin >> j;
takes, on my P4-2400 (-O2):
3.4
---
18.740u 0.030s 0:19.59 95.8% 0+0k 0+0io 208pf+0w
3.4 + this patch
----------------
9.940u 0.030s 0:10.40 95.8% 0+0k 0+0io 197pf+0w
So, almost a 2x speed gain (besides the major code clean up!)
Ciao for now,
Paolo.
/////////////
diff -prN libstdc++-v3-orig/config/locale/generic/c_locale.cc libstdc++-v3/config/locale/generic/c_locale.cc
*** libstdc++-v3-orig/config/locale/generic/c_locale.cc Wed Oct 29 14:34:04 2003
--- libstdc++-v3/config/locale/generic/c_locale.cc Fri Dec 5 17:36:50 2003
*************** namespace std
*** 47,122 ****
// Specializations for all types used in num_get.
template<>
void
- __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err,
- const __c_locale&, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- long __l = strtol(__s, &__sanity, __base);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __l;
- else
- __err |= ios_base::failbit;
- }
- }
-
- template<>
- void
- __convert_to_v(const char* __s, unsigned long& __v,
- ios_base::iostate& __err, const __c_locale&, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- unsigned long __ul = strtoul(__s, &__sanity, __base);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ul;
- else
- __err |= ios_base::failbit;
- }
- }
-
- #ifdef _GLIBCXX_USE_LONG_LONG
- template<>
- void
- __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err,
- const __c_locale&, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- long long __ll = strtoll(__s, &__sanity, __base);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ll;
- else
- __err |= ios_base::failbit;
- }
- }
-
- template<>
- void
- __convert_to_v(const char* __s, unsigned long long& __v,
- ios_base::iostate& __err, const __c_locale&, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- unsigned long long __ull = strtoull(__s, &__sanity, __base);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ull;
- else
- __err |= ios_base::failbit;
- }
- }
- #endif
-
- template<>
- void
__convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
const __c_locale&, int)
{
--- 47,52 ----
diff -prN libstdc++-v3-orig/config/locale/gnu/c_locale.cc libstdc++-v3/config/locale/gnu/c_locale.cc
*** libstdc++-v3-orig/config/locale/gnu/c_locale.cc Wed Oct 29 11:08:01 2003
--- libstdc++-v3/config/locale/gnu/c_locale.cc Fri Dec 5 17:36:20 2003
*************** namespace std
*** 43,121 ****
{
template<>
void
- __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err,
- const __c_locale& __cloc, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- long __l = __strtol_l(__s, &__sanity, __base, __cloc);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __l;
- else
- __err |= ios_base::failbit;
- }
- }
-
- template<>
- void
- __convert_to_v(const char* __s, unsigned long& __v,
- ios_base::iostate& __err, const __c_locale& __cloc,
- int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ul;
- else
- __err |= ios_base::failbit;
- }
- }
-
- #ifdef _GLIBCXX_USE_LONG_LONG
- template<>
- void
- __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err,
- const __c_locale& __cloc, int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ll;
- else
- __err |= ios_base::failbit;
- }
- }
-
- template<>
- void
- __convert_to_v(const char* __s, unsigned long long& __v,
- ios_base::iostate& __err, const __c_locale& __cloc,
- int __base)
- {
- if (!(__err & ios_base::failbit))
- {
- char* __sanity;
- errno = 0;
- unsigned long long __ull = __strtoull_l(__s, &__sanity, __base,
- __cloc);
- if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
- __v = __ull;
- else
- __err |= ios_base::failbit;
- }
- }
- #endif
-
- template<>
- void
__convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
const __c_locale& __cloc, int)
{
--- 43,48 ----
diff -prN libstdc++-v3-orig/include/bits/locale_facets.h libstdc++-v3/include/bits/locale_facets.h
*** libstdc++-v3-orig/include/bits/locale_facets.h Wed Nov 26 12:47:01 2003
--- libstdc++-v3/include/bits/locale_facets.h Fri Dec 5 18:21:31 2003
*************** namespace std
*** 68,95 ****
// Explicit specializations for required types.
template<>
void
- __convert_to_v(const char*, long&, ios_base::iostate&,
- const __c_locale&, int);
-
- template<>
- void
- __convert_to_v(const char*, unsigned long&, ios_base::iostate&,
- const __c_locale&, int);
-
- #ifdef _GLIBCXX_USE_LONG_LONG
- template<>
- void
- __convert_to_v(const char*, long long&, ios_base::iostate&,
- const __c_locale&, int);
-
- template<>
- void
- __convert_to_v(const char*, unsigned long long&, ios_base::iostate&,
- const __c_locale&, int);
- #endif
-
- template<>
- void
__convert_to_v(const char*, float&, ios_base::iostate&,
const __c_locale&, int);
--- 68,73 ----
*************** namespace std
*** 586,592 ****
static const char* _S_atoms_out;
// String literal of acceptable (narrow) input, for num_get.
! // "-+xX0123456789eEabcdfABCDF"
static const char* _S_atoms_in;
enum
--- 564,570 ----
static const char* _S_atoms_out;
// String literal of acceptable (narrow) input, for num_get.
! // "-+xX0123456789abcdefABCDEF"
static const char* _S_atoms_in;
enum
*************** namespace std
*** 596,603 ****
_S_ix,
_S_iX,
_S_izero,
! _S_ie = _S_izero + 10,
! _S_iE = _S_izero + 11,
_S_iend = 26
};
--- 574,581 ----
_S_ix,
_S_iX,
_S_izero,
! _S_ie = _S_izero + 14,
! _S_iE = _S_izero + 20,
_S_iend = 26
};
*************** namespace std
*** 893,901 ****
_M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
string& __xtrc) const;
! iter_type
! _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
! string& __xtrc, int& __base) const;
virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
--- 871,880 ----
_M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
string& __xtrc) const;
! template<typename _ValueT>
! iter_type
! _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
! _ValueT& __v) const;
virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
diff -prN libstdc++-v3-orig/include/bits/locale_facets.tcc libstdc++-v3/include/bits/locale_facets.tcc
*** libstdc++-v3-orig/include/bits/locale_facets.tcc Wed Dec 3 10:17:20 2003
--- libstdc++-v3/include/bits/locale_facets.tcc Fri Dec 5 22:57:04 2003
*************** namespace std
*** 258,401 ****
}
template<typename _CharT, typename _InIter>
! _InIter
! num_get<_CharT, _InIter>::
! _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
! ios_base::iostate& __err, string& __xtrc, int& __base) const
! {
! typedef char_traits<_CharT> __traits_type;
! typedef typename numpunct<_CharT>::__cache_type __cache_type;
! __use_cache<__cache_type> __uc;
! const locale& __loc = __io._M_getloc();
! const __cache_type* __lc = __uc(__loc);
! const _CharT* __lit = __lc->_M_atoms_in;
!
! // NB: Iff __basefield == 0, this can change based on contents.
! const ios_base::fmtflags __basefield = __io.flags() & ios_base::basefield;
! if (__basefield == ios_base::oct)
! __base = 8;
! else if (__basefield == ios_base::hex)
! __base = 16;
! else
! __base = 10;
! // First check for sign.
! if (__beg != __end)
! {
! const char_type __c = *__beg;
! const bool __plus = __traits_type::eq(__c, __lit[_S_iplus]);
! if (__plus || __traits_type::eq(__c, __lit[_S_iminus]))
! {
! __xtrc += __plus ? _S_atoms_in[_S_iplus]
! : _S_atoms_in[_S_iminus];
! ++__beg;
! }
! }
! // Next, look for leading zeros and check required digits for base formats.
! if (__builtin_expect(__base == 10, true))
! {
! // Look for a zero...
! if (__beg != __end && __traits_type::eq(*__beg, __lit[_S_izero]))
! {
! __xtrc += _S_atoms_in[_S_izero];
++__beg;
! // ... and skip the additional ones.
! for (; __beg != __end
! && __traits_type::eq(*__beg, __lit[_S_izero]); ++__beg);
!
! // Check required digits.
! if (__beg != __end && __basefield == 0)
! {
! const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
! if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
{
! __xtrc += __x ? _S_atoms_in[_S_ix]
! : _S_atoms_in[_S_iX];
! __base = 16;
! ++__beg;
}
! else
! __base = 8;
! }
}
! }
! else if (__base == 16)
! {
! if (__beg != __end && __traits_type::eq(*__beg, __lit[_S_izero]))
{
! __xtrc += _S_atoms_in[_S_izero];
!
! if (++__beg != __end)
{
! const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
! if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
{
! __xtrc += __x ? _S_atoms_in[_S_ix]
! : _S_atoms_in[_S_iX];
! ++__beg;
}
}
! }
! }
!
! // At this point, base is determined. If not hex, only allow
! // base digits as valid input.
! const size_t __len = __base == 16 ? _S_iend : __base;
!
! // Extract.
! string __found_grouping;
! int __sep_pos = 0;
! for (; __beg != __end; ++__beg)
! {
! const char_type __c = *__beg;
! const char_type* __p = __traits_type::find(__lit + _S_izero,
! __len, __c);
! if (__p)
! {
! // Try first for acceptable digit; record it if found.
! __xtrc += _S_atoms_in[__p - __lit];
! ++__sep_pos;
! }
! else if (__traits_type::eq(__c, __lc->_M_thousands_sep)
! && __lc->_M_use_grouping)
! {
! // NB: Thousands separator at the beginning of a string
! // is a no-no, as is two consecutive thousands separators.
! if (__sep_pos)
! {
! __found_grouping += static_cast<char>(__sep_pos);
! __sep_pos = 0;
! }
! else
{
! __err |= ios_base::failbit;
! break;
}
! }
! else
! // Not a valid input item.
! break;
! }
! // Digit grouping is checked. If grouping and found_grouping don't
! // match, then get very very upset, and set failbit.
! if (__lc->_M_use_grouping && __found_grouping.size())
! {
! // Add the ending grouping.
! __found_grouping += static_cast<char>(__sep_pos);
! const string __grouping = __lc->_M_grouping;
! if (!std::__verify_grouping(__grouping, __found_grouping))
! __err |= ios_base::failbit;
! }
! // Finish up.
! __xtrc += char();
! if (__beg == __end)
! __err |= ios_base::eofbit;
! return __beg;
! }
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 17. Bad bool parsing
--- 258,453 ----
}
template<typename _CharT, typename _InIter>
! template<typename _ValueT>
! _InIter
! num_get<_CharT, _InIter>::
! _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
! ios_base::iostate& __err, _ValueT& __v) const
! {
! typedef char_traits<_CharT> __traits_type;
! typedef typename numpunct<_CharT>::__cache_type __cache_type;
! __use_cache<__cache_type> __uc;
! const locale& __loc = __io._M_getloc();
! const __cache_type* __lc = __uc(__loc);
! const _CharT* __lit = __lc->_M_atoms_in;
! // NB: Iff __basefield == 0, this can change based on contents.
! int __base;
! const ios_base::fmtflags __basefield = __io.flags() & ios_base::basefield;
! if (__basefield == ios_base::oct)
! __base = 8;
! else if (__basefield == ios_base::hex)
! __base = 16;
! else
! __base = 10;
! // True if a number is actually found.
! bool __found_num = false;
!
! // First check for sign.
! bool __neg = false;
! if (__beg != __end && numeric_limits<_ValueT>::is_signed)
! {
! __neg = __traits_type::eq(*__beg, __lit[_S_iminus]);
! if (__neg || __traits_type::eq(*__beg, __lit[_S_iplus]))
++__beg;
! }
!
! // Next, look for leading zeros and check required digits
! // for base formats.
! if (__beg != __end && __traits_type::eq(*__beg, __lit[_S_izero]))
! {
! __found_num = true;
! if (__builtin_expect(__base == 10, true))
! {
! ++__beg;
! // Skip the additional zeros.
! for (; __beg != __end
! && __traits_type::eq(*__beg, __lit[_S_izero]); ++__beg);
!
! // Check required digits.
! if (__beg != __end && __basefield == 0)
! {
! const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
! if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
! {
! __base = 16;
! ++__beg;
! }
! else
! __base = 8;
! }
! }
! else if (__base == 16)
! {
! if (++__beg != __end)
! {
! const bool __x = __traits_type::eq(*__beg, __lit[_S_ix]);
! if (__x || __traits_type::eq(*__beg, __lit[_S_iX]))
! ++__beg;
! }
! }
! }
!
! // At this point, base is determined. If not hex, only allow
! // base digits as valid input.
! const size_t __len = __base == 16 ? _S_iend : __base;
!
! // Extract.
! string __found_grouping;
! int __sep_pos = 0;
! const char_type* __lit_zero = __lit + _S_izero;
! bool __overflow = false;
! const _ValueT __limit = __neg ? numeric_limits<_ValueT>::min() / __base
! : numeric_limits<_ValueT>::max() / __base;
! _ValueT __result = 0;
! if (__neg)
! for (; __beg != __end; ++__beg)
! {
! const char_type* __p = __traits_type::find(__lit_zero,
! __len, *__beg);
! if (__p)
! {
! int __digit = __p - __lit_zero;
! if (__digit > 15)
! __digit -= 6;
! if (__result < __limit)
! __overflow = true;
! else
{
! const _ValueT __new_result = __result * __base - __digit;
! if (__result)
! __overflow |= __new_result >= __result;
! __result = __new_result;
}
! ++__sep_pos;
! __found_num = true;
! }
! else if (__lc->_M_use_grouping
! && __traits_type::eq(*__beg, __lc->_M_thousands_sep))
! {
! // NB: Thousands separator at the beginning of a string
! // is a no-no, as is two consecutive thousands separators.
! if (__sep_pos)
! {
! __found_grouping += static_cast<char>(__sep_pos);
! __sep_pos = 0;
! }
! else
! {
! __err |= ios_base::failbit;
! break;
! }
! }
! else
! // Not a valid input item.
! break;
}
! else
! for (; __beg != __end; ++__beg)
{
! const char_type* __p = __traits_type::find(__lit_zero,
! __len, *__beg);
! if (__p)
{
! int __digit = __p - __lit_zero;
! if (__digit > 15)
! __digit -= 6;
! if (__result > __limit)
! __overflow = true;
! else
{
! const _ValueT __new_result = __result * __base + __digit;
! if (__result)
! __overflow |= __new_result <= __result;
! __result = __new_result;
}
+ ++__sep_pos;
+ __found_num = true;
}
! else if (__lc->_M_use_grouping
! && __traits_type::eq(*__beg, __lc->_M_thousands_sep))
{
! // NB: Thousands separator at the beginning of a string
! // is a no-no, as is two consecutive thousands separators.
! if (__sep_pos)
! {
! __found_grouping += static_cast<char>(__sep_pos);
! __sep_pos = 0;
! }
! else
! {
! __err |= ios_base::failbit;
! break;
! }
}
! else
! // Not a valid input item.
! break;
! }
! // Digit grouping is checked. If grouping and found_grouping don't
! // match, then get very very upset, and set failbit.
! if (__lc->_M_use_grouping && __found_grouping.size())
! {
! // Add the ending grouping.
! __found_grouping += static_cast<char>(__sep_pos);
!
! const string __grouping = __lc->_M_grouping;
! if (!std::__verify_grouping(__grouping, __found_grouping))
! __err |= ios_base::failbit;
! }
! if (!(__err & ios_base::failbit)
! && !__overflow && __found_num)
! __v = __result;
! else
! __err |= ios_base::failbit;
! if (__beg == __end)
! __err |= ios_base::eofbit;
! return __beg;
! }
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 17. Bad bool parsing
*************** namespace std
*** 411,432 ****
// NB: We can't just call do_get(long) here, as it might
// refer to a derived class.
string __xtrc;
! int __base;
! __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
!
! unsigned long __ul;
! std::__convert_to_v(__xtrc.c_str(), __ul, __err,
! _S_get_c_locale(), __base);
! if (!(__err & ios_base::failbit) && __ul <= 1)
! __v = __ul;
! else
__err |= ios_base::failbit;
}
else
{
// Parse bool values as alphanumeric.
! typedef char_traits<_CharT> __traits_type;
! typedef typename numpunct<_CharT>::__cache_type __cache_type;
__use_cache<__cache_type> __uc;
const locale& __loc = __io._M_getloc();
const __cache_type* __lc = __uc(__loc);
--- 463,480 ----
// NB: We can't just call do_get(long) here, as it might
// refer to a derived class.
string __xtrc;
! long __l = -1;
! __beg = _M_extract_int(__beg, __end, __io, __err, __l);
! if (__l == 0 || __l == 1)
! __v = __l;
! else
__err |= ios_base::failbit;
}
else
{
// Parse bool values as alphanumeric.
! typedef char_traits<_CharT> __traits_type;
! typedef typename numpunct<_CharT>::__cache_type __cache_type;
__use_cache<__cache_type> __uc;
const locale& __loc = __io._M_getloc();
const __cache_type* __lc = __uc(__loc);
*************** namespace std
*** 473,540 ****
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, long& __v) const
! {
! string __xtrc;
! int __base;
! __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
! std::__convert_to_v(__xtrc.c_str(), __v, __err,
! _S_get_c_locale(), __base);
! return __beg;
! }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned short& __v) const
! {
! string __xtrc;
! int __base;
! __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
! unsigned long __ul;
! std::__convert_to_v(__xtrc.c_str(), __ul, __err,
! _S_get_c_locale(), __base);
! if (!(__err & ios_base::failbit)
! && __ul <= numeric_limits<unsigned short>::max())
! __v = static_cast<unsigned short>(__ul);
! else
! __err |= ios_base::failbit;
! return __beg;
! }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned int& __v) const
! {
! string __xtrc;
! int __base;
! __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
! unsigned long __ul;
! std::__convert_to_v(__xtrc.c_str(), __ul, __err,
! _S_get_c_locale(), __base);
! if (!(__err & ios_base::failbit)
! && __ul <= numeric_limits<unsigned int>::max())
! __v = static_cast<unsigned int>(__ul);
! else
! __err |= ios_base::failbit;
! return __beg;
! }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned long& __v) const
! {
! string __xtrc;
! int __base;
! __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
! std::__convert_to_v(__xtrc.c_str(), __v, __err,
! _S_get_c_locale(), __base);
! return __beg;
! }
#ifdef _GLIBCXX_USE_LONG_LONG
template<typename _CharT, typename _InIter>
--- 521,548 ----
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, long& __v) const
! { return _M_extract_int(__beg, __end, __io, __err, __v); }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned short& __v) const
! { return _M_extract_int(__beg, __end, __io, __err, __v); }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned int& __v) const
! { return _M_extract_int(__beg, __end, __io, __err, __v); }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned long& __v) const
! { return _M_extract_int(__beg, __end, __io, __err, __v); }
#ifdef _GLIBCXX_USE_LONG_LONG
template<typename _CharT, typename _InIter>
*************** namespace std
*** 542,569 ****
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, long long& __v) const
! {
! string __xtrc;
! int __base;
! __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
! std::__convert_to_v(__xtrc.c_str(), __v, __err,
! _S_get_c_locale(), __base);
! return __beg;
! }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned long long& __v) const
! {
! string __xtrc;
! int __base;
! __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
! std::__convert_to_v(__xtrc.c_str(), __v, __err,
! _S_get_c_locale(), __base);
! return __beg;
! }
#endif
template<typename _CharT, typename _InIter>
--- 550,563 ----
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, long long& __v) const
! { return _M_extract_int(__beg, __end, __io, __err, __v); }
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, unsigned long long& __v) const
! { return _M_extract_int(__beg, __end, __io, __err, __v); }
#endif
template<typename _CharT, typename _InIter>
*************** namespace std
*** 619,634 ****
| ios_base::uppercase | ios_base::internal);
__io.flags(__fmt & __fmtmask | (ios_base::hex | ios_base::showbase));
! string __xtrc;
! int __base;
! __beg = _M_extract_int(__beg, __end, __io, __err, __xtrc, __base);
// Reset from hex formatted input.
__io.flags(__fmt);
- unsigned long __ul;
- std::__convert_to_v(__xtrc.c_str(), __ul, __err,
- _S_get_c_locale(), __base);
if (!(__err & ios_base::failbit))
__v = reinterpret_cast<void*>(__ul);
else
--- 613,624 ----
| ios_base::uppercase | ios_base::internal);
__io.flags(__fmt & __fmtmask | (ios_base::hex | ios_base::showbase));
! unsigned long __ul;
! __beg = _M_extract_int(__beg, __end, __io, __err, __ul);
// Reset from hex formatted input.
__io.flags(__fmt);
if (!(__err & ios_base::failbit))
__v = reinterpret_cast<void*>(__ul);
else
diff -prN libstdc++-v3-orig/src/locale-inst.cc libstdc++-v3/src/locale-inst.cc
*** libstdc++-v3-orig/src/locale-inst.cc Mon Oct 27 17:21:13 2003
--- libstdc++-v3/src/locale-inst.cc Fri Dec 5 18:46:42 2003
*************** namespace std
*** 56,61 ****
--- 56,105 ----
template class num_get<C, istreambuf_iterator<C> >;
template class num_put<C, ostreambuf_iterator<C> >;
template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ unsigned short&) const;
+
+ template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ unsigned int&) const;
+
+ template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ long&) const;
+
+ template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ unsigned long&) const;
+
+ #ifdef _GLIBCXX_USE_LONG_LONG
+ template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ long long&) const;
+
+ template
+ istreambuf_iterator<C>
+ num_get<C, istreambuf_iterator<C> >::
+ _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>,
+ ios_base&, ios_base::iostate&,
+ unsigned long long&) const;
+ #endif
+
+ template
ostreambuf_iterator<C>
num_put<C, ostreambuf_iterator<C> >::
_M_insert_int(ostreambuf_iterator<C>, ios_base&, C,
diff -prN libstdc++-v3-orig/src/locale_facets.cc libstdc++-v3/src/locale_facets.cc
*** libstdc++-v3-orig/src/locale_facets.cc Fri Oct 17 16:47:30 2003
--- libstdc++-v3/src/locale_facets.cc Fri Dec 5 10:47:28 2003
*************** namespace std
*** 53,59 ****
const money_base::pattern
money_base::_S_default_pattern = { {symbol, sign, none, value} };
! const char* __num_base::_S_atoms_in = "-+xX0123456789eEabcdfABCDF";
const char* __num_base::_S_atoms_out ="-+xX0123456789abcdef0123456789ABCDEF";
// _GLIBCXX_RESOLVE_LIB_DEFECTS
--- 53,59 ----
const money_base::pattern
money_base::_S_default_pattern = { {symbol, sign, none, value} };
! const char* __num_base::_S_atoms_in = "-+xX0123456789abcdefABCDEF";
const char* __num_base::_S_atoms_out ="-+xX0123456789abcdef0123456789ABCDEF";
// _GLIBCXX_RESOLVE_LIB_DEFECTS