locale_facets.h (ctype<_CharT>): Add definitions for generic ctype virtuals.

2001-06-04  Brendan Kehoe  <brendan@zen.org>
	    Benjamin Kosnik  <bkoz@redhat.com>

	libstdc++/3017
	* include/bits/locale_facets.h (ctype<_CharT>): Add definitions
	for generic ctype virtuals.
	* src/locale.cc: Minor tweaks, naming consistency.
	* testsuite/22_locale/ctype.cc: Add test.

From-SVN: r42872
This commit is contained in:
Benjamin Kosnik 2001-06-04 19:25:41 +00:00
parent 4aef4f331f
commit fdf1b60d2b
4 changed files with 136 additions and 71 deletions

View File

@ -1,3 +1,12 @@
2001-06-04 Brendan Kehoe <brendan@zen.org>
Benjamin Kosnik <bkoz@redhat.com>
libstdc++/3017
* include/bits/locale_facets.h (ctype<_CharT>): Add definitions
for generic ctype virtuals.
* src/locale.cc: Minor tweaks, naming consistency.
* testsuite/22_locale/ctype.cc: Add test.
2001-06-04 Kenny Simpson <theonetruekenny@yahoo.com> 2001-06-04 Kenny Simpson <theonetruekenny@yahoo.com>
Phil Edwards <pme@sources.redhat.com> Phil Edwards <pme@sources.redhat.com>
@ -57,7 +66,7 @@
make isn't found. make isn't found.
* configure: Regenerate. * configure: Regenerate.
2001-05-27 scott snyder <snyder@fnal.gov> 2001-05-31 scott snyder <snyder@fnal.gov>
libstdc++/2976 libstdc++/2976
* include/bits/istream.tcc: Include std_ostream.h. * include/bits/istream.tcc: Include std_ostream.h.

View File

