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/usefacet.h

161 lines
7.2 KiB
C
Raw Normal View History

#ifndef __USEFACET_H
#define __USEFACET_H
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
// -*- C++ -*-
/***************************************************************************
*
* usefacet - Declarations for the Standard Library facet access functions
* and for the convenience functions (isalpha etc.)
*
***************************************************************************
*
* 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_USEFACET__
#define __STD_USEFACET__
#ifndef __STD_RWLOCALE__
#include <rw/rwlocale>
#endif
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
// Template use_facet<Facet>(loc) returns a reference to a facet. Its result
// is guaranteed by locale's value semantics to last at least as long as the
// locale or any copy of the locale it came from.
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
#define _RWSTD_SELECT_FACET
#else
#define _RWSTD_SELECT_FACET ,Facet*
#endif
template <class Facet>
_RWSTD_TRICKY_INLINE
const Facet &use_facet (const locale &loc _RWSTD_SELECT_FACET)
{
// Ensure that Facet has a static member named id, and (via cast) that it is
// of type locale::id, and obtain from it (via size_t conversion operator)
// the private numeric index associated with type Facet for this run.
size_t i=(const locale::id&) Facet::id;
// Get pointer to facet from locale.
const __RWSTD::facet_imp *f=loc.get_facet(i);
// If facet is not explicitly present in locale yet, use private function
// locale::__make_explicit to construct it or retrieve it from a cache, and
// install it in the locale. This function can throw bad_cast or other
// exceptions.
if (!f)
f=loc.__make_explicit(Facet::id,Facet::__ok_implicit,Facet::__facet_cat,
__RWSTD::facet_maker<Facet>::maker_func);
return (const Facet&)*f;
}
// Function has_facet<Facet>(loc) simply reports whether a locale implements a
// particular facet. If has_facet<facet>(loc) is false, use_facet<facet>(loc)
// would throw an exception.
template <class Facet>
inline bool has_facet (const locale &loc _RWSTD_SELECT_FACET)
_RWSTD_THROW_SPEC_NULL
{
size_t ix = (const locale::id&) Facet::id; // verify is a locale::id.
return loc.__imp->get_facet(ix) != NULL || Facet::__ok_implicit;
}
// convenience interfaces: is*(char)
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
template <class charT> inline bool isspace(charT c, const locale& loc)
{ typedef ctype<charT> idiot; return use_facet<idiot>(loc).is(ctype_base::space, c); }
template <class charT> inline bool isprint(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).is(ctype_base::print, c); }
template <class charT> inline bool iscntrl(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).is(ctype_base::cntrl, c); }
template <class charT> inline bool isupper(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).is(ctype_base::upper, c); }
template <class charT> inline bool islower(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).is(ctype_base::lower, c); }
template <class charT> inline bool isalpha(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).is(ctype_base::alpha, c); }
template <class charT> inline bool isdigit(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).is(ctype_base::digit, c); }
template <class charT> inline bool ispunct(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).is(ctype_base::punct, c); }
template <class charT> inline bool isxdigit(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).is(ctype_base::xdigit, c); }
template <class charT> inline bool isalnum(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).is(ctype_base::alnum, c); }
template <class charT> inline bool isgraph(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).is(ctype_base::graph, c); }
template <class charT> inline charT toupper(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).toupper(c); }
template <class charT> inline charT tolower(charT c, const locale& loc)
{ return use_facet<ctype<charT> >(loc).tolower(c); }
#else
template <class charT> inline bool isspace(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::space, c); }
template <class charT> inline bool isprint(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::print, c); }
template <class charT> inline bool iscntrl(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::cntrl, c); }
template <class charT> inline bool isupper(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::upper, c); }
template <class charT> inline bool islower(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::lower, c); }
template <class charT> inline bool isalpha(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::alpha, c); }
template <class charT> inline bool isdigit(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::digit, c); }
template <class charT> inline bool ispunct(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::punct, c); }
template <class charT> inline bool isxdigit(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::xdigit, c); }
template <class charT> inline bool isalnum(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::alnum, c); }
template <class charT> inline bool isgraph(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).is(ctype_base::graph, c); }
template <class charT> inline charT toupper(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).toupper(c); }
template <class charT> inline charT tolower(charT c, const locale& loc)
{ return use_facet(loc,(ctype<charT>*)0).tolower(c); }
#endif
#ifndef _RWSTD_NO_NAMESPACE
} // namespace std
#endif
#endif // __STD_USEFACET__
#pragma option pop
#endif /* __USEFACET_H */