#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 #endif #ifndef _RWSTD_NO_NAMESPACE namespace std { #endif // Template use_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 _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::maker_func); return (const Facet&)*f; } // Function has_facet(loc) simply reports whether a locale implements a // particular facet. If has_facet(loc) is false, use_facet(loc) // would throw an exception. template 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 inline bool isspace(charT c, const locale& loc) { typedef ctype idiot; return use_facet(loc).is(ctype_base::space, c); } template inline bool isprint(charT c, const locale& loc) { return use_facet >(loc).is(ctype_base::print, c); } template inline bool iscntrl(charT c, const locale& loc) { return use_facet >(loc).is(ctype_base::cntrl, c); } template inline bool isupper(charT c, const locale& loc) { return use_facet >(loc).is(ctype_base::upper, c); } template inline bool islower(charT c, const locale& loc) { return use_facet >(loc).is(ctype_base::lower, c); } template inline bool isalpha(charT c, const locale& loc) { return use_facet >(loc).is(ctype_base::alpha, c); } template inline bool isdigit(charT c, const locale& loc) { return use_facet >(loc).is(ctype_base::digit, c); } template inline bool ispunct(charT c, const locale& loc) { return use_facet >(loc).is(ctype_base::punct, c); } template inline bool isxdigit(charT c, const locale& loc) { return use_facet >(loc).is(ctype_base::xdigit, c); } template inline bool isalnum(charT c, const locale& loc) { return use_facet >(loc).is(ctype_base::alnum, c); } template inline bool isgraph(charT c, const locale& loc) { return use_facet >(loc).is(ctype_base::graph, c); } template inline charT toupper(charT c, const locale& loc) { return use_facet >(loc).toupper(c); } template inline charT tolower(charT c, const locale& loc) { return use_facet >(loc).tolower(c); } #else template inline bool isspace(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::space, c); } template inline bool isprint(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::print, c); } template inline bool iscntrl(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::cntrl, c); } template inline bool isupper(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::upper, c); } template inline bool islower(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::lower, c); } template inline bool isalpha(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::alpha, c); } template inline bool isdigit(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::digit, c); } template inline bool ispunct(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::punct, c); } template inline bool isxdigit(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::xdigit, c); } template inline bool isalnum(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::alnum, c); } template inline bool isgraph(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).is(ctype_base::graph, c); } template inline charT toupper(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).toupper(c); } template inline charT tolower(charT c, const locale& loc) { return use_facet(loc,(ctype*)0).tolower(c); } #endif #ifndef _RWSTD_NO_NAMESPACE } // namespace std #endif #endif // __STD_USEFACET__ #pragma option pop #endif /* __USEFACET_H */