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 Permalink Normal View History

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