@ -81,33 +81,33 @@ namespace std
{ return this->do_toupper(__c); } { return this->do_toupper(__c); }
const char_type* const char_type*
toupper(char_type *__low, const char_type* __high) const toupper(char_type *__lo, const char_type* __hi) const
{ return this->do_toupper(__low, __high); } { return this->do_toupper(__lo, __hi); }
char_type char_type
tolower(char_type __c) const tolower(char_type __c) const
{ return this->do_tolower(__c); } { return this->do_tolower(__c); }
const char_type* const char_type*
tolower(char_type* __low, const char_type* __high) const tolower(char_type* __lo, const char_type* __hi) const
{ return this->do_tolower(__low, __high); } { return this->do_tolower(__lo, __hi); }
char_type char_type
widen(char __c) const widen(char __c) const
{ return this->do_widen(__c); } { return this->do_widen(__c); }
const char* const char*
widen(const char* __low, const char* __high, char_type* __to) const widen(const char* __lo, const char* __hi, char_type* __to) const
{ return this->do_widen(__low, __high, __to); } { return this->do_widen(__lo, __hi, __to); }
char char
narrow(char_type __c, char __dfault) const narrow(char_type __c, char __dfault) const
{ return this->do_narrow(__c, __dfault); } { return this->do_narrow(__c, __dfault); }
const char_type* const char_type*
narrow(const char_type* __low, const char_type* __high, narrow(const char_type* __lo, const char_type* __hi,
char __dfault, char *__to) const char __dfault, char *__to) const
{ return this->do_narrow(__low, __high, __dfault, __to); } { return this->do_narrow(__lo, __hi, __dfault, __to); }
protected: protected:
explicit explicit
@ -124,7 +124,7 @@ namespace std
mask* __vec) const = 0; mask* __vec) const = 0;
virtual const char_type* virtual const char_type*
do_scan_is(mask __m, const char_type* __lo, do_scan_is(mask __m, const char_type* __lo,
const char_type* __hi) const = 0; const char_type* __hi) const = 0;
virtual const char_type* virtual const char_type*
@ -135,26 +135,26 @@ namespace std
do_toupper(char_type) const = 0; do_toupper(char_type) const = 0;
virtual const char_type* virtual const char_type*
do_toupper(char_type* __low, const char_type* __high) const = 0; do_toupper(char_type* __lo, const char_type* __hi) const = 0;
virtual char_type virtual char_type
do_tolower(char_type) const = 0; do_tolower(char_type) const = 0;
virtual const char_type* virtual const char_type*
do_tolower(char_type* __low, const char_type* __high) const = 0; do_tolower(char_type* __lo, const char_type* __hi) const = 0;
virtual char_type virtual char_type
do_widen(char) const = 0; do_widen(char) const = 0;
virtual const char* virtual const char*
do_widen(const char* __low, const char* __high, do_widen(const char* __lo, const char* __hi,
char_type* __dest) const = 0; char_type* __dest) const = 0;
virtual char virtual char
do_narrow(char_type, char __dfault) const = 0; do_narrow(char_type, char __dfault) const = 0;
virtual const char_type* virtual const char_type*
do_narrow(const char_type* __low, const char_type* __high, do_narrow(const char_type* __lo, const char_type* __hi,
char __dfault, char* __dest) const = 0; char __dfault, char* __dest) const = 0;
}; };
@ -175,6 +175,56 @@ namespace std
protected: protected:
virtual virtual
~ctype() { } ~ctype() { }
virtual bool
do_is(mask __m, char_type __c) const
{ return false; }
virtual const char_type*
do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const
{ return __hi; }
virtual const char_type*
do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
{ return __hi; }
virtual const char_type*
do_scan_not(mask __m, const char_type* __lo,
const char_type* __hi) const
{ return __hi; }
virtual char_type
do_toupper(char_type __c) const
{ return __c; }
virtual const char_type*
do_toupper(char_type* __lo, const char_type* __hi) const
{ return __hi; }
virtual char_type
do_tolower(char_type __c) const
{ return __c; }
virtual const char_type*
do_tolower(char_type* __lo, const char_type* __hi) const
{ return __hi; }
virtual char_type
do_widen(char __c) const
{ return char_type(); }
virtual const char*
do_widen(const char* __lo, const char* __hi, char_type* __dest) const
{ return __hi; }
virtual char
do_narrow(char_type, char __dfault) const
{ return __dfault; }
virtual const char_type*
do_narrow(const char_type* __lo, const char_type* __hi,
char __dfault, char* __dest) const
{ return __hi; }
}; };
template<typename _CharT> template<typename _CharT>
@ -207,13 +257,13 @@ namespace std
is(mask __m, char __c) const; is(mask __m, char __c) const;
inline const char* inline const char*
is(const char* __low, const char* __high, mask* __vec) const; is(const char* __lo, const char* __hi, mask* __vec) const;
inline const char* inline const char*
scan_is(mask __m, const char* __low, const char* __high) const; scan_is(mask __m, const char* __lo, const char* __hi) const;
inline const char* inline const char*
scan_not(mask __m, const char* __low, const char* __high) const; scan_not(mask __m, const char* __lo, const char* __hi) const;
protected: protected:
virtual virtual
@ -231,12 +281,10 @@ namespace std
do_is(mask __m, char_type __c) const; do_is(mask __m, char_type __c) const;
virtual const char_type* virtual const char_type*
do_is(const char_type* __lo, const char_type* __hi, do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
mask* __vec) const;
virtual const char_type* virtual const char_type*
do_scan_is(mask __m, const char_type* __lo, do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
const char_type* __hi) const;
virtual const char_type* virtual const char_type*
do_scan_not(mask __m, const char_type* __lo, do_scan_not(mask __m, const char_type* __lo,
@ -246,26 +294,25 @@ namespace std
do_toupper(char_type) const; do_toupper(char_type) const;
virtual const char_type* virtual const char_type*
do_toupper(char_type* __low, const char_type* __high) const; do_toupper(char_type* __lo, const char_type* __hi) const;
virtual char_type virtual char_type
do_tolower(char_type) const; do_tolower(char_type) const;
virtual const char_type* virtual const char_type*
do_tolower(char_type* __low, const char_type* __high) const; do_tolower(char_type* __lo, const char_type* __hi) const;
virtual char_type virtual char_type
do_widen(char) const; do_widen(char) const;
virtual const char* virtual const char*
do_widen(const char* __low, const char* __high, do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
char_type* __dest) const;
virtual char virtual char
do_narrow(char_type, char __dfault) const; do_narrow(char_type, char __dfault) const;
virtual const char_type* virtual const char_type*
do_narrow(const char_type* __low, const char_type* __high, do_narrow(const char_type* __lo, const char_type* __hi,
char __dfault, char* __dest) const; char __dfault, char* __dest) const;
}; };
@ -300,12 +347,10 @@ namespace std
do_is(mask __m, char_type __c) const; do_is(mask __m, char_type __c) const;
virtual const char_type* virtual const char_type*
do_is(const char_type* __lo, const char_type* __hi, do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
mask* __vec) const;
virtual const char_type* virtual const char_type*
do_scan_is(mask __m, const char_type* __lo, do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
const char_type* __hi) const;
virtual const char_type* virtual const char_type*
do_scan_not(mask __m, const char_type* __lo, do_scan_not(mask __m, const char_type* __lo,
@ -315,26 +360,25 @@ namespace std
do_toupper(char_type) const; do_toupper(char_type) const;
virtual const char_type* virtual const char_type*
do_toupper(char_type* __low, const char_type* __high) const; do_toupper(char_type* __lo, const char_type* __hi) const;
virtual char_type virtual char_type
do_tolower(char_type) const; do_tolower(char_type) const;
virtual const char_type* virtual const char_type*
do_tolower(char_type* __low, const char_type* __high) const; do_tolower(char_type* __lo, const char_type* __hi) const;
virtual char_type virtual char_type
do_widen(char) const; do_widen(char) const;
virtual const char* virtual const char*
do_widen(const char* __low, const char* __high, do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
char_type* __dest) const;
virtual char virtual char
do_narrow(char_type, char __dfault) const; do_narrow(char_type, char __dfault) const;
virtual const char_type* virtual const char_type*
do_narrow(const char_type* __low, const char_type* __high, do_narrow(const char_type* __lo, const char_type* __hi,
char __dfault, char* __dest) const; char __dfault, char* __dest) const;
}; };

