This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/Borland/BCC55/Include/Rw/rwlocale.h

620 lines
21 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 */