home *** CD-ROM | disk | FTP | other *** search
- #ifndef __RWLOCALE_H
- #define __RWLOCALE_H
- #pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
- // -*- C++ -*-
- /***************************************************************************
- *
- * locale - Declarations for the Standard Library locale classes
- *
- ***************************************************************************
- *
- * Copyright (c) 1994-1999 Rogue Wave Software, Inc. All Rights Reserved.
- *
- * This computer software is owned by Rogue Wave Software, Inc. and is
- * protected by U.S. copyright laws and other laws and by international
- * treaties. This computer software is furnished by Rogue Wave Software,
- * Inc. pursuant to a written license agreement and may be used, copied,
- * transmitted, and stored only in accordance with the terms of such
- * license and with the inclusion of the above copyright notice. This
- * computer software or any other copies thereof may not be provided or
- * otherwise made available to any other person.
- *
- * U.S. Government Restricted Rights. This computer software is provided
- * with Restricted Rights. Use, duplication, or disclosure by the
- * Government is subject to restrictions as set forth in subparagraph (c)
- * (1) (ii) of The Rights in Technical Data and Computer Software clause
- * at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
- * Commercial Computer Software รป Restricted Rights at 48 CFR 52.227-19,
- * as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
- * Flatiron Parkway, Boulder, Colorado 80301 USA.
- *
- **************************************************************************/
-
- #ifndef __STD_RWLOCALE__
- #define __STD_RWLOCALE__ 1
-
- #include <rw/rwstderr.h>
-
- #ifndef __STD_RWCOMPILER_H__
- #include <stdcomp.h>
- #endif
-
- #ifndef __STD_STRING__
- #include <string>
- #endif
-
- #ifndef __STD_IOSFWD__
- #include <iosfwd>
- #endif
-
- #ifndef _RWSTD_NO_NEW_HEADER
- #include <ctime>
- #else
- #include <time.h>
- #endif
-
- #ifndef _RWSTD_NO_BAD_CAST
- #include <typeinfo>
- #endif
-
- // In case these are (wrongly!) defined as macros in <cctype>.
-
- #undef isspace
- #undef isprint
- #undef iscntrl
- #undef isupper
- #undef islower
- #undef isalpha
- #undef isdigit
- #undef ispunct
- #undef isxdigit
- #undef isalnum
- #undef isgraph
- #undef toupper
- #undef tolower
-
- #ifndef _RWSTD_NO_NAMESPACE
- namespace __rwstd {
- #endif
-
- #ifdef _RWSTD_LOCALIZED_ERRORS
- extern const unsigned int _RWSTDExport __rw_LocaleNotPresent;
- #else
- extern const char _RWSTDExportFunc(*) __rw_LocaleNotPresent;
- #endif
-
- #ifndef _RWSTD_NO_NAMESPACE
- } namespace std {
- #endif
-
- // Forward declarations of functions and classes specified by the locale clause
- // of the C++ Standard Library working paper.
-
- class _RWSTDExport locale;
-
- #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
- template <class Facet> inline const Facet& use_facet (const locale&);
- template <class Facet>
- inline bool has_facet (const locale&) _RWSTD_THROW_SPEC_NULL;
- #else
- template <class Facet>
- _RWSTD_TRICKY_INLINE const Facet& use_facet (const locale&, Facet*);
- template <class Facet>
- inline bool has_facet (const locale&, Facet*) _RWSTD_THROW_SPEC_NULL;
- #endif // _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
-
- template <class charT> inline bool isspace (charT c, const locale&);
- template <class charT> inline bool isprint (charT c, const locale&);
- template <class charT> inline bool iscntrl (charT c, const locale&);
- template <class charT> inline bool isupper (charT c, const locale&);
- template <class charT> inline bool islower (charT c, const locale&);
- template <class charT> inline bool isalpha (charT c, const locale&);
- template <class charT> inline bool isdigit (charT c, const locale&);
- template <class charT> inline bool ispunct (charT c, const locale&);
- template <class charT> inline bool isxdigit (charT c, const locale&);
- template <class charT> inline bool isalnum (charT c, const locale&);
- template <class charT> inline bool isgraph (charT c, const locale&);
-
- template <class charT> inline charT toupper (charT c, const locale&);
- template <class charT> inline charT tolower (charT c, const locale&);
-
- class ctype_base;
- template <class charT> class ctype;
- _RWSTD_TEMPLATE class _RWSTDExport ctype<char>;
- template <class charT> class ctype_byname;
- _RWSTD_TEMPLATE class _RWSTDExport ctype_byname<char>;
- class codecvt_base;
- template <class internT, class externT, class stateT> class codecvt;
- _RWSTD_TEMPLATE class _RWSTDExport codecvt<char,char,mbstate_t>; // (imp)
-
- #ifndef _RWSTD_NO_WIDE_CHAR
- _RWSTD_TEMPLATE class _RWSTDExport ctype<wchar_t>; // (imp)
- _RWSTD_TEMPLATE class _RWSTDExport ctype_byname<wchar_t>;
- _RWSTD_TEMPLATE class _RWSTDExport codecvt<wchar_t,char,mbstate_t>; // (imp)
- #endif // _RWSTD_NO_WIDE_CHAR
-
- template <class internT, class externT, class stateT> class codecvt_byname;
-
- template <class charT,
- class InputIterator _RWSTD_COMPLEX_DEFAULT(istreambuf_iterator<charT>)>
- class num_get;
- template <class charT,
- class OutputIterator _RWSTD_COMPLEX_DEFAULT(ostreambuf_iterator<charT>)>
- class num_put;
- template <class charT> class numpunct;
- template <class charT> class numpunct_byname;
-
- template <class charT> class collate;
- template <class charT> class collate_byname;
-
- class time_base;
- template <class charT,
- class InputIterator _RWSTD_COMPLEX_DEFAULT(istreambuf_iterator<charT>)>
- class time_get;
- template <class charT,
- class InputIterator _RWSTD_COMPLEX_DEFAULT(istreambuf_iterator<charT>)>
- class time_get_byname;
- template <class charT,
- class OutputIterator _RWSTD_COMPLEX_DEFAULT(ostreambuf_iterator<charT>)>
- class time_put;
- template <class charT,
- class OutputIterator _RWSTD_COMPLEX_DEFAULT(ostreambuf_iterator<charT>)>
- class time_put_byname;
-
- class _RWSTDExport money_base;
- template <class charT,
- class InputIterator _RWSTD_COMPLEX_DEFAULT(istreambuf_iterator<charT>)>
- class money_get;
- template <class charT,
- class OutputIterator _RWSTD_COMPLEX_DEFAULT(ostreambuf_iterator<charT>)>
- class money_put;
- template <class charT, bool Intl _RWSTD_SIMPLE_DEFAULT(false)>
- class moneypunct;
- template <class charT, bool Intl _RWSTD_SIMPLE_DEFAULT(false)>
- class moneypunct_byname;
-
- class messages_base;
- template <class charT> class messages;
- template <class charT> class messages_byname;
-
- // Instantiations that go in the library:
-
- #ifdef __TURBOC__
-
- typedef istreambuf_iterator<char,char_traits<char> > __isit;
- typedef ostreambuf_iterator<char,char_traits<char> > __osit;
-
- template class _RWSTDExport codecvt_byname<char,char,mbstate_t>;
- template class _RWSTDExport num_get<char,__isit>;
- template class _RWSTDExport num_put<char,__osit>;
- template class _RWSTDExport numpunct<char>;
- template class _RWSTDExport numpunct_byname<char>;
- template class _RWSTDExport collate<char>;
- template class _RWSTDExport collate_byname<char>;
- template class _RWSTDExport time_get<char,__isit>;
- template class _RWSTDExport time_put<char,__osit>;
- template class _RWSTDExport money_get<char,__isit>;
- template class _RWSTDExport money_put<char,__osit>;
- template class _RWSTDExport moneypunct<char,false>;
- template class _RWSTDExport moneypunct<char,true>;
- template class _RWSTDExport moneypunct_byname<char,false>;
- template class _RWSTDExport moneypunct_byname<char,true>;
- template class _RWSTDExport messages<char>;
- template class _RWSTDExport messages_byname<char>;
-
- #ifndef _RWSTD_NO_WIDE_CHAR
-
- typedef istreambuf_iterator<wchar_t,char_traits<wchar_t> > __wisit;
- typedef ostreambuf_iterator<wchar_t,char_traits<wchar_t> > __wosit;
-
- template class _RWSTDExport codecvt_byname<wchar_t,wchar_t,mbstate_t>;
- template class _RWSTDExport num_get<wchar_t,__wisit>;
- template class _RWSTDExport num_put<wchar_t,__wosit>;
- template class _RWSTDExport numpunct<wchar_t>;
- template class _RWSTDExport numpunct_byname<wchar_t>;
- template class _RWSTDExport collate<wchar_t>;
- template class _RWSTDExport collate_byname<wchar_t>;
- template class _RWSTDExport time_get<wchar_t,__wisit>;
- template class _RWSTDExport time_put<wchar_t,__wosit>;
- template class _RWSTDExport money_get<wchar_t,__wisit>;
- template class _RWSTDExport money_put<wchar_t,__wosit>;
- template class _RWSTDExport moneypunct<wchar_t,false>;
- template class _RWSTDExport moneypunct<wchar_t,true>;
- template class _RWSTDExport moneypunct_byname<wchar_t,false>;
- template class _RWSTDExport moneypunct_byname<wchar_t,true>;
- template class _RWSTDExport messages<wchar_t>;
- template class _RWSTDExport messages_byname<wchar_t>;
-
- #endif // _RWSTD_NO_WIDE_CHAR
-
- #endif // __TURBOC__
-
- #ifndef _RWSTD_NO_NAMESPACE
- } // namespace std
- #endif
-
- #ifndef __STD_RW_LOCIMPL__
- #include <rw/locimpl>
- #endif
-
- #ifndef _RWSTD_NO_NAMESPACE
- namespace std {
- #endif
-
- // -------------
- // Class locale.
- // -------------
-
- class _RWSTDExport locale {
- public:
- class facet;
- class id;
-
- friend class facet;
- friend class id;
-
- typedef int category;
-
- // The following constants identify standard categories of facets. The
- // standard specifies them as const members of type category (i.e. as const
- // ints). For compilers that can't initialize const members here, we define
- // them as members of an anonymous enum instead.
-
- // Some compilers get confused by the name collision of these constants with
- // the facet templates collate, ctype and messages. As a work-around, we
- // also define non-standard names of the form __rw_xxx_category for these
- // three categories. If you have one of the confused compilers (i.e. if
- // _RWSTD_CONFUSED_ENUM_SCOPE is #defined for you), you must use these non-
- // standard category names.
-
- #ifndef _RWSTD_CONFUSED_ENUM_SCOPE
- #define _RWSTD_CATEGORY_NAMES \
- collate = 0x0010, ctype = 0x0020, monetary = 0x0040, \
- numeric = 0x0080, time = 0x0100, messages = 0x0200, \
- all = 0x03f0, none = 0x0000
- #else
- #define _RWSTD_CATEGORY_NAMES \
- monetary = 0x0040, numeric = 0x0080, time = 0x0100, \
- all = 0x03f0, none = 0x0000
- #endif
-
- #define _RWSTD_IMPLEMENTATION_VALS \
- __rw_collate_category = 0x0010, __rw_ctype_category = 0x0020, \
- __rw_messages_category = 0x0200, __rw_Clib_LC_constants = 0x000F, \
- __rw_num_categories = 6, __rw_first_category = 0x0010
-
- #ifndef _RWSTD_NO_STI_SIMPLE
- static const category _RWSTD_CATEGORY_NAMES, _RWSTD_IMPLEMENTATION_VALS;
- #else
- enum { _RWSTD_CATEGORY_NAMES, _RWSTD_IMPLEMENTATION_VALS };
- #endif
-
- #undef _RWSTD_CATEGORY_NAMES
- #undef _RWSTD_IMPLEMENTATION_VALS
-
- // The default constructor creates a copy of the current global locale.
- // This is the locale specified in the most recent call to locale::global().
- // If locale::global() has not been called, it is the classic "C" locale.
-
- inline locale () _RWSTD_THROW_SPEC_NULL;
-
- // The copy constructor (and the assignment operator, below) can be used
- // freely. Like a string, most of a locale's contents are in a separate,
- // reference-counted implementation object, so copying and assigning locales
- // has little overhead.
-
- inline locale (const locale& other) _RWSTD_THROW_SPEC_NULL;
-
- // The following constructor creates a locale composed of by-name facets and
- // assigns it a name. The valid arguments are "", "C", and a set of strings
- // defined by the compiler vendor. These cause the facets of the locale to
- // be obtained, respectively, from the user's preferred locale, from the
- // classic locale, or from the compiler's locale database. (In many cases,
- // the preferred locale is specified by environment variables such as LANG
- // or LC_ALL.) If the argument is not recognized, the constructor throws
- // runtime_error.
-
- _EXPLICIT locale (const char* name);
-
- // The following constructor copies its first argument except for the facets
- // in the categories identified by the third argument, which are obtained by
- // name using the second argument. Can throw runtime_error.
-
- locale (const locale& other, const char* name, category);
-
- // The following templatized constructor is only available if your compiler
- // supports member function templates. It copies its first argument except
- // the single facet of type Facet, which it gets from the second argument.
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
-
- template <class Facet>
- inline locale (const locale& other,Facet* f);
-
- #else
-
- // If your compiler does not support member function templates, we provide
- // the following work-around to let you accrete facets onto a locale. This
- // constructor copies its first argument except for the single facet of the
- // type of the second argument, for which it uses the second argument.
- //
- // To determine the type of the second argument, it calls the non-standard
- // virtual method __get_id in the second argument. If you are creating your
- // own facet types on a compiler that does not support member templates, you
- // must code a __get_id member as follows in each new base class facet (i.e.
- // in each facet class that has its own static member id of type locale::id):
- //
- // virtual locale::id &__get_id (void) const { return id; }
- //
- // See the __get_id members in the standard facets below for examples.
-
- inline locale (const locale& other, facet* f);
-
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
-
- // The following constructor copies its first argument except for the facets
- // in the categories identified by the third argument, which are obtained
- // from the second argument.
-
- locale (const locale &other, const locale &second, category);
-
- // The destructor is non-virtual. Other classes are not supposed to be
- // derived from locale.
-
- ~locale ()
- {
- __RWSTD::ref_counted::remove_reference(__imp);
- }
-
- const locale& operator = (const locale& other) _RWSTD_THROW_SPEC_NULL;
-
- // The following member function template is available only if your compiler
- // supports member templates that are templatized on types that don't appear
- // in the argument list. It returns a copy of this locale (*this) except
- // the single facet of type Facet, which it gets from the other locale.
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
- template <class Facet>
- inline locale combine (const locale& other) const;
- #endif // _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
-
- // The following returns the locale name, or "*" if the locale is unnamed.
-
- string name () const;
-
- // Two locales are equal if they are the same object, or one is a copy of the
- // other (i.e. they have the same implementation object), or both are named
- // and their names are the same.
-
- bool operator == (const locale& other) const;
- bool operator != (const locale& other) const { return !(*this==other); }
-
- // The following templatized operator () satisfies STL requirements for a
- // comparator predicate template argument for comparing strings according to
- // the collating sequence of the locale. It lets you use a locale directly
- // as a comparator using syntax like sort(v.begin(),v.end(),loc), where v is
- // a vector of some string type and loc is a locale. If your compiler does
- // not support member function templates, we provide explicit support for
- // string and (if applicable) wstring.
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
- template <class charT, class Traits, class Allocator>
- bool operator() (const basic_string<charT,Traits,Allocator>& s1,
- const basic_string<charT,Traits,Allocator>& s2) const;
- #else
- bool operator() (const string &s1,const string &s2) const;
- #ifndef _RWSTD_NO_WIDE_CHAR
- bool operator() (const wstring &s1,const wstring &s2) const;
- #endif
- #endif
-
- // Static members.
-
- static locale global (const locale&); // Replaces the current global locale
- static const locale &classic (); // Returns the classic "C" locale
-
- // class facet -- base class for locale feature sets.
-
- // Any class deriving from facet that wants to be perceived as a distinct
- // facet, as opposed to a re-implementation of an existing facet, must
- // declare a static member: static std::locale::id id;
-
- class facet: public __RWSTD::facet_imp {
- friend class __RWSTD::locale_imp;
- friend class locale;
- protected:
- _EXPLICIT facet (size_t refs=0,int cat=0):
- __RWSTD::facet_imp(refs,cat) { }
-
- virtual ~facet() { }
-
- #ifdef _RWSTD_NO_MEMBER_TEMPLATES
- virtual id &__get_id (void) const=0;
- #endif
-
- private:
- facet (const facet&); // not defined
- void operator = (const facet&); // not defined
- };
-
- // class id -- facet type identifier.
-
- // This is mostly an implementation class. It is used internally as an index
- // to find facets within a locale. Each distinct facet (i.e. each T that can
- // be the parameter of a use_facet<T> call) has a unique static member of type
- // locale::id named id. The class is made public to enable extension of the
- // set of standard facets. Objects of this type don't need to be constructed
- // or referenced in any other circumstances.
-
- class id: private __RWSTD::locale_id_imp {
- _RWSTD_FRIEND_USE_HAS_FACET
- friend class locale;
- #if defined ( _MSC_VER ) || defined (__TURBOC__)
- public:
- #endif
- #ifdef _HPACC_
- operator size_t () const { return __RWSTD::locale_id_imp::__id_value; }
- #else
- operator size_t () const { return __id_value; }
- #endif
-
- // The private copy constructor and assignment operator help restrict the
- // class to its intended use. The copy constructor prevents the compiler
- // from generating a do-nothing default constructor, so we provide one.
- // We omit the constructors on compilers that don't support static template
- // members with constructors.
-
- #ifndef _RWSTD_NO_STATIC_DEF3
- public:
- id () { }
- private:
- id (const id&);
- #endif
- private:
- void operator = (const id&);
- };
-
- private:
-
- // Implementation.
- friend class __RWSTD::locale_imp;
- _RWSTD_FRIEND_USE_HAS_FACET
-
- #if defined ( _MSC_VER ) || defined (__TURBOC__)
- public:
- #endif
-
- // The only data member is a pointer to a ref-counted implementation object:
- __RWSTD::locale_imp *__imp;
-
- // Typedef for the implementation-defined call-back functions that must be
- // passed to __make_explicit (below).
- typedef __RWSTD::facet_maker_func __facet_maker_func;
-
- // The following function retrieves an implicit facet from a cache,
- // or creates one if needed (via call to the passed call-back
- // function), and makes it an explicit facet of the locale.
-
- __RWSTD::facet_imp * __make_explicit (const id &facet_id, bool ok_implicit,
- category facet_cat, __facet_maker_func maker) const;
-
- inline __RWSTD::facet_imp *get_facet (size_t) const;
-
- #if defined(_MSC_VER) && !defined(__BORLANDC__)
- private:
- #endif
-
- void __install (__RWSTD::facet_imp *f, const id& i) const;
-
- static __RWSTD::locale_imp *__the_classic_locale;
- static __RWSTD::locale_imp *__the_native_locale;
- static __RWSTD::locale_imp *__global;
-
- // Construct a locale from an implementation object.
- inline _EXPLICIT locale (__RWSTD::locale_imp *m);
-
- private:
- // We have to say private again in case _RWSTD_FRIEND_USE_HAS_FACET evaluated
- // to public:
-
- // Create initial implementation objects.
- static void init ();
- };
-
- #undef _RWSTD_FRIEND_USE_HAS_FACET
-
- // ----------------------------
- // Class locale inline members.
- // ----------------------------
-
- // Private constructor for use by implementation, constructs a locale from
- // a locale_imp implementation object.
- inline locale::locale (__RWSTD::locale_imp *m): __imp(m) {
- if (!__global) init();
- __RWSTD::ref_counted::add_reference(__imp);
- }
-
- // Default constructor, returns a copy of the current global locale.
- inline locale::locale () _RWSTD_THROW_SPEC_NULL {
- if (!__global) init(); // This is not throw() ... something has to give.
- __RWSTD::ref_counted::add_reference(__imp=__global);
- }
-
- // Copy constructor.
- inline locale::locale (const locale& other) _RWSTD_THROW_SPEC_NULL {
- __RWSTD::ref_counted::add_reference(__imp=other.__imp);
- }
-
- #ifndef _RWSTD_NO_MEMBER_TEMPLATES
-
- // Constructor to accrete or replace a single facet.
- template <class Facet>
- inline locale::locale (const locale& other, Facet* f)
- {
- if (f) {
- __imp=new __RWSTD::locale_imp (*other.__imp,1);
- __install(f,Facet::id);
- __imp->named_=false;
- } else
- __RWSTD::ref_counted::add_reference(__imp=other.__imp);
- }
-
- #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
-
- template <class Facet>
- inline locale locale::combine (const locale& other) const
- {
- return locale (*this,&use_facet<Facet>(other));
- }
-
- #endif /* _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE */
-
- #else
-
- inline locale::locale (const locale& other, facet* f):
- __imp(new __RWSTD::locale_imp (*other.__imp,1))
- {
- __install(f,f->__get_id());
- __imp->named_=false;
- }
-
- #endif // _RWSTD_NO_MEMBER_TEMPLATES
- // Private implementation helper function.
- inline __RWSTD::facet_imp* locale::get_facet (size_t i) const {
- return __imp->get_facet(i);
- }
-
- #ifndef _RWSTD_NO_NAMESPACE
- } namespace __rwstd {
- #endif
- // -------------------------------------------------------
- // Implementation function template -- create_named_facet.
- // -------------------------------------------------------
- //
- // The default for facets with no derived byname version is to create a facet
- // with classic ("C") behavior, ignoring the passed name.
-
- template <class Facet>
- inline Facet* create_named_facet (Facet*,const char* /* name */ ,size_t refs)
- {
- return new Facet(refs);
- }
-
- #ifndef _RWSTD_NO_NAMESPACE
- } // namespace __rwstd
- #endif
-
- // Get declarations for vendor-defined extensions, such as
- // declarations of the facets of the native ("") locale.
- #include <rw/vendor>
-
- #ifdef _RWSTD_NO_TEMPLATE_REPOSITORY
- #include <rw/rwlocale.cc>
- #endif
-
- #endif // __STD_RWLOCALE__
- #pragma option pop
- #endif /* __RWLOCALE_H */
-