View File

@ -583,11 +583,10 @@ namespace std
{ return __c; } { return __c; }
const char* const char*
ctype<char>::do_widen(const char* __low, const char* __high, ctype<char>::do_widen(const char* __lo, const char* __hi, char* __dest) const
char* __dest) const
{ {
memcpy(__dest, __low, __high - __low); memcpy(__dest, __lo, __hi - __lo);
return __high; return __hi;
} }
char char
@ -595,11 +594,11 @@ namespace std
{ return __c; } { return __c; }
const char* const char*
ctype<char>::do_narrow(const char* __low, const char* __high, ctype<char>::do_narrow(const char* __lo, const char* __hi,
char /*__dfault*/, char* __dest) const char /*__dfault*/, char* __dest) const
{ {
memcpy(__dest, __low, __high - __low); memcpy(__dest, __lo, __hi - __lo);
return __high; return __hi;
} }
ctype_byname<char>::ctype_byname(const char* /*__s*/, size_t __refs) ctype_byname<char>::ctype_byname(const char* /*__s*/, size_t __refs)
@ -1110,14 +1109,14 @@ namespace std
{ return towupper(__c); } { return towupper(__c); }
const wchar_t* const wchar_t*
ctype<wchar_t>::do_toupper(wchar_t* __low, const wchar_t* __high) const ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
{ {
while (__low < __high) while (__lo < __hi)
{ {
*__low = towupper(*__low); *__lo = towupper(*__lo);
++__low; ++__lo;
} }
return __high; return __hi;
} }
wchar_t wchar_t
@ -1125,14 +1124,14 @@ namespace std
{ return towlower(__c); } { return towlower(__c); }
const wchar_t* const wchar_t*
ctype<wchar_t>::do_tolower(wchar_t* __low, const wchar_t* __high) const ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
{ {
while (__low < __high) while (__lo < __hi)
{ {
*__low = towlower(*__low); *__lo = towlower(*__lo);
++__low; ++__lo;
} }
return __high; return __hi;
} }
bool bool
@ -1142,29 +1141,29 @@ namespace std
const wchar_t* const wchar_t*
ctype<wchar_t>:: ctype<wchar_t>::
do_is(const wchar_t* __low, const wchar_t* __high, mask* __m) const do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const
{ {
while (__low < __high && !this->is(*__m, *__low)) while (__lo < __hi && !this->is(*__m, *__lo))
++__low; ++__lo;
return __low; return __lo;
} }
const wchar_t* const wchar_t*
ctype<wchar_t>:: ctype<wchar_t>::
do_scan_is(mask __m, const wchar_t* __low, const wchar_t* __high) const do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
{ {
while (__low < __high && !this->is(__m, *__low)) while (__lo < __hi && !this->is(__m, *__lo))
++__low; ++__lo;
return __low; return __lo;
} }
const wchar_t* const wchar_t*
ctype<wchar_t>:: ctype<wchar_t>::
do_scan_not(mask __m, const char_type* __low, const char_type* __high) const do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
{ {
while (__low < __high && this->is(__m, *__low) != 0) while (__lo < __hi && this->is(__m, *__lo) != 0)
++__low; ++__lo;
return __low; return __lo;
} }
wchar_t wchar_t
@ -1174,12 +1173,12 @@ namespace std
const char* const char*
ctype<wchar_t>:: ctype<wchar_t>::
do_widen(const char* __low, const char* __high, wchar_t* __dest) const do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
{ {
mbstate_t __state; mbstate_t __state;
memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t));
mbsrtowcs(__dest, &__low, __high - __low, &__state); mbsrtowcs(__dest, &__lo, __hi - __lo, &__state);
return __high; return __hi;
} }
char char
@ -1192,16 +1191,16 @@ namespace std
const wchar_t* const wchar_t*
ctype<wchar_t>:: ctype<wchar_t>::
do_narrow(const wchar_t* __low, const wchar_t* __high, char __dfault, do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault,
char* __dest) const char* __dest) const
{ {
mbstate_t __state; mbstate_t __state;
memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t));
size_t __len = __high - __low; size_t __len = __hi - __lo;
size_t __conv = wcsrtombs(__dest, &__low, __len, &__state); size_t __conv = wcsrtombs(__dest, &__lo, __len, &__state);
if (__conv == __len) if (__conv == __len)
*__dest = __dfault; *__dest = __dfault;
return __high; return __hi;
} }
ctype_byname<wchar_t>:: ctype_byname<wchar_t>::

View File

@ -153,8 +153,21 @@ test01()
m01 ^= m02; m01 ^= m02;
} }
class gnu_obj
{ };
class gnu_ctype2: public std::ctype<gnu_obj>
{ };
// libstdc++/3017
void test02()
{
gnu_ctype2 obj;
}
int main() int main()
{ {
test01(); test01();
test02();
return 0; return 0;
} }