Commit 9540958e by Benjamin Kosnik Committed by Benjamin Kosnik

re PR libstdc++/10081 (basic_ios::_M_cache_locale leaves NULL members in the…

re PR libstdc++/10081 (basic_ios::_M_cache_locale leaves NULL members in the face of unknown locales)


2003-10-20  Benjamin Kosnik  <bkoz@redhat.com>

	PR libstdc++/10081
	* testsuite_hooks.h: Add pod_type, ctype and numpunct specializations.
	* testsuite_hooks.cc: Same.
	* 22_locale/numpunct/members/pod/1.cc: Edit.
	* 22_locale/numpunct/members/pod/2.cc: Same.
	* 27_io/basic_istream/sentry/char/3983-fstream.cc: Move ...
	* 27_io/basic_istream/sentry/char/3983-sstream.cc: Move ...
	* 27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc: Here.
	* 27_io/basic_istream/extractors_character/pod/3983-2.cc: Here.
	* 27_io/basic_istream/extractors_other/pod/3983-3.cc: Here.
	* 27_io/basic_ostream/sentry/char/3983-fstream.cc: Remove.
	* 27_io/basic_ostream/sentry/char/3983-sstream.cc: Remove.
	* 27_io/basic_istream/sentry/pod/1.cc: New.
	* 27_io/basic_ostream/sentry/pod/1.cc: New.
	* 21_strings/basic_string/inserters_extractors/pod/10081-in.cc: New.
	* 21_strings/basic_string/inserters_extractors/pod/10081-out.cc: New.

From-SVN: r72728
parent ac054e28
2003-10-20 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/10081
* testsuite_hooks.h: Add pod_type, ctype and numpunct specializations.
* testsuite_hooks.cc: Same.
* 22_locale/numpunct/members/pod/1.cc: Edit.
* 22_locale/numpunct/members/pod/2.cc: Same.
* 27_io/basic_istream/sentry/char/3983-fstream.cc: Move ...
* 27_io/basic_istream/sentry/char/3983-sstream.cc: Move ...
* 27_io/basic_istream/extractors_arithmetic/pod/3983-1.cc: Here.
* 27_io/basic_istream/extractors_character/pod/3983-2.cc: Here.
* 27_io/basic_istream/extractors_other/pod/3983-3.cc: Here.
* 27_io/basic_ostream/sentry/char/3983-fstream.cc: Remove.
* 27_io/basic_ostream/sentry/char/3983-sstream.cc: Remove.
* 27_io/basic_istream/sentry/pod/1.cc: New.
* 27_io/basic_ostream/sentry/pod/1.cc: New.
* 21_strings/basic_string/inserters_extractors/pod/10081-in.cc: New.
* 21_strings/basic_string/inserters_extractors/pod/10081-out.cc: New.
2003-10-20 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* config/cpu/mips/atomicity.h (__atomic_add): Use _ABIO32 instead
......
......@@ -68,9 +68,12 @@ namespace std
// NB: This type should be bigger than char_type, so as to
// properly hold EOF values in addition to the full range of
// char_type values.
// Also, assumes
// int_type(value_type) is valid.
// int_type(-1) is possible.
typedef typename char_type::int_type int_type;
typedef typename char_type::state_type state_type;
typedef streampos pos_type;
typedef fpos<state_type> pos_type;
typedef streamoff off_type;
static void
......
// Copyright (C) 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.6.1.1.2 class basic_istream::sentry
#include <string>
#include <istream>
#include <sstream>
#include <locale>
#include <testsuite_hooks.h>
void test01()
{
using namespace std;
using __gnu_test::pod_type;
typedef basic_string<pod_type> string_type;
typedef basic_stringbuf<pod_type> stringbuf_type;
typedef basic_istream<pod_type> istream_type;
bool test __attribute__((unused)) = true;
string_type str;
stringbuf_type strbuf01;
istream_type stream(&strbuf01);
try
{
stream >> str;
}
catch (std::bad_cast& obj)
{
// Ok, throws bad_cast because locale has no ctype facet.
}
catch (...)
{
VERIFY( false );
}
const std::locale loc(std::locale::classic(), new std::ctype<pod_type>);
stream.imbue(loc);
try
{
stream >> str;
}
catch (...)
{
VERIFY( false );
}
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<__gnu_test::pod_type>::size_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
template
__gnu_test::pod_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
#endif
int main()
{
test01();
return 0;
}
// Copyright (C) 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.6.1.1.2 class basic_istream::sentry
#include <string>
#include <ostream>
#include <sstream>
#include <locale>
#include <testsuite_hooks.h>
void test01()
{
using namespace std;
using __gnu_test::pod_type;
typedef basic_string<pod_type> string_type;
typedef basic_stringbuf<pod_type> stringbuf_type;
typedef basic_ostream<pod_type> ostream_type;
bool test __attribute__((unused)) = true;
string_type str;
stringbuf_type strbuf01;
ostream_type stream(&strbuf01);
try
{
stream << str;
}
catch (std::bad_cast& obj)
{
// Ok, throws bad_cast because locale has no ctype facet.
}
catch (...)
{
VERIFY( false );
}
const std::locale loc(std::locale::classic(), new std::ctype<pod_type>);
stream.imbue(loc);
try
{
stream << str;
}
catch (...)
{
VERIFY( false );
}
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<__gnu_test::pod_type>::size_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
template
__gnu_test::pod_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
#endif
int main()
{
test01();
return 0;
}
......@@ -25,103 +25,48 @@
#include <ext/pod_char_traits.h>
#include <testsuite_hooks.h>
typedef unsigned short value_type;
typedef unsigned int int_type;
typedef __gnu_cxx::character<value_type, int_type> podchar_type;
// Member specializations for the existing facet classes.
// NB: This isn't especially portable. Perhaps a better way would be
// to just specialize all of numpunct and ctype.
namespace std
{
template<>
void
numpunct<podchar_type>::_M_initialize_numpunct(__c_locale)
{
if (!_M_data)
_M_data = new __numpunct_cache<podchar_type>;
_M_data->_M_grouping = "";
_M_data->_M_use_grouping = false;
_M_data->_M_decimal_point.value = value_type('.');
_M_data->_M_thousands_sep.value = value_type(',');
for (size_t i = 0; i < __num_base::_S_oend; ++i)
{
value_type v = __num_base::_S_atoms_out[i];
_M_data->_M_atoms_out[i].value = v;
}
_M_data->_M_atoms_out[__num_base::_S_oend] = podchar_type();
for (size_t i = 0; i < __num_base::_S_iend; ++i)
_M_data->_M_atoms_in[i].value = value_type(__num_base::_S_atoms_in[i]);
_M_data->_M_atoms_in[__num_base::_S_iend] = podchar_type();
// "true"
podchar_type* __truename = new podchar_type[4 + 1];
__truename[0].value = value_type('t');
__truename[1].value = value_type('r');
__truename[2].value = value_type('u');
__truename[3].value = value_type('e');
__truename[4] = podchar_type();
_M_data->_M_truename = __truename;
// "false"
podchar_type* __falsename = new podchar_type[5 + 1];
__falsename[0].value = value_type('f');
__falsename[1].value = value_type('a');
__falsename[2].value = value_type('l');
__falsename[3].value = value_type('s');
__falsename[4].value = value_type('e');
__falsename[5] = podchar_type();
_M_data->_M_falsename = __falsename;
}
template<>
numpunct<podchar_type>::~numpunct()
{ delete _M_data; }
}
// Check for numpunct and ctype dependencies. Make sure that numpunct
// can be created without ctype.
void test01()
{
using namespace std;
typedef numpunct<podchar_type>::string_type string_type;
typedef basic_stringbuf<podchar_type> stringbuf_type;
typedef basic_ostream<podchar_type> ostream_type;
using __gnu_test::pod_type;
using __gnu_test::value_type;
typedef numpunct<pod_type>::string_type string_type;
typedef basic_stringbuf<pod_type> stringbuf_type;
typedef basic_ostream<pod_type> ostream_type;
bool test __attribute__((unused)) = true;
// Pre-cache sanity check.
const locale loc(locale::classic(), new numpunct<podchar_type>);
const numpunct<podchar_type>& np = use_facet<numpunct<podchar_type> >(loc);
const locale loc(locale::classic(), new numpunct<pod_type>);
const numpunct<pod_type>& np = use_facet<numpunct<pod_type> >(loc);
podchar_type dp = np.decimal_point();
podchar_type ts = np.thousands_sep();
pod_type dp = np.decimal_point();
pod_type ts = np.thousands_sep();
string g = np.grouping();
string_type strue = np.truename();
string_type sfalse = np.falsename();
podchar_type basedp = { value_type('.') };
podchar_type basets = { value_type(',') };
pod_type basedp = { value_type('.') };
pod_type basets = { value_type(',') };
string_type basetrue(4, podchar_type());
string_type basetrue(4, pod_type());
basetrue[0].value = value_type('t');
basetrue[1].value = value_type('r');
basetrue[2].value = value_type('u');
basetrue[3].value = value_type('e');
string_type basefalse(5, podchar_type());
string_type basefalse(5, pod_type());
basefalse[0].value = value_type('f');
basefalse[1].value = value_type('a');
basefalse[2].value = value_type('l');
basefalse[3].value = value_type('s');
basefalse[4].value = value_type('e');
VERIFY( char_traits<podchar_type>::eq(dp, basedp) );
VERIFY( char_traits<podchar_type>::eq(ts, basets) );
VERIFY( char_traits<pod_type>::eq(dp, basedp) );
VERIFY( char_traits<pod_type>::eq(ts, basets) );
VERIFY( g == "" );
VERIFY( strue == basetrue );
VERIFY( sfalse == basefalse );
......
......@@ -25,165 +25,15 @@
#include <ext/pod_char_traits.h>
#include <testsuite_hooks.h>
typedef unsigned short value_type;
typedef unsigned int int_type;
typedef __gnu_cxx::character<value_type, int_type> podchar_type;
// Member specializations for the existing facet classes.
// NB: This isn't especially portable. Perhaps a better way would be
// to just specialize all of numpunct and ctype.
namespace std
{
template<>
bool
ctype<podchar_type>::
do_is(mask, char_type) const { return true; }
template<>
const podchar_type*
ctype<podchar_type>::
do_is(const char_type* __lo, const char_type*, mask*) const
{ return __lo; }
template<>
const podchar_type*
ctype<podchar_type>::
do_scan_is(mask, const char_type* __lo, const char_type*) const
{ return __lo; }
template<>
const podchar_type*
ctype<podchar_type>::
do_scan_not(mask, const char_type* __lo, const char_type*) const
{ return __lo; }
template<>
podchar_type
ctype<podchar_type>::
do_toupper(char_type __c) const
{ return __c; }
template<>
const podchar_type*
ctype<podchar_type>::
do_toupper(char_type*, const char_type* __hi) const
{ return __hi; }
template<>
podchar_type
ctype<podchar_type>::
do_tolower(char_type __c) const
{ return __c; }
template<>
const podchar_type*
ctype<podchar_type>::
do_tolower(char_type*, const char_type* __hi) const
{ return __hi; }
template<>
podchar_type
ctype<podchar_type>::
do_widen(char __c) const
{
char_type ret = { value_type(__c) };
return ret;
}
template<>
const char*
ctype<podchar_type>::
do_widen(const char* __lo, const char* __hi, char_type* __dest) const
{
while (__lo < __hi)
{
*__dest = this->do_widen(*__lo);
++__lo;
++__dest;
}
return __hi;
}
template<>
char
ctype<podchar_type>::
do_narrow(char_type __wc, char) const
{ return static_cast<char>(__wc.value); }
template<>
const podchar_type*
ctype<podchar_type>::
do_narrow(const podchar_type* __lo, const podchar_type* __hi,
char, char* __dest) const
{
while (__lo < __hi)
{
*__dest = this->do_narrow(*__lo, char());
++__lo;
++__dest;
}
return __hi;
}
template<>
ctype<podchar_type>::~ctype() { }
template<>
void
numpunct<podchar_type>::_M_initialize_numpunct(__c_locale)
{
if (!_M_data)
_M_data = new __numpunct_cache<podchar_type>;
_M_data->_M_grouping = "";
_M_data->_M_use_grouping = false;
_M_data->_M_decimal_point.value = value_type('.');
_M_data->_M_thousands_sep.value = value_type(',');
for (size_t i = 0; i < __num_base::_S_oend; ++i)
{
value_type v = __num_base::_S_atoms_out[i];
_M_data->_M_atoms_out[i].value = v;
}
_M_data->_M_atoms_out[__num_base::_S_oend] = podchar_type();
for (size_t i = 0; i < __num_base::_S_iend; ++i)
_M_data->_M_atoms_in[i].value = value_type(__num_base::_S_atoms_in[i]);
_M_data->_M_atoms_in[__num_base::_S_iend] = podchar_type();
// "true"
podchar_type* __truename = new podchar_type[4 + 1];
__truename[0].value = value_type('t');
__truename[1].value = value_type('r');
__truename[2].value = value_type('u');
__truename[3].value = value_type('e');
__truename[4] = podchar_type();
_M_data->_M_truename = __truename;
// "false"
podchar_type* __falsename = new podchar_type[5 + 1];
__falsename[0].value = value_type('f');
__falsename[1].value = value_type('a');
__falsename[2].value = value_type('l');
__falsename[3].value = value_type('s');
__falsename[4].value = value_type('e');
__falsename[5] = podchar_type();
_M_data->_M_falsename = __falsename;
}
template<>
numpunct<podchar_type>::~numpunct()
{ delete _M_data; }
}
// Check for numpunct and ctype dependencies. Make sure that numpunct
// can be created without ctype.
void test01()
{
using namespace std;
typedef numpunct<podchar_type>::string_type string_type;
typedef basic_ostringstream<podchar_type> ostream_type;
using __gnu_test::pod_type;
typedef numpunct<pod_type>::string_type string_type;
typedef basic_ostringstream<pod_type> ostream_type;
bool test = true;
......@@ -208,7 +58,7 @@ void test01()
VERIFY( test );
// 2: fail, no ctype
const locale loc2(loc, new num_put<podchar_type>);
const locale loc2(loc, new num_put<pod_type>);
os.clear();
os.imbue(loc2);
try
......@@ -224,7 +74,7 @@ void test01()
VERIFY( test );
// 3: fail, no numpunct
const locale loc3(loc, new ctype<podchar_type>);
const locale loc3(loc, new ctype<pod_type>);
os.clear();
os.imbue(loc3);
try
......@@ -240,7 +90,7 @@ void test01()
VERIFY( test );
// 4: works.
const locale loc4(loc3, new numpunct<podchar_type>);
const locale loc4(loc3, new numpunct<pod_type>);
os.clear();
os.imbue(loc4);
try
......
// 2001-06-05 Benjamin Kosnik <bkoz@redhat.com>
// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.4.2.1.6 class ios_base::init
#include <sstream>
#include <typeinfo>
#include <testsuite_hooks.h>
// libstdc++/3983
// Sentry uses locale info, so have to try one formatted input/output.
void test03()
{
using namespace std;
using __gnu_test::pod_type;
using __gnu_test::value_type;
typedef basic_stringbuf<pod_type> stringbuf_type;
typedef basic_istream<pod_type> istream_type;
stringbuf_type strbuf01;
istream_type iss(&strbuf01);
bool test __attribute__((unused)) = true;
try
{
int i;
iss >> i;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ VERIFY( false ); }
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<__gnu_test::pod_type>::size_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
template
__gnu_test::pod_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
#endif
int main()
{
test03();
return 0;
}
// 2001-06-05 Benjamin Kosnik <bkoz@redhat.com>
// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.4.2.1.6 class ios_base::init
#include <sstream>
#include <typeinfo>
#include <testsuite_hooks.h>
// libstdc++/3983
// Sentry uses locale info, so have to try one formatted input/output.
void test03()
{
using namespace std;
using __gnu_test::pod_type;
using __gnu_test::value_type;
typedef basic_stringbuf<pod_type> stringbuf_type;
typedef basic_istream<pod_type> istream_type;
stringbuf_type strbuf01;
istream_type iss(&strbuf01);
bool test __attribute__((unused)) = true;
// input streams
pod_type arr[6] = { value_type('a'), value_type('b'),
value_type('c'), value_type('d'), value_type('e') };
try
{
iss >> arr;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ VERIFY( false ); }
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<__gnu_test::pod_type>::size_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
template
__gnu_test::pod_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
#endif
int main()
{
test03();
return 0;
}
// 2001-06-05 Benjamin Kosnik <bkoz@redhat.com>
// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.4.2.1.6 class ios_base::init
#include <sstream>
#include <typeinfo>
#include <testsuite_hooks.h>
// libstdc++/3983
// Sentry uses locale info, so have to try one formatted input/output.
void test03()
{
using namespace std;
using __gnu_test::pod_type;
using __gnu_test::value_type;
typedef basic_stringbuf<pod_type> stringbuf_type;
typedef basic_istream<pod_type> istream_type;
stringbuf_type strbuf01;
istream_type iss(&strbuf01);
bool test __attribute__((unused)) = true;
try
{
iss >> std::ws;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ VERIFY( false ); }
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<__gnu_test::pod_type>::size_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
template
__gnu_test::pod_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
#endif
int main()
{
test03();
return 0;
}
// 2001-06-05 Benjamin Kosnik <bkoz@redhat.com>
// Copyright (C) 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.4.2.1.6 class ios_base::init
#include <fstream>
#include <typeinfo>
#include <testsuite_hooks.h>
// char_traits specialization
namespace std
{
template<>
struct char_traits<unsigned char>
{
typedef unsigned char char_type;
// Unsigned as wint_t in unsigned.
typedef unsigned long int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef mbstate_t state_type;
static void
assign(char_type& __c1, const char_type& __c2)
{ __c1 = __c2; }
static bool
eq(const char_type& __c1, const char_type& __c2)
{ return __c1 == __c2; }
static bool
lt(const char_type& __c1, const char_type& __c2)
{ return __c1 < __c2; }
static int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{
for (size_t __i = 0; __i < __n; ++__i)
if (!eq(__s1[__i], __s2[__i]))
return lt(__s1[__i], __s2[__i]) ? -1 : 1;
return 0;
}
static size_t
length(const char_type* __s)
{
const char_type* __p = __s;
while (__p && *__p)
++__p;
return (__p - __s);
}
static const char_type*
find(const char_type* __s, size_t __n, const char_type& __a)
{
for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
if (*__p == __a) return __p;
return 0;
}
static char_type*
move(char_type* __s1, const char_type* __s2, size_t __n)
{ return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
static char_type*
copy(char_type* __s1, const char_type* __s2, size_t __n)
{ return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
static char_type*
assign(char_type* __s, size_t __n, char_type __a)
{
for (char_type* __p = __s; __p < __s + __n; ++__p)
assign(*__p, __a);
return __s;
}
static char_type
to_char_type(const int_type& __c)
{ return char_type(); }
static int_type
to_int_type(const char_type& __c) { return int_type(); }
static bool
eq_int_type(const int_type& __c1, const int_type& __c2)
{ return __c1 == __c2; }
static int_type
eof() { return static_cast<int_type>(-1); }
static int_type
not_eof(const int_type& __c)
{ return eq_int_type(__c, eof()) ? int_type(0) : __c; }
};
} // namespace std
// libstdc++/3983
// Sentry uses locale info, so have to try one formatted input/output.
void test03()
{
bool test __attribute__((unused)) = true;
// input streams
std::basic_ifstream<unsigned char> ifs_uc;
unsigned char arr[6] = { 'a', 'b', 'c', 'd', 'e' };
try
{
int i;
ifs_uc >> i;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ test = false; }
try
{
ifs_uc >> arr;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ test = false; }
try
{
ifs_uc >> std::ws;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ test = false; }
try
{
std::basic_string<unsigned char> s_uc(arr);
ifs_uc >> s_uc;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ test = false; }
VERIFY( test );
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<unsigned char>::size_type
std::basic_string<unsigned char>::_Rep::_S_max_size;
template
unsigned char
std::basic_string<unsigned char>::_Rep::_S_terminal;
#endif
int main()
{
test03();
return 0;
}
// 2001-06-05 Benjamin Kosnik <bkoz@redhat.com>
// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.4.2.1.6 class ios_base::init
#include <sstream>
#include <typeinfo>
#include <testsuite_hooks.h>
// char_traits specialization
namespace std
{
template<>
struct char_traits<unsigned char>
{
typedef unsigned char char_type;
// Unsigned as wint_t in unsigned.
typedef unsigned long int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef mbstate_t state_type;
static void
assign(char_type& __c1, const char_type& __c2)
{ __c1 = __c2; }
static bool
eq(const char_type& __c1, const char_type& __c2)
{ return __c1 == __c2; }
static bool
lt(const char_type& __c1, const char_type& __c2)
{ return __c1 < __c2; }
static int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{
for (size_t __i = 0; __i < __n; ++__i)
if (!eq(__s1[__i], __s2[__i]))
return lt(__s1[__i], __s2[__i]) ? -1 : 1;
return 0;
}
static size_t
length(const char_type* __s)
{
const char_type* __p = __s;
while (__p && *__p)
++__p;
return (__p - __s);
}
static const char_type*
find(const char_type* __s, size_t __n, const char_type& __a)
{
for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
if (*__p == __a) return __p;
return 0;
}
static char_type*
move(char_type* __s1, const char_type* __s2, size_t __n)
{ return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
static char_type*
copy(char_type* __s1, const char_type* __s2, size_t __n)
{ return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
static char_type*
assign(char_type* __s, size_t __n, char_type __a)
{
for (char_type* __p = __s; __p < __s + __n; ++__p)
assign(*__p, __a);
return __s;
}
static char_type
to_char_type(const int_type& __c)
{ return char_type(); }
static int_type
to_int_type(const char_type& __c) { return int_type(); }
static bool
eq_int_type(const int_type& __c1, const int_type& __c2)
{ return __c1 == __c2; }
static int_type
eof() { return static_cast<int_type>(-1); }
static int_type
not_eof(const int_type& __c)
{ return eq_int_type(__c, eof()) ? int_type(0) : __c; }
};
} // namespace std
// libstdc++/3983
// Sentry uses locale info, so have to try one formatted input/output.
void test03()
{
bool test __attribute__((unused)) = true;
// input streams
std::basic_istringstream<unsigned char> iss_uc;
unsigned char arr[6] = { 'a', 'b', 'c', 'd', 'e' };
try
{
int i;
iss_uc >> i;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ test = false; }
try
{
iss_uc >> arr;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ test = false; }
try
{
iss_uc >> std::ws;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ test = false; }
try
{
std::basic_string<unsigned char> s_uc(arr);
iss_uc >> s_uc;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ test = false; }
VERIFY( test );
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<unsigned char>::size_type
std::basic_string<unsigned char>::_Rep::_S_max_size;
template
unsigned char
std::basic_string<unsigned char>::_Rep::_S_terminal;
#endif
int main()
{
test03();
return 0;
}
// 1999-10-14 bkoz
// Copyright (C) 1999, 2001, 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.6.1.1.2 class basic_istream::sentry
#include <istream>
#include <sstream>
#include <ext/pod_char_traits.h>
#include <testsuite_hooks.h>
void test01()
{
using namespace std;
using __gnu_test::pod_type;
typedef basic_string<pod_type> string_type;
typedef basic_stringbuf<pod_type> stringbuf_type;
typedef basic_istream<pod_type> istream_type;
bool test __attribute__((unused)) = true;
const string_type str01;
stringbuf_type strbuf01;
stringbuf_type strbuf02(str01);
istream_type istr01(&strbuf01);
istream_type istr02(&strbuf02);
// test negatives
try
{
istream_type::sentry sentry01(istr01);
}
catch (std::bad_cast& obj)
{
// Ok, throws bad_cast because locale has no ctype facet.
}
catch (...)
{
VERIFY( false );
}
try
{
istream_type::sentry sentry02(istr01, true);
}
catch (std::bad_cast& obj)
{
// Ok, throws bad_cast because locale has no ctype facet.
}
catch (...)
{
VERIFY( false );
}
// imbued.
const std::locale loc(std::locale::classic(), new std::ctype<pod_type>);
istr01.imbue(loc);
try
{
istream_type::sentry sentry01(istr01);
VERIFY( bool(sentry01) == false );
}
catch (...)
{
VERIFY( false );
}
try
{
istream_type::sentry sentry02(istr01, true);
VERIFY( bool(sentry02) == false );
}
catch (...)
{
VERIFY( false );
}
// test positive
try
{
istream_type::sentry sentry03(istr02);
}
catch (std::bad_cast& obj)
{
// Ok, throws bad_cast because locale has no ctype facet.
}
catch (...)
{
VERIFY( false );
}
try
{
istream_type::sentry sentry04(istr02, true);
}
catch (std::bad_cast& obj)
{
// Ok, throws bad_cast because locale has no ctype facet.
}
catch (...)
{
VERIFY( false );
}
// imbued.
istr02.imbue(loc);
try
{
istr02.clear();
istream_type::sentry sentry03(istr02);
// ... as eofbit set.
VERIFY( bool(sentry03) == false );
}
catch (...)
{
VERIFY( false );
}
try
{
istr02.clear();
istream_type::sentry sentry04(istr02, true);
VERIFY( bool(sentry04) == true );
}
catch (...)
{
VERIFY( false );
}
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<__gnu_test::pod_type>::size_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
template
__gnu_test::pod_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
#endif
int main()
{
test01();
return 0;
}
// 2001-06-05 Benjamin Kosnik <bkoz@redhat.com>
// Copyright (C) 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.4.2.1.6 class ios_base::init
#include <fstream>
#include <typeinfo>
#include <testsuite_hooks.h>
// char_traits specialization
namespace std
{
template<>
struct char_traits<unsigned char>
{
typedef unsigned char char_type;
// Unsigned as wint_t in unsigned.
typedef unsigned long int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef mbstate_t state_type;
static void
assign(char_type& __c1, const char_type& __c2)
{ __c1 = __c2; }
static bool
eq(const char_type& __c1, const char_type& __c2)
{ return __c1 == __c2; }
static bool
lt(const char_type& __c1, const char_type& __c2)
{ return __c1 < __c2; }
static int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{
for (size_t __i = 0; __i < __n; ++__i)
if (!eq(__s1[__i], __s2[__i]))
return lt(__s1[__i], __s2[__i]) ? -1 : 1;
return 0;
}
static size_t
length(const char_type* __s)
{
const char_type* __p = __s;
while (__p && *__p)
++__p;
return (__p - __s);
}
static const char_type*
find(const char_type* __s, size_t __n, const char_type& __a)
{
for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
if (*__p == __a) return __p;
return 0;
}
static char_type*
move(char_type* __s1, const char_type* __s2, size_t __n)
{ return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
static char_type*
copy(char_type* __s1, const char_type* __s2, size_t __n)
{ return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
static char_type*
assign(char_type* __s, size_t __n, char_type __a)
{
for (char_type* __p = __s; __p < __s + __n; ++__p)
assign(*__p, __a);
return __s;
}
static char_type
to_char_type(const int_type& __c)
{ return char_type(); }
static int_type
to_int_type(const char_type& __c) { return int_type(); }
static bool
eq_int_type(const int_type& __c1, const int_type& __c2)
{ return __c1 == __c2; }
static int_type
eof() { return static_cast<int_type>(-1); }
static int_type
not_eof(const int_type& __c)
{ return eq_int_type(__c, eof()) ? int_type(0) : __c; }
};
} // namespace std
// libstdc++/3983
// Sentry uses locale info, so have to try one formatted input/output.
void test03()
{
bool test __attribute__((unused)) = true;
// output streams
std::basic_ofstream<unsigned char> ofs_uc;
try
{
bool b = true;
ofs_uc << b;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ test = false; }
VERIFY( test );
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<unsigned char>::size_type
std::basic_string<unsigned char>::_Rep::_S_max_size;
template
unsigned char
std::basic_string<unsigned char>::_Rep::_S_terminal;
#endif
int main()
{
test03();
return 0;
}
// 2001-06-05 Benjamin Kosnik <bkoz@redhat.com>
// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.4.2.1.6 class ios_base::init
#include <sstream>
#include <typeinfo>
#include <testsuite_hooks.h>
// char_traits specialization
namespace std
{
template<>
struct char_traits<unsigned char>
{
typedef unsigned char char_type;
// Unsigned as wint_t in unsigned.
typedef unsigned long int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef mbstate_t state_type;
static void
assign(char_type& __c1, const char_type& __c2)
{ __c1 = __c2; }
static bool
eq(const char_type& __c1, const char_type& __c2)
{ return __c1 == __c2; }
static bool
lt(const char_type& __c1, const char_type& __c2)
{ return __c1 < __c2; }
static int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{
for (size_t __i = 0; __i < __n; ++__i)
if (!eq(__s1[__i], __s2[__i]))
return lt(__s1[__i], __s2[__i]) ? -1 : 1;
return 0;
}
static size_t
length(const char_type* __s)
{
const char_type* __p = __s;
while (__p && *__p)
++__p;
return (__p - __s);
}
static const char_type*
find(const char_type* __s, size_t __n, const char_type& __a)
{
for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
if (*__p == __a) return __p;
return 0;
}
static char_type*
move(char_type* __s1, const char_type* __s2, size_t __n)
{ return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
static char_type*
copy(char_type* __s1, const char_type* __s2, size_t __n)
{ return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
static char_type*
assign(char_type* __s, size_t __n, char_type __a)
{
for (char_type* __p = __s; __p < __s + __n; ++__p)
assign(*__p, __a);
return __s;
}
static char_type
to_char_type(const int_type& __c)
{ return char_type(); }
static int_type
to_int_type(const char_type& __c) { return int_type(); }
static bool
eq_int_type(const int_type& __c1, const int_type& __c2)
{ return __c1 == __c2; }
static int_type
eof() { return static_cast<int_type>(-1); }
static int_type
not_eof(const int_type& __c)
{ return eq_int_type(__c, eof()) ? int_type(0) : __c; }
};
} // namespace std
// libstdc++/3983
// Sentry uses locale info, so have to try one formatted input/output.
void test03()
{
bool test __attribute__((unused)) = true;
// output streams
std::basic_ostringstream<unsigned char> oss_uc;
try
{
bool b = true;
oss_uc << b;
}
catch (std::bad_cast& obj)
{ }
catch (std::exception& obj)
{ test = false; }
VERIFY( test );
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<unsigned char>::size_type
std::basic_string<unsigned char>::_Rep::_S_max_size;
template
unsigned char
std::basic_string<unsigned char>::_Rep::_S_terminal;
#endif
int main()
{
test03();
return 0;
}
// 1999-10-14 bkoz
// Copyright (C) 1999, 2001, 2003 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// 27.6.1.1.2 class basic_istream::sentry
#include <ostream>
#include <sstream>
#include <ext/pod_char_traits.h>
#include <testsuite_hooks.h>
void test01()
{
using namespace std;
using __gnu_test::pod_type;
typedef basic_string<pod_type> string_type;
typedef basic_stringbuf<pod_type> stringbuf_type;
typedef basic_ostream<pod_type> ostream_type;
bool test __attribute__((unused)) = true;
const string_type str01;
stringbuf_type* strbuf01 = NULL;
stringbuf_type strbuf02(str01);
ostream_type ostr01(strbuf01);
ostream_type ostr02(&strbuf02);
// test negatives
try
{
ostream_type::sentry sentry01(ostr01);
}
catch (std::bad_cast& obj)
{
// Not ok, throws bad_cast because locale has no ctype facet,
// but none is needed for ostream::sentry.
VERIFY( false );
}
catch (...)
{
VERIFY( false );
}
// imbued.
const std::locale loc(std::locale::classic(), new std::ctype<pod_type>);
ostr01.imbue(loc);
try
{
ostream_type::sentry sentry01(ostr01);
VERIFY( bool(sentry01) == false );
}
catch (...)
{
VERIFY( false );
}
// test positive
try
{
ostream_type::sentry sentry03(ostr02);
}
catch (std::bad_cast& obj)
{
// Not ok, throws bad_cast because locale has no ctype facet,
// but none is needed for ostream::sentry.
VERIFY( false );
}
catch (...)
{
VERIFY( false );
}
// imbued.
ostr02.clear();
ostr02.imbue(loc);
try
{
ostream_type::sentry sentry03(ostr02);
VERIFY( bool(sentry03) == true );
}
catch (...)
{
VERIFY( false );
}
}
#if !__GXX_WEAK__
// Explicitly instantiate for systems with no COMDAT or weak support.
template
std::basic_string<__gnu_test::pod_type>::size_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_max_size;
template
__gnu_test::pod_type
std::basic_string<__gnu_test::pod_type>::_Rep::_S_terminal;
#endif
int main()
{
test01();
return 0;
}
......@@ -215,4 +215,156 @@ namespace __gnu_test
unsigned int assignment_operator::throw_on_ = 0;
unsigned int destructor::_M_count = 0;
int copy_tracker::next_id_ = 0;
}; // namespace __cxx_test
}; // namespace __gnu_test
namespace std
{
// Member specializations for the existing facet classes.
// NB: This isn't especially portable. Perhaps a better way would be
// to just specialize all of numpunct and ctype.
using __gnu_test::int_type;
using __gnu_test::value_type;
using __gnu_test::pod_type;
template<>
bool
ctype<pod_type>::
do_is(mask, char_type) const { return true; }
template<>
const pod_type*
ctype<pod_type>::
do_is(const char_type* __lo, const char_type*, mask*) const
{ return __lo; }
template<>
const pod_type*
ctype<pod_type>::
do_scan_is(mask, const char_type* __lo, const char_type*) const
{ return __lo; }
template<>
const pod_type*
ctype<pod_type>::
do_scan_not(mask, const char_type* __lo, const char_type*) const
{ return __lo; }
template<>
pod_type
ctype<pod_type>::
do_toupper(char_type __c) const
{ return __c; }
template<>
const pod_type*
ctype<pod_type>::
do_toupper(char_type*, const char_type* __hi) const
{ return __hi; }
template<>
pod_type
ctype<pod_type>::
do_tolower(char_type __c) const
{ return __c; }
template<>
const pod_type*
ctype<pod_type>::
do_tolower(char_type*, const char_type* __hi) const
{ return __hi; }
template<>
pod_type
ctype<pod_type>::
do_widen(char __c) const
{
char_type ret = { value_type(__c) };
return ret;
}
template<>
const char*
ctype<pod_type>::
do_widen(const char* __lo, const char* __hi, char_type* __dest) const
{
while (__lo < __hi)
{
*__dest = this->do_widen(*__lo);
++__lo;
++__dest;
}
return __hi;
}
template<>
char
ctype<pod_type>::
do_narrow(char_type __wc, char) const
{ return static_cast<char>(__wc.value); }
template<>
const pod_type*
ctype<pod_type>::
do_narrow(const pod_type* __lo, const pod_type* __hi,
char, char* __dest) const
{
while (__lo < __hi)
{
*__dest = this->do_narrow(*__lo, char());
++__lo;
++__dest;
}
return __hi;
}
template<>
ctype<pod_type>::~ctype() { }
template<>
void
numpunct<pod_type>::_M_initialize_numpunct(__c_locale)
{
if (!_M_data)
_M_data = new __numpunct_cache<pod_type>;
_M_data->_M_grouping = "";
_M_data->_M_use_grouping = false;
_M_data->_M_decimal_point.value = value_type('.');
_M_data->_M_thousands_sep.value = value_type(',');
for (size_t i = 0; i < __num_base::_S_oend; ++i)
{
value_type v = __num_base::_S_atoms_out[i];
_M_data->_M_atoms_out[i].value = v;
}
_M_data->_M_atoms_out[__num_base::_S_oend] = pod_type();
for (size_t i = 0; i < __num_base::_S_iend; ++i)
_M_data->_M_atoms_in[i].value = value_type(__num_base::_S_atoms_in[i]);
_M_data->_M_atoms_in[__num_base::_S_iend] = pod_type();
// "true"
pod_type* __truename = new pod_type[4 + 1];
__truename[0].value = value_type('t');
__truename[1].value = value_type('r');
__truename[2].value = value_type('u');
__truename[3].value = value_type('e');
__truename[4] = pod_type();
_M_data->_M_truename = __truename;
// "false"
pod_type* __falsename = new pod_type[5 + 1];
__falsename[0].value = value_type('f');
__falsename[1].value = value_type('a');
__falsename[2].value = value_type('l');
__falsename[3].value = value_type('s');
__falsename[4].value = value_type('e');
__falsename[5] = pod_type();
_M_data->_M_falsename = __falsename;
}
template<>
numpunct<pod_type>::~numpunct()
{ delete _M_data; }
} // namespace std
......@@ -61,13 +61,16 @@
#include <bits/c++config.h>
#include <bits/functexcept.h>
#include <cstddef>
#include <locale>
#include <ext/pod_char_traits.h>
#ifdef _GLIBCXX_ASSERT
# include <cassert>
# define VERIFY(fn) assert(fn)
#else
# define VERIFY(fn) test &= (fn)
#endif
#include <locale>
#ifdef _GLIBCXX_HAVE_UNISTD_H
# include <unistd.h>
#else
......@@ -156,6 +159,10 @@ namespace __gnu_test
unsigned long l2;
};
typedef unsigned short value_type;
typedef unsigned int int_type;
typedef __gnu_cxx::character<value_type, int_type> pod_type;
// Counting.
struct counter
......@@ -336,51 +343,90 @@ namespace std
{
typedef __gnu_test::pod_char char_type;
typedef __gnu_test::pod_int int_type;
typedef long pos_type;
typedef long off_type;
typedef __gnu_test::state state_type;
typedef fpos<state_type> pos_type;
typedef streamoff off_type;
static void
assign(char_type& __c1, const char_type& __c2);
assign(char_type& c1, const char_type& c2)
{ c1.c = c2.c; }
static bool
eq(const char_type& __c1, const char_type& __c2);
eq(const char_type& c1, const char_type& c2)
{ return c1.c == c2.c; }
static bool
lt(const char_type& __c1, const char_type& __c2);
lt(const char_type& c1, const char_type& c2)
{ return c1.c < c2.c; }
static int
compare(const char_type* __s1, const char_type* __s2, size_t __n);
compare(const char_type* s1, const char_type* s2, size_t n)
{ return memcmp(s1, s2, n); }
static size_t
length(const char_type* __s);
length(const char_type* s)
{ return strlen(reinterpret_cast<const char*>(s)); }
static const char_type*
find(const char_type* __s, size_t __n, const char_type& __a);
find(const char_type* s, size_t n, const char_type& a)
{ return static_cast<const char_type*>(memchr(s, a.c, n)); }
static char_type*
move(char_type* __s1, const char_type* __s2, size_t __n);
move(char_type* s1, const char_type* s2, size_t n)
{
memmove(s1, s2, n);
return s1;
}
static char_type*
copy(char_type* __s1, const char_type* __s2, size_t __n);
copy(char_type* s1, const char_type* s2, size_t n)
{
memcpy(s1, s2, n);
return s1;
}
static char_type*
assign(char_type* __s, size_t __n, char_type __a);
assign(char_type* s, size_t n, char_type a)
{
memset(s, a.c, n);
return s;
}
static char_type
to_char_type(const int_type& __c);
to_char_type(const int_type& c)
{
char_type ret;
ret.c = static_cast<unsigned char>(c.i);
return ret;
}
static int_type
to_int_type(const char_type& __c);
to_int_type(const char_type& c)
{
int_type ret;
ret.i = c.c;
return ret;
}
static bool
eq_int_type(const int_type& __c1, const int_type& __c2);
eq_int_type(const int_type& c1, const int_type& c2)
{ return c1.i == c2.i; }
static int_type
eof();
eof()
{
int_type n;
n.i = -10;
return n;
}
static int_type
not_eof(const int_type& __c);
not_eof(const int_type& c)
{
if (eq_int_type(c, eof()))
return int_type();
return c;
}
};
} // namespace std
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment