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 Permalink 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 __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 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 */