aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorBenjamin Kosnik <bkoz@gcc.gnu.org>2000-12-07 06:44:49 +0000
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2000-12-07 06:44:49 +0000
commit167ed88f7ab3220aab5b66fef1ac3c12a8d326b9 (patch)
treef85bdfe4fbaf081d0d210ba2392500106495c57b /libstdc++-v3
parent1120a1d3273bf22a4f7e5fdb8d96d3ffd80457f8 (diff)
downloadgcc-167ed88f7ab3220aab5b66fef1ac3c12a8d326b9.zip
gcc-167ed88f7ab3220aab5b66fef1ac3c12a8d326b9.tar.gz
gcc-167ed88f7ab3220aab5b66fef1ac3c12a8d326b9.tar.bz2
locale_facets.h (ctype): Remove _Ctype_nois and _Ctype and replace with common __ctype_abstract_base.
2000-12-06 Benjamin Kosnik <bkoz@kredhat.com> * include/bits/locale_facets.h (ctype): Remove _Ctype_nois and _Ctype and replace with common __ctype_abstract_base. (ctype<wchar_t>::_M_convert_to_wmask): Move to locale.cc. * config/os/gnu-linux/bits/ctype_noninline.h (ctype<char>::ctype): And here. * config/os/solaris/solaris2.7/bits/ctype_noninline.h (ctype): Same. * config/os/solaris/solaris2.6/bits/ctype_noninline.h (ctype): Same. * config/os/solaris/solaris2.5/bits/ctype_noninline.h (ctype): Same. * config/os/newlib/bits/ctype_noninline.h (ctype): Same. * config/os/irix/bits/ctype_noninline.h (ctype): Same. * config/os/hpux/bits/ctype_noninline.h (ctype): Same. * config/os/generic/bits/ctype_noninline.h (ctype): Same. * config/os/aix/bits/ctype_noninline.h (ctype): Same. * config/os/bsd/netbsd/bits/ctype_noninline.h (ctype): Same. * config/os/bsd/freebsd/bits/ctype_noninline.h (ctype): Same. * src/locale-inst.cc: Clean instantiations. * src/locale.cc (ctype<char>): Add definitions here. (ctype<wchar_t>::_M_wmask): Move definitions here. * config/os/generic/bits/ctype_inline.h (ctype<char>::is): Implement in a generic way, with only "C" functionality and no knowlege of the target os. * config/os/generic/bits/os_defines.h: Change comments to C++ style. * testsuite/22_locale/ctype_char_members.cc (test01): Add tests. * include/bits/codecvt.h (ctype_byname): Remove specializations, as not required. * include/bits/localefwd.h (codecvt_byname): And here. * src/codecvt.cc: Remove codecvt_byname specializations. * include/c/bits/std_cstdio.h: Include c++config.h. From-SVN: r38100
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog36
-rw-r--r--libstdc++-v3/config/os/aix/bits/ctype_noninline.h2
-rw-r--r--libstdc++-v3/config/os/bsd/freebsd/bits/ctype_noninline.h2
-rw-r--r--libstdc++-v3/config/os/bsd/netbsd/bits/ctype_noninline.h2
-rw-r--r--libstdc++-v3/config/os/generic/bits/ctype_inline.h50
-rw-r--r--libstdc++-v3/config/os/generic/bits/ctype_noninline.h2
-rw-r--r--libstdc++-v3/config/os/generic/bits/os_defines.h8
-rw-r--r--libstdc++-v3/config/os/gnu-linux/bits/ctype_noninline.h2
-rw-r--r--libstdc++-v3/config/os/hpux/bits/ctype_noninline.h2
-rw-r--r--libstdc++-v3/config/os/irix/bits/ctype_noninline.h6
-rw-r--r--libstdc++-v3/config/os/newlib/bits/ctype_noninline.h2
-rw-r--r--libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_noninline.h2
-rw-r--r--libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_noninline.h2
-rw-r--r--libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_noninline.h2
-rw-r--r--libstdc++-v3/include/bits/codecvt.h39
-rw-r--r--libstdc++-v3/include/bits/locale_facets.h258
-rw-r--r--libstdc++-v3/include/bits/localefwd.h4
-rw-r--r--libstdc++-v3/include/c/bits/std_cstdio.h1
-rw-r--r--libstdc++-v3/src/codecvt.cc14
-rw-r--r--libstdc++-v3/src/locale-inst.cc12
-rw-r--r--libstdc++-v3/src/locale.cc65
-rw-r--r--libstdc++-v3/testsuite/22_locale/ctype_char_members.cc18
22 files changed, 251 insertions, 280 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index d687289..686a350 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,37 @@
+2000-12-06 Benjamin Kosnik <bkoz@kredhat.com>
+
+ * include/bits/locale_facets.h (ctype): Remove _Ctype_nois and
+ _Ctype and replace with common __ctype_abstract_base.
+ (ctype<wchar_t>::_M_convert_to_wmask): Move to locale.cc.
+ * config/os/gnu-linux/bits/ctype_noninline.h (ctype<char>::ctype):
+ And here.
+ * config/os/solaris/solaris2.7/bits/ctype_noninline.h (ctype): Same.
+ * config/os/solaris/solaris2.6/bits/ctype_noninline.h (ctype): Same.
+ * config/os/solaris/solaris2.5/bits/ctype_noninline.h (ctype): Same.
+ * config/os/newlib/bits/ctype_noninline.h (ctype): Same.
+ * config/os/irix/bits/ctype_noninline.h (ctype): Same.
+ * config/os/hpux/bits/ctype_noninline.h (ctype): Same.
+ * config/os/generic/bits/ctype_noninline.h (ctype): Same.
+ * config/os/aix/bits/ctype_noninline.h (ctype): Same.
+ * config/os/bsd/netbsd/bits/ctype_noninline.h (ctype): Same.
+ * config/os/bsd/freebsd/bits/ctype_noninline.h (ctype): Same.
+ * src/locale-inst.cc: Clean instantiations.
+ * src/locale.cc (ctype<char>): Add definitions here.
+ (ctype<wchar_t>::_M_wmask): Move definitions here.
+
+ * config/os/generic/bits/ctype_inline.h (ctype<char>::is):
+ Implement in a generic way, with only "C" functionality and no
+ knowlege of the target os.
+ * config/os/generic/bits/os_defines.h: Change comments to C++ style.
+ * testsuite/22_locale/ctype_char_members.cc (test01): Add tests.
+
+ * include/bits/codecvt.h (ctype_byname): Remove specializations,
+ as not required.
+ * include/bits/localefwd.h (codecvt_byname): And here.
+ * src/codecvt.cc: Remove codecvt_byname specializations.
+
+ * include/c/bits/std_cstdio.h: Include c++config.h.
+
2000-12-06 Phil Edwards <pme@sources.redhat.com>
* acinclude.m4 (GLIBCPP_CHECK_*_DECL_AND_LINKAGE_*): Pre-test
@@ -15,7 +49,7 @@
* configure.target (*-*-freebsd, *-*-netbsd): Correct paths to
os_include_dir.
-Tue Dec 5 20:24:15 2000 Jeffrey A Law (law@cygnus.com)
+2000-12-05 Jeffrey A Law <law@cygnus.com>
* configure.target (hpux): Set os_include_dir.
* config/os/hpux/bits/ctype_base.h: New file
diff --git a/libstdc++-v3/config/os/aix/bits/ctype_noninline.h b/libstdc++-v3/config/os/aix/bits/ctype_noninline.h
index c58fbaa..54f546c 100644
--- a/libstdc++-v3/config/os/aix/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/aix/bits/ctype_noninline.h
@@ -35,7 +35,7 @@
ctype<char>::ctype(const mask* __table = 0, bool __del = false,
size_t __refs = 0)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
_M_toupper(NULL), _M_tolower(NULL),
_M_ctable(NULL), _M_table(__table == 0 ? _M_ctable: __table)
{ }
diff --git a/libstdc++-v3/config/os/bsd/freebsd/bits/ctype_noninline.h b/libstdc++-v3/config/os/bsd/freebsd/bits/ctype_noninline.h
index 24fdcdb..5de223b 100644
--- a/libstdc++-v3/config/os/bsd/freebsd/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/bsd/freebsd/bits/ctype_noninline.h
@@ -35,7 +35,7 @@
ctype<char>::ctype(const mask* __table = 0, bool __del = false,
size_t __refs = 0)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
_M_toupper(NULL), _M_tolower(NULL),
_M_ctable(NULL), _M_table(__table == 0 ? _M_ctable: __table)
{ }
diff --git a/libstdc++-v3/config/os/bsd/netbsd/bits/ctype_noninline.h b/libstdc++-v3/config/os/bsd/netbsd/bits/ctype_noninline.h
index c5b3370..395c066 100644
--- a/libstdc++-v3/config/os/bsd/netbsd/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/bsd/netbsd/bits/ctype_noninline.h
@@ -35,7 +35,7 @@
ctype<char>::ctype(const mask* __table = 0, bool __del = false,
size_t __refs = 0)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
_M_toupper(NULL), _M_tolower(NULL),
_M_ctable(NULL), _M_table(__table == 0 ? (_ctype_ + 1) : __table)
{ }
diff --git a/libstdc++-v3/config/os/generic/bits/ctype_inline.h b/libstdc++-v3/config/os/generic/bits/ctype_inline.h
index 952b0da..20648a1 100644
--- a/libstdc++-v3/config/os/generic/bits/ctype_inline.h
+++ b/libstdc++-v3/config/os/generic/bits/ctype_inline.h
@@ -34,11 +34,57 @@
// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*)
// functions go in ctype.cc
+// The following definitions are portable, but insanely slow. If one
+// cares at all about performance, then specialized ctype
+// functionality should be added for the native os in question: see
+// the config/os/bits/ctype_*.h files.
+
bool
ctype<char>::
is(mask __m, char __c) const throw()
- { return _M_table[(unsigned char)(__c)] & __m; }
-
+ {
+ bool __ret = false;
+ switch (__m)
+ {
+ case space:
+ __ret = isspace(__c);
+ break;
+ case print:
+ __ret = isprint(__c);
+ break;
+ case cntrl:
+ __ret = iscntrl(__c);
+ break;
+ case upper:
+ __ret = isupper(__c);
+ break;
+ case lower:
+ __ret = islower(__c);
+ break;
+ case alpha:
+ __ret = isalpha(__c);
+ break;
+ case digit:
+ __ret = isdigit(__c);
+ break;
+ case punct:
+ __ret = ispunct(__c);
+ break;
+ case xdigit:
+ __ret = isxdigit(__c);
+ break;
+ case alnum:
+ __ret = isalnum(__c);
+ break;
+ case graph:
+ __ret = isgraph(__c);
+ break;
+ default:
+ break;
+ }
+ return __ret;
+ }
+
const char*
ctype<char>::
is(const char* __low, const char* __high, mask* __vec) const throw()
diff --git a/libstdc++-v3/config/os/generic/bits/ctype_noninline.h b/libstdc++-v3/config/os/generic/bits/ctype_noninline.h
index bc99064..38edd40 100644
--- a/libstdc++-v3/config/os/generic/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/generic/bits/ctype_noninline.h
@@ -35,7 +35,7 @@
ctype<char>::ctype(const mask* __table = 0, bool __del = false,
size_t __refs = 0)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
_M_toupper(NULL), _M_tolower(NULL),
_M_ctable(NULL), _M_table(__table == 0 ? _M_ctable: __table)
{ }
diff --git a/libstdc++-v3/config/os/generic/bits/os_defines.h b/libstdc++-v3/config/os/generic/bits/os_defines.h
index c21e775..5c99e09 100644
--- a/libstdc++-v3/config/os/generic/bits/os_defines.h
+++ b/libstdc++-v3/config/os/generic/bits/os_defines.h
@@ -31,11 +31,7 @@
#ifndef _GLIBCPP_OS_DEFINES
# define _GLIBCPP_OS_DEFINES
-
-/* System-specific #define, typedefs, corrections, etc, go here. This
- file will come before all others. */
-
+// System-specific #define, typedefs, corrections, etc, go here. This
+// file will come before all others.
#endif
-
-
diff --git a/libstdc++-v3/config/os/gnu-linux/bits/ctype_noninline.h b/libstdc++-v3/config/os/gnu-linux/bits/ctype_noninline.h
index 6303242..a03af59 100644
--- a/libstdc++-v3/config/os/gnu-linux/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/gnu-linux/bits/ctype_noninline.h
@@ -40,7 +40,7 @@
#endif
ctype<char>::ctype(const mask* __table, bool __del, size_t __refs)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
_M_toupper(__ctype_toupper), _M_tolower(__ctype_tolower),
_M_ctable(__ctype_b), _M_table(__table == 0 ? _M_ctable: __table)
{ }
diff --git a/libstdc++-v3/config/os/hpux/bits/ctype_noninline.h b/libstdc++-v3/config/os/hpux/bits/ctype_noninline.h
index bc99064..38edd40 100644
--- a/libstdc++-v3/config/os/hpux/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/hpux/bits/ctype_noninline.h
@@ -35,7 +35,7 @@
ctype<char>::ctype(const mask* __table = 0, bool __del = false,
size_t __refs = 0)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
_M_toupper(NULL), _M_tolower(NULL),
_M_ctable(NULL), _M_table(__table == 0 ? _M_ctable: __table)
{ }
diff --git a/libstdc++-v3/config/os/irix/bits/ctype_noninline.h b/libstdc++-v3/config/os/irix/bits/ctype_noninline.h
index 50f87a9..0fb25d1 100644
--- a/libstdc++-v3/config/os/irix/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/irix/bits/ctype_noninline.h
@@ -35,10 +35,8 @@
ctype<char>::ctype(const mask* __table = 0, bool __del = false,
size_t __refs = 0)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
- _M_toupper(NULL),
- _M_tolower(NULL),
- _M_ctable(NULL),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
+ _M_toupper(NULL), _M_tolower(NULL), _M_ctable(NULL),
_M_table(!__table
? (const mask*) (__libc_attr._ctype_tbl->_class + 1)
: __table)
diff --git a/libstdc++-v3/config/os/newlib/bits/ctype_noninline.h b/libstdc++-v3/config/os/newlib/bits/ctype_noninline.h
index 63c400f..30494d3 100644
--- a/libstdc++-v3/config/os/newlib/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/newlib/bits/ctype_noninline.h
@@ -35,7 +35,7 @@
ctype<char>::ctype(const mask* __table = 0, bool __del = false,
size_t __refs = 0)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
_M_toupper(NULL), _M_tolower(NULL),
_M_ctable(_ctype_), _M_table(__table == 0 ? _M_ctable: __table)
{ }
diff --git a/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_noninline.h b/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_noninline.h
index 7c51840..86760774 100644
--- a/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_noninline.h
@@ -35,7 +35,7 @@
ctype<char>::ctype(const mask* __table = 0, bool __del = false,
size_t __refs = 0)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
_M_toupper(NULL), _M_tolower(NULL),
_M_ctable(__ctype), _M_table(__table == 0 ? _M_ctable: __table)
{ }
diff --git a/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_noninline.h b/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_noninline.h
index 3238111..29ecc9e 100644
--- a/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_noninline.h
@@ -35,7 +35,7 @@
ctype<char>::ctype(const mask* __table = 0, bool __del = false,
size_t __refs = 0)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
_M_toupper(__trans_upper), _M_tolower(__trans_lower),
_M_ctable(__ctype_mask), _M_table(__table == 0 ? _M_ctable: __table)
{ }
diff --git a/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_noninline.h b/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_noninline.h
index f5ec171..ae3d6fb 100644
--- a/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_noninline.h
+++ b/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_noninline.h
@@ -35,7 +35,7 @@
ctype<char>::ctype(const mask* __table = 0, bool __del = false,
size_t __refs = 0)
- : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
_M_toupper(__trans_upper), _M_tolower(__trans_lower),
_M_ctable(__ctype_mask), _M_table(__table == 0 ? _M_ctable: __table)
{ }
diff --git a/libstdc++-v3/include/bits/codecvt.h b/libstdc++-v3/include/bits/codecvt.h
index c8ec65a..8b90b94 100644
--- a/libstdc++-v3/include/bits/codecvt.h
+++ b/libstdc++-v3/include/bits/codecvt.h
@@ -385,11 +385,11 @@ namespace std
// in the future. Using this adaptor, g++ will do the work for us.
template<typename _T>
inline size_t
- __iconv_adaptor(size_t(*iconv_func)(iconv_t, _T, size_t *, char**, size_t*),
- iconv_t cd, char **inbuf, size_t *inbytesleft,
- char **outbuf, size_t *outbytesleft)
+ __iconv_adaptor(size_t(*iconv_func)(iconv_t, _T, size_t*, char**, size_t*),
+ iconv_t cd, char** inbuf, size_t* inbytesleft,
+ char** outbuf, size_t* outbytesleft)
{
- return iconv_func (cd, (_T)inbuf, inbytesleft, outbuf, outbytesleft);
+ return iconv_func(cd, (_T)inbuf, inbytesleft, outbuf, outbytesleft);
}
template<typename _InternT, typename _ExternT>
@@ -709,40 +709,11 @@ namespace std
public:
explicit
codecvt_byname(const char*, size_t __refs = 0)
- : codecvt<_InternT,_ExternT,_StateT> (__refs) { }
+ : codecvt<_InternT, _ExternT, _StateT>(__refs) { }
protected:
virtual
~codecvt_byname() { }
};
-
- template<>
- class codecvt_byname<char, char, mbstate_t>
- : public codecvt<char, char, mbstate_t>
- {
- public:
- explicit
- codecvt_byname(const char*, size_t __refs = 0);
-
- protected:
- virtual
- ~codecvt_byname();
- };
-
-#ifdef _GLIBCPP_USE_WCHAR_T
- template<>
- class codecvt_byname<wchar_t, char, mbstate_t>
- : public codecvt<wchar_t, char, mbstate_t>
- {
- public:
- explicit
- codecvt_byname(const char*, size_t __refs = 0);
-
- protected:
- virtual
- ~codecvt_byname();
- };
-#endif
-
} // namespace std
#endif // _CPP_BITS_CODECVT_H
diff --git a/libstdc++-v3/include/bits/locale_facets.h b/libstdc++-v3/include/bits/locale_facets.h
index 6525bda..e7ba494 100644
--- a/libstdc++-v3/include/bits/locale_facets.h
+++ b/libstdc++-v3/include/bits/locale_facets.h
@@ -40,8 +40,8 @@
#include <typeinfo> // For bad_cast, which shouldn't be here.
#include <bits/std_ios.h> // For ios_base
#ifdef _GLIBCPP_USE_WCHAR_T
-#include <bits/std_cwctype.h> // For wctype_t
-#endif /* _GLIBCPP_USE_WCHAR_T */
+# include <bits/std_cwctype.h> // For wctype_t
+#endif
namespace std
{
@@ -83,15 +83,30 @@ namespace std
#include <bits/ctype_base.h>
// 22.2.1.1 Template class ctype
- // _Ctype_nois is the common base for ctype<char>. It lacks "do_is"
- // and related virtuals. These are filled in by _Ctype, below.
+ // __ctype_abstract_base is the common base for ctype<_CharT>.
template<typename _CharT>
- class _Ctype_nois : public locale::facet, public ctype_base
+ class __ctype_abstract_base : public locale::facet, public ctype_base
{
public:
// Types:
typedef _CharT char_type;
+ bool
+ is(mask __m, char_type __c) const
+ { return this->do_is(__m, __c); }
+
+ const char_type*
+ is(const char_type *__lo, const char_type *__hi, mask *__vec) const
+ { return this->do_is(__lo, __hi, __vec); }
+
+ const char_type*
+ scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
+ { return this->do_scan_is(__m, __lo, __hi); }
+
+ const char_type*
+ scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
+ { return this->do_scan_not(__m, __lo, __hi); }
+
char_type
toupper(char_type __c) const
{ return this->do_toupper(__c); }
@@ -127,11 +142,26 @@ namespace std
protected:
explicit
- _Ctype_nois(size_t __refs = 0): locale::facet(__refs) { }
+ __ctype_abstract_base(size_t __refs = 0): locale::facet(__refs) { }
virtual
- ~_Ctype_nois() { }
+ ~__ctype_abstract_base() { }
+ virtual bool
+ do_is(mask __m, char_type __c) const = 0;
+
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi,
+ mask* __vec) const = 0;
+
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo,
+ const char_type* __hi) const = 0;
+
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const = 0;
+
virtual char_type
do_toupper(char_type) const = 0;
@@ -159,163 +189,28 @@ namespace std
char __dfault, char* __dest) const = 0;
};
-
+ // NB: Generic, mostly useless implementation.
template<typename _CharT>
- class _Ctype : public _Ctype_nois<_CharT>
+ class ctype : public __ctype_abstract_base<_CharT>
{
public:
// Types:
- typedef _CharT char_type;
- typedef typename _Ctype_nois<_CharT>::mask mask;
-
- bool
- is(mask __m, char_type __c) const
- { return this->do_is(__m, __c); }
+ typedef _CharT char_type;
+ typedef typename ctype::mask mask;
- const char_type*
- is(const char_type *__lo, const char_type *__hi, mask *__vec) const
- { return this->do_is(__lo, __hi, __vec); }
-
- const char_type*
- scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
- { return this->do_scan_is(__m, __lo, __hi); }
-
- const char_type*
- scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
- { return this->do_scan_not(__m, __lo, __hi); }
-
- protected:
explicit
- _Ctype(size_t __refs = 0) : _Ctype_nois<_CharT>(__refs) { }
-
- virtual
- ~_Ctype() { }
-
- virtual bool
- do_is(mask __m, char_type __c) const = 0;
-
- virtual const char_type*
- do_is(const char_type* __lo, const char_type* __hi,
- mask* __vec) const = 0;
-
- virtual const char_type*
- do_scan_is(mask __m, const char_type* __lo,
- const char_type* __hi) const = 0;
-
- virtual const char_type*
- do_scan_not(mask __m, const char_type* __lo,
- const char_type* __hi) const = 0;
- };
-
- template<typename _CharT>
- class ctype : public _Ctype<_CharT>
- {
- public:
- // Types:
- typedef _CharT char_type;
- typedef typename ctype::mask mask;
-
- explicit
- ctype(size_t __refs = 0) : _Ctype<_CharT>(__refs) { }
+ ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { }
static locale::id id;
protected:
virtual
~ctype() { }
-
- virtual bool
- do_is(mask, char_type) const
- {
- // XXX Need definitions for these abstract mf's.
- return true;
- }
-
- virtual const char_type*
- do_is(const char_type* __lo, const char_type*, mask*) const
- {
- // XXX Need definitions for these abstract mf's.
- return __lo;
- }
-
- virtual const char_type*
- do_scan_is(mask, const char_type* __lo, const char_type*) const
- {
- // XXX Need definitions for these abstract mf's.
- return __lo;
- }
-
- virtual const char_type*
- do_scan_not(mask, const char_type* __lo, const char_type*) const
- {
- // XXX Need definitions for these abstract mf's.
- return __lo;
- }
-
- virtual char_type
- do_toupper(char_type __c) const
- {
- // XXX Need definitions for these abstract mf's.
- return __c;
- }
-
- virtual const char_type*
- do_toupper(char_type* __lo, const char_type*) const
- {
- // XXX Need definitions for these abstract mf's.
- return __lo;
- }
-
- virtual char_type
- do_tolower(char_type __c) const
- {
- // XXX Need definitions for these abstract mf's.
- return __c;
- }
-
- virtual const char_type*
- do_tolower(char_type* __lo, const char_type*) const
- {
- // XXX Need definitions for these abstract mf's.
- return __lo;
- }
-
- virtual char_type
- do_widen(char __c) const
- {
- // XXX Need definitions for these abstract mf's.
- return __c;
- }
-
- virtual const char*
- do_widen(const char* __lo, const char*, char_type*) const
- {
- // XXX Need definitions for these abstract mf's.
- return __lo;
- }
-
- virtual char
- do_narrow(char_type, char __c) const
- {
- // XXX Need definitions for these abstract mf's.
- return __c;
- }
-
- virtual const char_type*
- do_narrow(const char_type* __lo, const char_type*, char, char*) const
- {
- // XXX Need definitions for these abstract mf's.
- return __lo;
- }
};
-
// 22.2.1.3 ctype specializations
- // NB: Can use _Ctype_nois to actually implement the "is"
- // functionality in the non-virtual (thus inline-able) member
- // fuctions.
template<>
- class ctype<char> : public _Ctype_nois<char>
+ class ctype<char> : public __ctype_abstract_base<char>
{
public:
// Types:
@@ -363,6 +258,21 @@ namespace std
classic_table() throw()
{ return _M_ctable; }
+ virtual bool
+ do_is(mask __m, char_type __c) const;
+
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi,
+ mask* __vec) const;
+
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo,
+ const char_type* __hi) const;
+
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const;
+
virtual char_type
do_toupper(char_type) const;
@@ -397,7 +307,7 @@ namespace std
#ifdef _GLIBCPP_USE_WCHAR_T
// ctype<wchar_t> specialization
template<>
- class ctype<wchar_t> : public _Ctype<wchar_t>
+ class ctype<wchar_t> : public __ctype_abstract_base<wchar_t>
{
public:
// Types:
@@ -413,49 +323,7 @@ namespace std
protected:
__wmask_type
- _M_convert_to_wmask(const mask __m) const
- {
- __wmask_type __ret;
- switch (__m)
- {
- case space:
- __ret = wctype("space");
- break;
- case print:
- __ret = wctype("print");
- break;
- case cntrl:
- __ret = wctype("cntrl");
- break;
- case upper:
- __ret = wctype("upper");
- break;
- case lower:
- __ret = wctype("lower");
- break;
- case alpha:
- __ret = wctype("alpha");
- break;
- case digit:
- __ret = wctype("digit");
- break;
- case punct:
- __ret = wctype("punct");
- break;
- case xdigit:
- __ret = wctype("xdigit");
- break;
- case alnum:
- __ret = wctype("alnum");
- break;
- case graph:
- __ret = wctype("graph");
- break;
- default:
- __ret = 0;
- }
- return __ret;
- };
+ _M_convert_to_wmask(const mask __m) const;
virtual
~ctype();
@@ -526,13 +394,9 @@ namespace std
~ctype_byname() { }
};
- // 22.2.1.4 Class ctype_byname specializations
+ // 22.2.1.4 Class ctype_byname specialization
template<>
ctype_byname<char>::ctype_byname(const char*, size_t refs);
-#ifdef _GLIBCPP_USE_WCHAR_T
- template<>
- ctype_byname<wchar_t>::ctype_byname(const char*, size_t refs);
-#endif
template<typename _CharT, typename _InIter>
diff --git a/libstdc++-v3/include/bits/localefwd.h b/libstdc++-v3/include/bits/localefwd.h
index 73dba99..be2908c 100644
--- a/libstdc++-v3/include/bits/localefwd.h
+++ b/libstdc++-v3/include/bits/localefwd.h
@@ -153,10 +153,6 @@ namespace std
template<typename _InternT, typename _ExternT, typename _StateT>
class codecvt_byname;
- template<> class codecvt_byname<char, char, mbstate_t>;
-#ifdef _GLIBCPP_USE_WCHAR_T
- template<> class codecvt_byname<wchar_t, char, mbstate_t>;
-#endif
// 22.2.2 and 22.2.3 numeric
template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
diff --git a/libstdc++-v3/include/c/bits/std_cstdio.h b/libstdc++-v3/include/c/bits/std_cstdio.h
index dc59031..60ed76d 100644
--- a/libstdc++-v3/include/c/bits/std_cstdio.h
+++ b/libstdc++-v3/include/c/bits/std_cstdio.h
@@ -36,6 +36,7 @@
#ifndef _CPP_CSTDIO
#define _CPP_CSTDIO 1
+#include <bits/c++config.h>
#include <bits/std_cstdarg.h>
#pragma GCC system_header
diff --git a/libstdc++-v3/src/codecvt.cc b/libstdc++-v3/src/codecvt.cc
index 688381f..cfc7682 100644
--- a/libstdc++-v3/src/codecvt.cc
+++ b/libstdc++-v3/src/codecvt.cc
@@ -105,13 +105,6 @@ namespace std {
do_max_length() const throw()
{ return 1; }
- codecvt_byname<char, char, mbstate_t>::
- codecvt_byname(const char* /*__s*/, size_t __refs)
- : codecvt<char, char, mbstate_t>(__refs) { }
-
- codecvt_byname<char, char, mbstate_t>::
- ~codecvt_byname() { }
-
#ifdef _GLIBCPP_USE_WCHAR_T
// codecvt<wchar_t, char, mbstate_t> required specialization
locale::id codecvt<wchar_t, char, mbstate_t>::id;
@@ -210,13 +203,6 @@ namespace std {
codecvt<wchar_t, char, mbstate_t>::
do_max_length() const throw()
{ return 1; }
-
- codecvt_byname<wchar_t, char, mbstate_t>::
- codecvt_byname(const char* /*__s*/, size_t __refs)
- : codecvt<wchar_t, char, mbstate_t> (__refs) { }
-
- codecvt_byname<wchar_t, char, mbstate_t>::
- ~codecvt_byname() { }
#endif // _GLIBCPP_USE_WCHAR_T
} // namespace std
diff --git a/libstdc++-v3/src/locale-inst.cc b/libstdc++-v3/src/locale-inst.cc
index c762bd9..5531bc8 100644
--- a/libstdc++-v3/src/locale-inst.cc
+++ b/libstdc++-v3/src/locale-inst.cc
@@ -118,20 +118,20 @@ namespace std {
#endif
// ctype
- // template class ctype<unsigned char>; // No definitions avail.
- // template class ctype<signed char>; // No definitions avail.
- template class _Ctype<char>;
- template class _Ctype_nois<char>;
+ template class __ctype_abstract_base<char>;
template class ctype_byname<char>;
#ifdef _GLIBCPP_USE_WCHAR_T
- template class _Ctype<wchar_t>;
- template class _Ctype_nois<wchar_t>;
+ template class __ctype_abstract_base<wchar_t>;
template class ctype_byname<wchar_t>;
#endif
// codecvt
template class __codecvt_abstract_base<char, char, mbstate_t>;
template class __codecvt_abstract_base<wchar_t, char, mbstate_t>;
+ template class codecvt_byname<char, char, mbstate_t>;
+#ifdef _GLIBCPP_USE_WCHAR_T
+ template class codecvt_byname<wchar_t, char, mbstate_t>;
+#endif
// collate
template class _Collate<char>;
diff --git a/libstdc++-v3/src/locale.cc b/libstdc++-v3/src/locale.cc
index 782cec0..7cdbd540 100644
--- a/libstdc++-v3/src/locale.cc
+++ b/libstdc++-v3/src/locale.cc
@@ -788,6 +788,23 @@ namespace std {
ctype<char>::~ctype()
{ if (_M_del) delete[] this->table(); }
+ // These are dummy placeholders as these virtual functions are never called.
+ bool
+ ctype<char>::do_is(mask, char_type) const
+ { return false; }
+
+ const char*
+ ctype<char>::do_is(const char_type* __c, const char_type*, mask*) const
+ { return __c; }
+
+ const char*
+ ctype<char>::do_scan_is(mask, const char_type* __c, const char_type*) const
+ { return __c; }
+
+ const char*
+ ctype<char>::do_scan_not(mask, const char_type* __c, const char_type*) const
+ { return __c; }
+
char
ctype<char>::do_widen(char __c) const
{ return __c; }
@@ -875,12 +892,58 @@ namespace std {
#ifdef _GLIBCPP_USE_WCHAR_T
locale::id ctype<wchar_t>::id;
+ ctype<wchar_t>::__wmask_type
+ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const
+ {
+ __wmask_type __ret;
+ switch (__m)
+ {
+ case space:
+ __ret = wctype("space");
+ break;
+ case print:
+ __ret = wctype("print");
+ break;
+ case cntrl:
+ __ret = wctype("cntrl");
+ break;
+ case upper:
+ __ret = wctype("upper");
+ break;
+ case lower:
+ __ret = wctype("lower");
+ break;
+ case alpha:
+ __ret = wctype("alpha");
+ break;
+ case digit:
+ __ret = wctype("digit");
+ break;
+ case punct:
+ __ret = wctype("punct");
+ break;
+ case xdigit:
+ __ret = wctype("xdigit");
+ break;
+ case alnum:
+ __ret = wctype("alnum");
+ break;
+ case graph:
+ __ret = wctype("graph");
+ break;
+ default:
+ __ret = 0;
+ }
+ return __ret;
+ };
+
ctype<wchar_t>::
~ctype() { }
// NB: These ctype<wchar_t> methods are not configuration-specific,
// unlike the ctype<char> bits.
- ctype<wchar_t>::ctype(size_t __refs) : _Ctype<wchar_t>(__refs) { }
+ ctype<wchar_t>::ctype(size_t __refs) : __ctype_abstract_base<wchar_t>(__refs)
+ { }
wchar_t
ctype<wchar_t>::do_toupper(wchar_t __c) const
diff --git a/libstdc++-v3/testsuite/22_locale/ctype_char_members.cc b/libstdc++-v3/testsuite/22_locale/ctype_char_members.cc
index 2e91710..a12b2f7 100644
--- a/libstdc++-v3/testsuite/22_locale/ctype_char_members.cc
+++ b/libstdc++-v3/testsuite/22_locale/ctype_char_members.cc
@@ -33,7 +33,7 @@
// NB: Don't include any other headers in this file.
#include <debug_assert.h>
-class gnu_ctype: public std::ctype<char> {};
+class gnu_ctype: public std::ctype<char> { };
void test01()
{
@@ -71,6 +71,22 @@ void test01()
VERIFY( gctype.is(std::ctype_base::graph, c40) );
VERIFY( gctype.is(std::ctype_base::graph, c20) );
+ // const char* is(const char* low, const char* high, mask* vec) const
+ std::ctype_base::mask m01 = static_cast<std::ctype_base::mask>(0);
+ std::ctype_base::mask m02 = std::ctype_base::digit;
+ const char* cc0 = strlit00;
+ const char* cc1 = NULL;
+ const char* cc2 = NULL;
+#if 1
+ cc1 = gctype.is(cc0, cc0, &m01);
+ VERIFY( cc1 == strlit00 );
+ cc2 = gctype.is(cc0, cc0 + 3, &m01);
+ VERIFY( cc2 == strlit00 + 3);
+
+ cc1 = gctype.is(cc0, cc0 + 13, &m02);
+ VERIFY( cc1 == strlit00 + 13);
+#endif
+
// char toupper(char c) const
c100 = gctype.toupper(c10);
VERIFY( c100 == c00 );