diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index acda82529d9..2e63a936c10 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,25 @@ +2000-12-22 Benjamin Kosnik + + Attempt to make locale visible in gdb. + * include/bits/std_locale.h: Remove codecvt.h include. + * include/bits/locale_facets.h: Add here, after ctype decls. + * include/bits/codecvt.h: Remove std namespace, as assumed to be + in std now. + + * include/bits/locale_facets.h: Consistently move generic static + member definitions directly after generic facet declarations. + * include/bits/locale_facets.tcc: From here. + + * src/locale.cc: Organize locale::id static definitions for + required facets. + * src/codecvt.cc (codecvt): Remove locale::id definition. + (codecvt): Same. + * src/localename: And here. + + * include/bits/localefwd.h (_Count_ones): Change _S_count to _M_count. + Same for _M_halfcount. + (std): make locale::_Impl protected. CHANGE BACK + 2000-12-22 Alexandre Oliva * mknumeric_limits: Output to temporary files, and rename them at diff --git a/libstdc++-v3/include/bits/codecvt.h b/libstdc++-v3/include/bits/codecvt.h index 8b90b94bfb3..8873298e476 100644 --- a/libstdc++-v3/include/bits/codecvt.h +++ b/libstdc++-v3/include/bits/codecvt.h @@ -38,14 +38,6 @@ #ifndef _CPP_BITS_CODECVT_H #define _CPP_BITS_CODECVT_H 1 -#include -#ifdef _GLIBCPP_USE_WCHAR_T -#include // For iconv, iconv_t -#include -#endif - -namespace std -{ // XXX // __enc_traits may need to move up the locale header hierarchy, // depending on if ctype ends up using it. @@ -714,7 +706,6 @@ namespace std virtual ~codecvt_byname() { } }; -} // 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 51e727642cf..6d3b3a358b3 100644 --- a/libstdc++-v3/include/bits/locale_facets.h +++ b/libstdc++-v3/include/bits/locale_facets.h @@ -41,6 +41,8 @@ #include // For ios_base #ifdef _GLIBCPP_USE_WCHAR_T # include // For wctype_t +# include // For codecvt using iconv, iconv_t +# include // For codecvt using nl_langinfo #endif namespace std @@ -78,11 +80,10 @@ namespace std _Use_facet_failure_handler(const locale&) { throw _Bad_use_facet(); } - // 22.2.1 The ctype category + // 22.2.1.1 Template class ctype // Include host-specific ctype enums for ctype_base. #include - // 22.2.1.1 Template class ctype // __ctype_abstract_base is the common base for ctype<_CharT>. template class __ctype_abstract_base : public locale::facet, public ctype_base @@ -208,6 +209,9 @@ namespace std ~ctype() { } }; + template + locale::id ctype<_CharT>::id; + // 22.2.1.3 ctype specializations template<> class ctype : public __ctype_abstract_base @@ -395,6 +399,9 @@ namespace std ctype_byname::ctype_byname(const char*, size_t refs); + // 22.2.1.5 Template class codecvt + #include + template class _Numeric_get; // forward @@ -495,6 +502,13 @@ namespace std _S_callback(ios_base::event __event, ios_base& __ios, int __ix) throw(); }; + template + int _Format_cache<_CharT>::_S_pword_ix; + + template + const char _Format_cache<_CharT>:: + _S_literals[] = "-+xX0123456789abcdef0123456789ABCDEF"; + template<> _Format_cache::_Format_cache(); #ifdef _GLIBCPP_USE_WCHAR_T template<> _Format_cache::_Format_cache(); @@ -679,6 +693,9 @@ namespace std void*&) const; }; + template + locale::id num_get<_CharT, _InIter>::id; + // Declare specialized extraction member function. template<> void @@ -788,6 +805,9 @@ namespace std do_put(iter_type, ios_base&, char_type __fill, const void* __v) const; }; + template + locale::id num_put<_CharT, _OutIter>::id; + template class _Punct : public locale::facet { @@ -841,7 +861,6 @@ namespace std _M_thousands_sep = __t; _M_grouping = __g; } - }; template @@ -887,7 +906,6 @@ namespace std _M_truename = __t; _M_falsename = __f; } - }; template @@ -901,12 +919,15 @@ namespace std explicit numpunct(size_t __refs = 0) : _Numpunct<_CharT>(__refs) { } - protected: + protected: virtual ~numpunct() { } }; + template + locale::id numpunct<_CharT>::id; + template<> numpunct::numpunct(size_t __refs): _Numpunct(__refs) { @@ -1001,6 +1022,9 @@ namespace std ~collate() { } }; + template + locale::id collate<_CharT>::id; + template<> class collate : public _Collate { @@ -1170,6 +1194,9 @@ namespace std mutable basic_string<_CharT>* _M_monthnames; }; + template + locale::id time_get<_CharT, _InIter>::id; + template class time_get_byname : public time_get<_CharT, _InIter> { @@ -1219,6 +1246,9 @@ namespace std { return __s; } }; + template + locale::id time_put<_CharT, _OutIter>::id; + template class time_put_byname : public time_put<_CharT, _OutIter> { @@ -1276,6 +1306,9 @@ namespace std { return __s; } }; + template + locale::id money_get<_CharT, _InIter>::id; + template class money_put : public locale::facet { @@ -1314,6 +1347,9 @@ namespace std { return __s; } }; + template + locale::id money_put<_CharT, _OutIter>::id; + struct money_base { enum part { none, space, symbol, sign, value }; @@ -1404,6 +1440,12 @@ namespace std ~moneypunct() { } }; + template + locale::id moneypunct<_CharT, _Intl>::id; + + template + const bool moneypunct<_CharT, _Intl>::intl; + template class moneypunct_byname : public moneypunct<_CharT,_Intl> { @@ -1420,6 +1462,9 @@ namespace std ~moneypunct_byname() { } }; + template + const bool moneypunct_byname<_CharT, _Intl>::intl; + template<> moneypunct_byname:: moneypunct_byname(const char*, size_t __refs); @@ -1495,6 +1540,9 @@ namespace std ~messages() { } }; + template + locale::id messages<_CharT>::id; + template class messages_byname : public messages<_CharT> { @@ -1584,7 +1632,6 @@ namespace std inline _CharT tolower(_CharT __c, const locale& __loc) { return use_facet >(__loc).tolower(__c); } - } // namespace std #endif /* _CPP_BITS_LOCFACETS_H */ @@ -1592,4 +1639,3 @@ namespace std // Local Variables: // mode:c++ // End: - diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index ad45c3374df..e0a0dbdefb4 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -158,16 +158,6 @@ namespace std return __s; } - template - locale::id ctype<_CharT>::id; - - template - int _Format_cache<_CharT>::_S_pword_ix; - - template - const char _Format_cache<_CharT>:: - _S_literals[] = "-+xX0123456789abcdef0123456789ABCDEF"; - template _Format_cache<_CharT>::_Format_cache() : _M_valid(true), _M_use_grouping(false) @@ -244,9 +234,6 @@ namespace std return __ncp; } - template - locale::id num_get<_CharT, _InIter>::id; - // This member function takes an (w)istreambuf_iterator object and // parses it into a generic char array suitable for parsing with // strto[l,ll,f,d]. The thought was to encapsulate the conversion @@ -729,9 +716,6 @@ namespace std return __beg; } - template - locale::id num_put<_CharT, _OutIter>::id; - // _S_fill is specialized for ostreambuf_iterator, random access iterator. template inline _OutIter @@ -1119,12 +1103,6 @@ namespace std } } - template - locale::id numpunct<_CharT>::id; - - template - locale::id collate<_CharT>::id; - // Support for time_get: // Note that these partial specializations could, and maybe should, // be changed to full specializations (by eliminating the _Dummy @@ -1193,9 +1171,6 @@ namespace std }; #endif - template - locale::id time_get<_CharT, _InIter>::id; - template _InIter time_get<_CharT, _InIter>:: @@ -1249,27 +1224,6 @@ namespace std __err |= __io.failbit; return __out; } - - template - locale::id time_put<_CharT, _OutIter>::id; - - template - locale::id money_get<_CharT, _InIter>::id; - - template - locale::id money_put<_CharT, _OutIter>::id; - - template - locale::id moneypunct<_CharT, _Intl>::id; - - template - const bool moneypunct<_CharT, _Intl>::intl; - - template - const bool moneypunct_byname<_CharT, _Intl>::intl; - - template - locale::id messages<_CharT>::id; } // std:: #endif /* _CPP_BITS_LOCFACETS_TCC */ diff --git a/libstdc++-v3/include/bits/localefwd.h b/libstdc++-v3/include/bits/localefwd.h index be2908c8042..fdbc1ce99cb 100644 --- a/libstdc++-v3/include/bits/localefwd.h +++ b/libstdc++-v3/include/bits/localefwd.h @@ -56,7 +56,7 @@ namespace std { enum { - _S_count = _Num + _M_count = _Num }; }; @@ -65,9 +65,9 @@ namespace std { enum { - _S_halfcount = _Count_ones<_Num, _Shift/2, - (_Mask^((~_Mask)>>(_Shift/2))) >::_S_count, - _S_count = (_S_halfcount&_Mask) + ((_S_halfcount>>_Shift)&_Mask) + _M_halfcount = _Count_ones<_Num, _Shift/2, + (_Mask^((~_Mask)>>(_Shift/2))) >::_M_count, + _M_count = (_M_halfcount&_Mask) + ((_M_halfcount>>_Shift)&_Mask) }; }; @@ -138,7 +138,6 @@ namespace std #ifdef _GLIBCPP_USE_WCHAR_T template<> class ctype; #endif - template class ctype_byname; // NB: Specialized for char and wchar_t in locale_facets.h. @@ -150,7 +149,6 @@ namespace std #ifdef _GLIBCPP_USE_WCHAR_T template<> class codecvt; #endif - template class codecvt_byname; @@ -207,7 +205,7 @@ namespace std { public: // Types: - typedef int category; + typedef unsigned int category; // Forward decls and friends: class facet; @@ -227,12 +225,12 @@ namespace std // Category values: // NB much depends on the order in which these appear: static const category none = 0; - static const category collate = 0x0100; - static const category ctype = 0x0200; - static const category monetary = 0x0400; - static const category numeric = 0x0800; - static const category time = 0x1000; - static const category messages = 0x2000; + static const category ctype = 1 << 0; + static const category numeric = 1 << 1; + static const category collate = 1 << 2; + static const category time = 1 << 3; + static const category monetary = 1 << 4; + static const category messages = 1 << 5; static const category all = (collate | ctype | monetary | numeric | time | messages); @@ -296,7 +294,7 @@ namespace std // Current global reference locale static _Impl* _S_global; - static const int _S_categories_num = _Count_ones::_S_count; + static const int _S_categories_num = _Count_ones::_M_count; static const int _S_facets_num = 26; explicit @@ -331,18 +329,19 @@ namespace std friend bool has_facet(const locale&) throw(); - private: + // private: + protected: // Data Members. size_t _M_references; __vec_facet* _M_facets; __vec_string* _M_category_names; bool _M_has_name; string _M_name; - static const locale::id* const _S_id_collate[]; static const locale::id* const _S_id_ctype[]; - static const locale::id* const _S_id_monetary[]; static const locale::id* const _S_id_numeric[]; + static const locale::id* const _S_id_collate[]; static const locale::id* const _S_id_time[]; + static const locale::id* const _S_id_monetary[]; static const locale::id* const _S_id_messages[]; static const locale::id* const* const _S_facet_categories[]; @@ -471,7 +470,7 @@ namespace std friend bool has_facet(const locale&) throw (); public: - id() {}; + id() { }; private: // NB: There is no accessor for _M_index because it may be used // before the constructor is run; the effect of calling a member diff --git a/libstdc++-v3/include/bits/std_locale.h b/libstdc++-v3/include/bits/std_locale.h index 7eaba90e7ea..739e755a826 100644 --- a/libstdc++-v3/include/bits/std_locale.h +++ b/libstdc++-v3/include/bits/std_locale.h @@ -37,7 +37,6 @@ #include #include #include -#include #endif diff --git a/libstdc++-v3/src/codecvt.cc b/libstdc++-v3/src/codecvt.cc index cfc76821ac2..515a035eab3 100644 --- a/libstdc++-v3/src/codecvt.cc +++ b/libstdc++-v3/src/codecvt.cc @@ -36,9 +36,6 @@ namespace std { const int __enc_traits::_S_max_size; #endif /* _GLIBCPP_USE_WCHAR_T */ - // codecvt required specialization - locale::id codecvt::id; - codecvt:: codecvt(size_t __refs) : __codecvt_abstract_base(__refs) @@ -107,8 +104,6 @@ namespace std { #ifdef _GLIBCPP_USE_WCHAR_T // codecvt required specialization - locale::id codecvt::id; - codecvt:: codecvt(size_t __refs) : __codecvt_abstract_base(__refs) { } diff --git a/libstdc++-v3/src/locale.cc b/libstdc++-v3/src/locale.cc index 29dcc378f76..83ca7c15ed9 100644 --- a/libstdc++-v3/src/locale.cc +++ b/libstdc++-v3/src/locale.cc @@ -41,15 +41,15 @@ # include // for towupper, etc. #endif -namespace std { - +namespace std +{ // Definitions for static const data members of locale. const locale::category locale::none; - const locale::category locale::collate; const locale::category locale::ctype; - const locale::category locale::monetary; const locale::category locale::numeric; + const locale::category locale::collate; const locale::category locale::time; + const locale::category locale::monetary; const locale::category locale::messages; const locale::category locale::all; @@ -58,7 +58,67 @@ namespace std { const int locale::_S_categories_num; const int locale::_S_facets_num; + // Definitions for locale::id of standard facets. + locale::id ctype::id; + locale::id codecvt::id; + locale::id num_get::id; + locale::id num_put::id; + locale::id numpunct::id; + locale::id collate::id; + locale::id time_get::id; + locale::id time_put::id; + locale::id money_get::id; + locale::id money_put::id; + locale::id moneypunct::id; + locale::id moneypunct::id; + locale::id messages::id; + +#ifdef _GLIBCPP_USE_WCHAR_T + locale::id ctype::id; + locale::id codecvt::id; + locale::id num_get::id; + locale::id num_put::id; + locale::id numpunct::id; + locale::id collate::id; + locale::id time_get::id; + locale::id time_put::id; + locale::id money_get::id; + locale::id money_put::id; + locale::id moneypunct::id; + locale::id moneypunct::id; + locale::id messages::id; +#endif + + // Definitions for static const data members of locale::id + size_t locale::id::_S_highwater; // init'd to 0 by linker + // Definitions for static const data members of locale::_Impl + const locale::id* const + locale::_Impl::_S_id_ctype[] = + { + &std::ctype::id, + &codecvt::id, +#ifdef _GLIBCPP_USE_WCHAR_T + &std::ctype::id, + &codecvt::id, +#endif + 0 + }; + + const locale::id* const + locale::_Impl::_S_id_numeric[] = + { + &num_get::id, + &num_put::id, + &numpunct::id, +#ifdef _GLIBCPP_USE_WCHAR_T + &num_get::id, + &num_put::id, + &numpunct::id, +#endif + 0 + }; + const locale::id* const locale::_Impl::_S_id_collate[] = { @@ -68,85 +128,41 @@ namespace std { #endif 0 }; - - const locale::id* const - locale::_Impl::_S_id_ctype[] = - { - &std::ctype::id, -#ifdef _GLIBCPP_USE_WCHAR_T - &std::ctype::id, -#endif - &codecvt::id, -#ifdef _GLIBCPP_USE_WCHAR_T - &codecvt::id, -#endif - 0 - }; - const locale::id* const - locale::_Impl::_S_id_monetary[] = - { - &moneypunct::id, -#ifdef _GLIBCPP_USE_WCHAR_T - &moneypunct::id, -#endif - &std::moneypunct::id, -#ifdef _GLIBCPP_USE_WCHAR_T - &moneypunct::id, -#endif - &money_get::id, -#ifdef _GLIBCPP_USE_WCHAR_T - &money_get::id, -#endif - &money_put::id, -#ifdef _GLIBCPP_USE_WCHAR_T - &money_put::id, -#endif - 0 - }; - - const locale::id* const - locale::_Impl::_S_id_numeric[] = - { - &numpunct::id, -#ifdef _GLIBCPP_USE_WCHAR_T - &numpunct::id, -#endif - &num_get::id, - #ifdef _GLIBCPP_USE_WCHAR_T - &num_get::id, -#endif - &num_put::id, -#ifdef _GLIBCPP_USE_WCHAR_T - &num_put::id, -#endif - 0 - }; - const locale::id* const locale::_Impl::_S_id_time[] = { &time_get::id, -#ifdef _GLIBCPP_USE_WCHAR_T - &time_get::id, -#endif &time_put::id, #ifdef _GLIBCPP_USE_WCHAR_T + &time_get::id, &time_put::id, #endif 0 }; + const locale::id* const + locale::_Impl::_S_id_monetary[] = + { + &money_get::id, + &money_put::id, + &moneypunct::id, + &moneypunct::id, +#ifdef _GLIBCPP_USE_WCHAR_T + &money_get::id, + &money_put::id, + &moneypunct::id, + &moneypunct::id, +#endif + 0 + }; + const locale::id* const locale::_Impl::_S_id_messages[] = { - &time_get::id, + &std::messages::id, #ifdef _GLIBCPP_USE_WCHAR_T - &time_get::id, -#endif - &time_put::id, -#ifdef _GLIBCPP_USE_WCHAR_T - &time_put::id, + &std::messages::id, #endif 0 }; @@ -155,18 +171,15 @@ namespace std { locale::_Impl::_S_facet_categories[] = { // Order must match the decl order in class locale. - locale::_Impl::_S_id_collate, locale::_Impl::_S_id_ctype, - locale::_Impl::_S_id_monetary, locale::_Impl::_S_id_numeric, + locale::_Impl::_S_id_collate, locale::_Impl::_S_id_time, + locale::_Impl::_S_id_monetary, locale::_Impl::_S_id_messages, 0 }; - // Definitions for static const data members of locale::id - size_t locale::id::_S_highwater; // init'd to 0 by linker - // Definitions for static const data members of money_base const money_base::pattern money_base::_S_default_pattern = {{symbol, sign, none, value}};; @@ -794,8 +807,6 @@ namespace std { // Platform-specific initialization code for ctype tables. #include - locale::id ctype::id; - const size_t ctype::table_size; ctype::~ctype() @@ -846,8 +857,6 @@ namespace std { : ctype(new mask[table_size], true, __refs) { } - locale::id collate::id; - collate::collate(size_t __refs) : _Collate(__refs) { } @@ -903,8 +912,6 @@ namespace std { : messages(__refs) { } #ifdef _GLIBCPP_USE_WCHAR_T - locale::id ctype::id; - ctype::__wmask_type ctype::_M_convert_to_wmask(const mask __m) const { @@ -1060,8 +1067,6 @@ namespace std { ctype_byname(const char* /*__s*/, size_t __refs) : ctype(__refs) { } - locale::id collate::id; - collate:: collate(size_t __refs) : _Collate (__refs) { } diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc index ee422c779c8..066f0dd0868 100644 --- a/libstdc++-v3/src/localename.cc +++ b/libstdc++-v3/src/localename.cc @@ -122,11 +122,11 @@ namespace std { static void(_Impl::* ctors[]) (const char*) = { // NB: Order must match the decl order in class locale. - &locale::_Impl::_M_construct_collate, &locale::_Impl::_M_construct_ctype, - &locale::_Impl::_M_construct_monetary, &locale::_Impl::_M_construct_numeric, + &locale::_Impl::_M_construct_collate, &locale::_Impl::_M_construct_time, + &locale::_Impl::_M_construct_monetary, &locale::_Impl::_M_construct_messages, 0 }; @@ -166,7 +166,7 @@ namespace std { locale::_Impl:: _M_replace_categories(const _Impl* __other, category __cat) { - unsigned int __mask = locale::all & -static_cast(locale::all); + category __mask = locale::all & -static_cast(locale::all); for (unsigned int __ix = 0; (-__mask & __cat) != 0; ++__ix, (__mask <<= 1)) { if (__mask & __cat) @@ -225,73 +225,57 @@ namespace std { _M_facet_init(new collate_byname(__name, 0)); #ifdef _GLIBCPP_USE_WCHAR_T _M_facet_init(new collate_byname(__name, 0)); -#endif /* _GLIBCPP_USE_WCHAR_T */ +#endif } void locale::_Impl::_M_construct_ctype(const char* __name) { _M_facet_init(new ctype_byname(__name, 0)); -#ifdef _GLIBCPP_USE_WCHAR_T - _M_facet_init(new ctype_byname(__name, 0)); -#endif /* _GLIBCPP_USE_WCHAR_T */ _M_facet_init(new codecvt_byname(__name)); #ifdef _GLIBCPP_USE_WCHAR_T + _M_facet_init(new ctype_byname(__name, 0)); _M_facet_init(new codecvt_byname(__name)); -#endif /* _GLIBCPP_USE_WCHAR_T */ +#endif } void locale::_Impl::_M_construct_monetary(const char* __name) { + _M_replace_facet(locale::_S_classic, &money_get::id); + _M_replace_facet(locale::_S_classic, &money_put::id); _M_facet_init(new moneypunct_byname(__name, 0)); -#ifdef _GLIBCPP_USE_WCHAR_T - _M_facet_init(new moneypunct_byname(__name, 0)); -#endif /* _GLIBCPP_USE_WCHAR_T */ _M_facet_init(new moneypunct_byname(__name, 0)); -#ifdef _GLIBCPP_USE_WCHAR_T - _M_facet_init(new moneypunct_byname(__name, 0)); -#endif /* _GLIBCPP_USE_WCHAR_T */ - - _M_replace_facet(locale::_S_classic, &money_get::id); #ifdef _GLIBCPP_USE_WCHAR_T _M_replace_facet(locale::_S_classic, &money_get::id); -#endif /* _GLIBCPP_USE_WCHAR_T */ - _M_replace_facet(locale::_S_classic, &money_put::id); -#ifdef _GLIBCPP_USE_WCHAR_T _M_replace_facet(locale::_S_classic, &money_put::id); -#endif /* _GLIBCPP_USE_WCHAR_T */ + _M_facet_init(new moneypunct_byname(__name, 0)); + _M_facet_init(new moneypunct_byname(__name, 0)); +#endif } void locale::_Impl::_M_construct_numeric(const char* __name) { + _M_replace_facet(locale::_S_classic, &num_get::id); + _M_replace_facet(locale::_S_classic, &num_put::id); _M_facet_init(new numpunct_byname(__name, 0)); -#ifdef _GLIBCPP_USE_WCHAR_T - _M_facet_init(new numpunct_byname(__name, 0)); -#endif /* _GLIBCPP_USE_WCHAR_T */ - - _M_replace_facet(locale::_S_classic, &num_get::id); #ifdef _GLIBCPP_USE_WCHAR_T _M_replace_facet(locale::_S_classic, &num_get::id); -#endif /* _GLIBCPP_USE_WCHAR_T */ - _M_replace_facet(locale::_S_classic, &num_put::id); -#ifdef _GLIBCPP_USE_WCHAR_T _M_replace_facet(locale::_S_classic, &num_put::id); -#endif /* _GLIBCPP_USE_WCHAR_T */ + _M_facet_init(new numpunct_byname(__name, 0)); +#endif } void locale::_Impl::_M_construct_time(const char* __name) { _M_facet_init(new time_get_byname(__name, 0)); -#ifdef _GLIBCPP_USE_WCHAR_T - _M_facet_init(new time_get_byname(__name, 0)); -#endif /* _GLIBCPP_USE_WCHAR_T */ _M_facet_init(new time_put_byname(__name, 0)); #ifdef _GLIBCPP_USE_WCHAR_T + _M_facet_init(new time_get_byname(__name, 0)); _M_facet_init(new time_put_byname(__name, 0)); -#endif /* _GLIBCPP_USE_WCHAR_T */ +#endif } void @@ -300,7 +284,7 @@ namespace std { _M_facet_init(new messages_byname(__name, 0)); #ifdef _GLIBCPP_USE_WCHAR_T _M_facet_init(new messages_byname(__name, 0)); -#endif /* _GLIBCPP_USE_WCHAR_T */ +#endif } }