161 lines
7.2 KiB
C
161 lines
7.2 KiB
C
|
#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 */
|