VMS Help
CXXLSTD, locales

 *Conan The Librarian

  1 - locale

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   locale - Localization	class containing a polymorphic set of facets.

 SYNOPSIS

   #include<locale>
   class	locale;

 DESCRIPTION

   locale provides a localization interface and a set of	indexed
   facets,	each of which covers one particular localization
   issue.  The default locale object is constructed	on the "C"
   locale.  Locales can	also be	constructed on named locales.

   A calling program can	determine whether a particular facet is
   contained in a locale by using the	has_facet function, and	the
   program can	obtain a reference to that facet with the use_facet
   function.	These are not member functions, but instead take a
   locale object as an argument.

   locale has several important characteristics.

   First, successive calls to member functions will always return the
   same result.  This	allows a calling program to safely cache the
   results of	a call.

   Any standard facet not implemented by	a locale will be obtained from
   the global locale	the first time that use_facet is called	(for
   that facet).

   Only a locale	constructed from a name	(i.e., "POSIX"), from parts of
   two named	locales, or from a stream, has a name.	All other
   locales are unnamed.  Only named locales may be compared for
   equality.  An unnamed locale is equal only to itself.

 INTERFACE

   class	locale {
   public:
     // types:
    class facet;
    class id;
    typedef int category;
    static const	category   none, collate, ctype, monetary,
 			   numeric, time, messages,
 			   all = collate | ctype | monetary |
 				 numeric | time	 | messages;
     // construct/copy/destroy:
    locale() throw()
    locale(const	locale&) throw()
    explicit locale(const char*);
    locale(const	locale&, const char*, category);
    template <class Facet> locale(const locale&,	Facet*);
    template <class Facet> locale(const locale&,
 				 const locale&);
    locale(const	locale&, const locale&,	category);
     ~locale() throw();	// non-virtual
    const locale& operator=(const locale&) throw();
     // locale operations:
    basic_string<char>		       name() const;
    bool	operator==(const locale&) const;
    bool	operator!=(const locale&) const;
    template <class charT,Traits>
      bool operator()(const basic_string<charT,Traits>&,
 		     const basic_string<charT,Traits>&)	const;
     // global locale objects:
    static	locale	global(const locale&);
    static const	locale&	classic();
   };

   class	locale::facet {
   protected:
    explicit facet(size_t refs =	0);
    virtual ~facet();
   private:
    facet(const facet&);		 // not	defined
    void	operator=(const	facet&); // not	defined
   };

   class	locale::id {
   public:
    id();
   private:
    void	operator=(const	id&); // not defined
    id(const id&);	      // not defined
   };

 TYPES

   category
      Standard facets fall into eight broad categories.	These are:
      none, collate, ctype, monetary,	numeric, time, messages, and
      all.  all is a combination of all	the other categories except
      none.  Bitwise operations may be applied to combine or screen
      these categries.  For instance	all is	defined	as:

       (collate | ctype | monetary | numeric | time | messages)

      locale member functions that take a category argument must	be
      provided with one of the above values, or one of the constants
      from	the old	C locale (e.g., LC_CTYPE).

   facet
      Base class	for facets. This class exists primarily	to provide
      reference counting services to derived classes.  All	facets
      must derive from	it, either directly or	indirectly indirectly
      (e.g., facet -> ctype<char> -> my_ctype).

      If	the refs argument to the constructor is	0 then destruction of
      the object is delegated to the	locale,	or locales, containing
      it. This allows the	user to	ignore lifetime	management
      issues.  On the other had, if	refs  is 1, then the object
      must be explicitly deleted;	the locale will not do so.  In
      this case, the	object can be maintained across	the lifetime
      of multiple locales.

      Copy construction and assignment of this class are	disallowed.

   id
      Type used to index	facets in the locale container.	 Every facet
      must contain a member of this type.

      Copy construction and assignment of this type are disallowed.

 CONSTRUCTORS AND DESTRUCTORS

   locale()
    throw()
      Constructs	a default locale object.  This locale will be the same
      as the last argument passed to locale::global(), or, if that
      function has	not been called, the locale will be the same
      as the classic "C" locale.

   locale(const locale& other)
    throw()
      Constructs	a copy of the locale argument other.

   explicit locale(const	char* std_name);
      Constructs	a locale object	on the named locale indicated by
      std_name. Throws a runtime_error exception of if std_name is
      not a valid locale name.

   locale(const locale& other, const char* std_name,
 	category cat);
      Construct a locale	object that is a copy of other,	except for the
      facets that are in the category specified	by cat.	 These facets
      will be obtained from the named locale identified by std_name.
      Throws a runtime_error exception of	if std_name is not a
      valid locale name.

      Note that the resulting locale will have the same name (possibly
      none) as	other.

   template <class Facet>
   locale(const locale& other, Facet* f);
      Constructs	a locale object	that is	a copy of other, except	for
      the	facet of	type Facet.  Unless f is null, it f is
      used to supply the missing facet, otherwise the facet	will
      come from other as	well.

      Note that the resulting locale will not have a name.

   template <class Facet>
   locale(const locale& other, const locale& one);
      Constructs	a locale object	that is	a copy of other, except	for
      the	facet of	type Facet.  This missing facet	is
      obtained from the second locale argument, one.  Throws a
      runtime_error exception if one does not contain a facet of	type
      Facet.

      Note that the resulting locale will not have a name.

   locale(const locale& other, const locale& one, category cat);
      Constructs	a locale object	that is	a copy of other, except	for
      facets that are in the category specified	by category argument
      cat.  These missing facets are	obtained from the other	locale
      argument, one.

      Note that the resulting locale will only have a name only if both
      other and one have names.  The name will	be the same as other's
      name.

   ~locale();
      Destroy the locale.

 PUBLIC MEMBER OPERATORS

   const	locale&
   operator=(const locale& other) throw();
      Replaces *this with a copy	of other.  Returns *this.

   bool
   operator==(const locale& other) const;
      Retuns true if both other and *this are the same object, if one
      is	a copy of another, or if both have the same name.  Otherwise
      returns false.

   bool
   operator!=(const locale& other) const;
      Returns !(*this ==	other)

   template <class charT,Traits>
   bool
   operator()(const basic_string<charT,Traits>& s1,
 	    const basic_string<charT,Traits>& s2) const;
      This operator is provided to allow	a locale object	to be used as
      a	comparison object for	comparing two strings.	Returns	the
      result of comparing the two strings using the compare member
      function of the collate<charT> facet contained in this.
      Specifically, this function returns the following:

    use_facet< collate<charT> >(*this).compare(s1.data(),
      s1.data()+s1.size(), s2.data(),
      s2.data()+s2.size()) < 0;

   This allows a	locale to be used with standard	algorithms, such as
   sort, to provide localized comparison of strings.

 PUBLIC MEMBER FUNCTIONS

   basic_string<char> name() const; Returns the name of this, if this
   has one;	otherwise returns the string "*".

 STATIC PUBLIC MEMBER FUNCTIONS

   static locale
   global(const locale& loc);
      Sets the global locale to loc.  This causes future	uses of	the
      default constructor for locale to return a	copy of	loc.  If loc
      has a name, this function has the further effect of
      calling std::setlocale(LC_ALL,loc.name().c_str());.  Returns the
      previous value of	 locale().

   static const locale&
   classic();

      Returns a locale with the same semantics as the classic "C" locale.

 EXAMPLE

   //
   // locale.cpp
   //

    #include <string>
    #include <vector>
    #include <iostream>
    #include "codecvte.h"

   int main ()
    {
    using namespace std;

    locale loc;	// Default locale

     // Construct new locale using default locale plus
     // user defined codecvt facet
     // This facet converts from	ISO Latin
     // Alphabet	No. 1 (ISO 8859-1) to
     // U.S. ASCII code page 437
     // This facet replaces the default for
     // codecvt<char,char,mbstate_t>
    locale my_loc(loc,new ex_codecvt);

     // imbue modified locale onto cout
    locale old =	cout.imbue(my_loc);
    cout	<< "A jolly time was had by all" << endl;

    cout.imbue(old);
    cout	<< "A jolly time was had by all" << endl;

     // Create a	vector of strings
    vector<string,allocator<void> > v;
    v.insert(v.begin(),"antelope");
    v.insert(v.begin(),"bison");
    v.insert(v.begin(),"elk");

    copy(v.begin(),v.end(),
 	ostream_iterator<string,char,
 		 char_traits<char> >(cout," "));
    cout	<< endl;

     // Sort the	strings	using the locale as a comparitor
    sort(v.begin(),v.end(),loc);

    copy(v.begin(),v.end(),
 	ostream_iterator<string,char,
 		char_traits<char> >(cout," "));

    cout	<< endl;
    return 0;
   }

 SEE ALSO

   facets, has_facet, use_facet,	specific facet reference sections

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  2 - codecvt_byname

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   codecvt_byname - A facet that	provides code set converion
   classification facilities based on the named	locales.

 SYNOPSIS

   #include <locale>
   template <class charT> class codecvt_byname;

 DESCRIPTION

   The codecvt_byname  template provides	the same functionality as the
   codecvt template, but	specific to a particular named locale.	For a
   description of the member functions of codecvt_byname, see the
   reference for	codecvt. Only the constructor is described here.

 INTERFACE

   template <class fromT, class toT, class stateT>
   class	codecvt_byname : public	codecvt<fromT, toT, stateT> {
   public:
    explicit codecvt_byname(const char*,	size_t refs = 0);
   protected:
     ~codecvt_byname();	// virtual
    virtual result do_out(stateT&,
 			 const internT*,
 			 const internT*,
 			 const internT*&,
 			 externT*, externT*,
 			 externT*&) const;
    virtual result do_in(stateT&,
 			const externT*,
 			const externT*,
 			const externT*&,
 			internT*, internT*,
 			internT*&) const;

    virtual bool	do_always_noconv() const throw();
    virtual int do_length(const stateT&,	const internT*,
 			 const internT*,
    virtual int do_max_length() const throw();
    virtual int do_encoding() const throw();
   };

 CONSTRUCTOR

   explicit codecvt_byname(const	char* name, size_t refs	= 0);
      Construct a codecvt_byname	facet.	The facet will provide codeset
      conversion	relative to the	named locale specified by the name
      argument. If	the refs argument is 0,	destruction of the
      object is delegated to the locale, or	locales, containing
      it.	This allows the	user to	ignore life-time management
      issues.  On the other had,	if refs	 is 1, the object must be
      explicitly	deleted:  the locale will not do so.  In this case,
      the object	can be maintained across the lifetime of multiple
      locales.

 SEE ALSO

   locale, facets, codecvt

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  3 - code_cvt

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   code_cvt - Code conversion facet.

 SYNOPSIS

   #include <locale>
   class	codecvt_base;

   template <class internT, class externT, class	stateT>
   class	codecvt;

 DESCRIPTION

   The codecvt<internT,externT,stateT> template provides	code
   conversion facilities.  Default implementations of
   codecvt<char,wchar_t,mbstate_t> and codecvt<wchar_t,char,mbstate_t>
   use ctype<wchar_t>::widen and ctype<wchar_t>::narrow respectively.
   The default implementation of codecvt<wchar_t,wchar_t,mbstate_t>
   simply uses memcpy	(no particular conversion applied).

 INTERFACE

   class	codecvt_base {
   public:
    enum	result { ok, partial, error, noconv };
   };

   template <class internT, class externT, class	stateT>
   class	codecvt	: public locale::facet,	public codecvt_base {
   public:
    typedef internT  intern_type;
    typedef externT  extern_type;
    typedef stateT   state_type;

    explicit codecvt(size_t = 0)
    result out(stateT&, const internT*,
 	     const internT*, const internT*&,
 	     externT*, externT*, externT*&) const;
    result in(stateT&, const externT*,
 	     const externT*, const externT*&,
 	     internT*, internT*, internT*&) const;

    bool	always_noconv()	const throw();
    int length(const stateT&, const internT*, const internT*,
 	      size_t) const;

    int max_length() const throw();
    int encoding() const	throw();
    static locale::id id;

   protected:
     ~codecvt();	 // virtual
    virtual result do_out(stateT&,
 			 const internT*,
 			 const internT*,
 			 const internT*&,
 			 externT*, externT*,
 			 externT*&) const;
    virtual result do_in(stateT&,
 			const externT*,
 			const externT*,
 			const externT*&,
 			internT*, internT*,
 			internT*&) const;

    virtual bool	do_always_noconv() const throw();
    virtual int do_length(const stateT&,	const internT*,
 			 const internT*,
 			 size_t) const;

    virtual int do_max_length() const throw();
    virtual int do_encoding() const throw();
   };

 TYPES

   intern_type
      Type of character to convert from.

   extern_type
      Type of character to convert to.

   state_type
      Type to keep track	of state and determine the direction of	the
      conversion.

 CONSTRUCTORS AND DESTRUCTORS

   explicit codecvt(size_t refs = 0)
      Construct a codecvt facet.	 If the	refs argument is 0 then
      destruction of	the object is delegated	to the locale, or
      locales, containing it. This allows the user to ignore lifetime
      management	issues.	 On the	other had, if refs  is 1	then
      the object	must be	explicitly deleted; the locale will not do
      so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   ~codecvt();  // virtual and protected
      Destroy the facet

 FACET ID

   static locale::id id;
      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the codecvt facet provide an interface to
   protected members.  Each public	member xxx has a corresponding
   virtual protected member do_xxx.  All work is delagated	to
   these protected members.   For instance, the	long version of	the
   public length function simply calls	its protected cousin
   do_length.

   bool
   always_noconv() const
    throw();

   int
   encoding() const
    throw();

   result
   in(stateT& state, const externT* from,
     const externT* from_end, const externT*& from_next,
     internT* to, internT* to_limit, internT*& to_next) const;

   int
   length(const stateT&,	const internT* from,
 	const internT* end,
 	size_t max) const;

   int
   max_length() const
    throw();

   result
   out(stateT& state, const internT* from,
      const internT* from_end, const internT*& from_next,
      externT* to, externT* to_limit, externT*& to_next)	const;
      Each of these public member functions xxx simply calls the
      corresponding protected do_xxx function.

 PROTECTED MEMBER FUNCTIONS

   virtual bool
   do_always_noconv() const
    throw();
      Returns true if no	conversion is required.	 This is the case if
      do_in and do_out	return noconv for all valid arguments.	The
      instantiation codecvt<char,char,mbstate_t> returns true,	while
      all other	default instantiations return false.

   virtual int
   do_encoding()	const
    throw();
      Returns one of the	following

      +	     -1	if the encoding	on the external	character sequence is
           dependent on state.

      +	     A constant	number representing the	number of external
           characters in a fixed width encoding.

      +	     0 if the encoding is uses a variable width.

   virtual result
   do_in(stateT&	state,
        const externT* from,
        const externT* from_end,
        const externT*& from_next,
        internT*	to, internT* to_limit,
        internT*& to_next) const;

   virtual result
   do_out(stateT& state,
 	const internT* from,
 	const internT* from_end,
 	const internT*&	from_next,
 	externT* to, externT* to_limit,
 	externT*& to_next) const;
      Both functions take characters in the range of [from,from_end),
      apply an appropriate conversion, and place the resulting
      characters	in the buffer starting at to.  Each function converts
      at	most from_end-from internT characters, and stores no more than
      to_limit-to externT characters. Both do_out and do_in will	stop
      if	they find a character they cannot convert.  In any case,
      from_next and to_next are always left pointing to the next
      character	beyond the last	one successfully converted.

      do_out and	do_in must be called under the following pre-conditions:

      +	     from <= from_end

      +	     to	<= to_end

      +	     state either initialized for the beginning	of a sequence or
 	  equal	to the result of the previous conversion on the	sequence.

   In	the case where no conversion is	required, from_next will be
   set	to from and to_next set to to.

      do_out and	do_in return one the following:

        Return Value   Meaning

        ok	      completed	the conversion
        partial	      not all source characters	converted
        error	      encountered a from_type character	it
 			    could not convert
        noconv	      no conversion was	needed

   If either function returns partial and (from == from_end) then one
   of	two conditions prevail:

   +	  The destination sequence has not accepted all	the converted
        characters, or

   +	  Additional internT characters	are needed before another
        externT character can be	assembled.

   virtual int
   do_length(const stateT&, const internT* from,
 	   const internT* end,
 	   size_t max) const;
      Returns the largest number	< max of internT characters available
      in the range [from,end).

      do_length must be called under the	following pre-conditions:

      +	     from <= from_end

      +	     state either initialized for the beginning	of a sequence or
 	  equal	to the result of the previous conversion on the	sequence.

   virtual int
   do_max_length() const	throw();
      Returns the maximum value that do_length can  return for any
      valid	set of	arguments.

   virtual result
   do_out(stateT& state,
 	const internT* from,
 	const internT* from_end,
 	const internT*&	from_next,
 	externT* to, externT* to_limit,
 	externT*& to_next) const;
      See do_in above.

 EXAMPLE

   //
   // codecvt.cpp
   //
   #include <sstream>
   #include "codecvte.h"

   int main ()
   {
    using namespace std;

    mbstate_t state;

     // A string	of ISO characters and buffers to hold
     // conversions
    string ins("	  );

    string ins2(ins.size(),'.');
    string outs(ins.size(),'.');

     // Print initial contents of buffers
    cout	<< "Before:0 <<	ins << endl;
    cout	<< ins2	<< endl;
    cout	<< outs	<< endl	<< endl;

     // Initialize buffers
    string::iterator in_it = ins.begin();
    string::iterator out_it = outs.begin();

     // Create a	user defined codecvt fact
     // This facet converst from	ISO Latin
     // Alphabet	No. 1 (ISO 8859-1) to
     // U.S. ASCII code page 437
     // This facet replaces the default for
     // codecvt<char,char,mbstate_t>
    locale loc(locale(),new ex_codecvt);

     // Now get the facet from the locale
    const codecvt<char,char,mbstate_t>& cdcvt =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
      use_facet<codecvt<char,char,mbstate_t> >(loc);
   #else
      use_facet(loc,(codecvt<char,char,mbstate_t>*)0);
   #endif

     // convert the buffer
    cdcvt.in(state,ins.begin(),ins.end(),in_it,
 	    outs.begin(),outs.end(),out_it);

    cout	<< "After in:0 << ins << endl;
    cout	<< ins2	<< endl;
    cout	<< outs	<< endl	<< endl;

     // Lastly, convert back to the original codeset
    in_it = ins.begin();
    out_it = outs.begin();
    cdcvt.out(state, outs.begin(),outs.end(),out_it,
 	     ins2.begin(),ins2.end(),in_it);

    cout	<< "After out:0	<< ins << endl;
    cout	<< ins2	<< endl;
    cout	<< outs	<< endl;

    return 0;
   }

 SEE ALSO

   locale, facets, codecvt_byname

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  4 - collate

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   collate, collate_byname - String collation, comparison, and hashing
   facet.

 SYNOPSIS

   #include <locale>
   template <class charT> class collate;
   template <class charT> class collate_byname;

 DESCRIPTION

   The collate and collate_byname facets	provides string	collation,
   comparison, and hashing facilities.   collate provides these
   facilities for the "C" locale, while	collate_byname provides	the
   same thing for named locales.

 INTERFACE

   template <class charT>
   class	collate	: public locale::facet {
   public:
    typedef charT	       char_type;
    typedef basic_string<charT> string_type;
    explicit collate(size_t refs	= 0);
    int compare(const charT*, const charT*,
 	       const charT*, const charT*) const;
    string_type transform(const charT*, const charT*) const;
    long	hash(const charT*, const charT*) const;
    static locale::id id;
   protected:
     ~collate();	 // virtual
    virtual int do_compare(const	charT*,	const charT*,
 			  const	charT*,	const charT*) const;
    virtual string_type do_transform(const charT*, const	charT*)	const;
    virtual long	do_hash	(const charT*, const charT*) const;
   };

   template <class charT>
   class	collate_byname : public	collate<charT> {
   public:
    explicit collate_byname(const char*,	size_t = 0);
   protected:
     ~collate_byname();	// virtual
    virtual int do_compare(const	charT*,	const charT*,
 			  const	charT*,	const charT*) const;
    virtual string_type do_transform(const charT*, const	charT*)	const;
    virtual long	do_hash(const charT*, const charT*) const;
   };

 TYPES

   char_type
      Type of character the facet is instantiated on.

   string_type
      Type of character string returned by member functions.

 CONSTRUCTORS AND DESTRUCTORS

   explicit collate(size_t refs = 0)
      Construct a collate facet.	 If the	refs argument is 0,
      destruction	of the object	is delegated to	the locale, or
      locales,	containing it. This allows the	user to	ignore
      lifetime	management issues.  On the other had, if	refs
      is 1, the	object must be explicitly deleted:  the	locale will
      not do so.	 In this case, the object can be maintained across the
      life-time of multiple locales.

   explicit collate_byname(const	char* name, size_t refs	= 0);
      Construct a collate_byname	facet.	Use the	named locale specified
      by the name argument.  The refs argument serves the same purpose
      as it does for the collate constructor.

   ~collate();  // virtual and protected
   ~collate_byname();  // virtual and protected
      Destroy the facet

 FACET ID

   static locale::id id;
      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

      The public members of	the collate facet provide an interface
      to protected members.  Each public	member xxx has a corresponding
      virtual protected member do_xxx.  All work is delagated	to
      these protected members.   For instance, the	long version
      of	the public grouping function simply calls its protected cousin
      do_grouping.

   int
   compare(const	charT* low1, const charT* high1,
 	 const charT* low2, const charT* high2)	const;

   long
   hash(const charT* low, const charT* high) const;

   string_type
   transform(const charT* low, const charT* high) const;
      Each of these public member functions xxx simply call the
      corresponding protected do_xxx function.

 PROTECTED MEMBER FUNCTIONS

   virtual int
   do_compare(const charT* low1,	const charT* high1,
 	    const charT* low2, const charT* high2) const;
      Returns 1 if the character	string represented by the range
      [low1,high1) is	greater	than the character string represented
      by the range [low2,high2), -1 if first string is less than the
      second, or 0 if the two are equal.  collate uses a
      lexicographical comparison.

   virtual long
   do_hash( const charT*	low, const charT* high)
      Generate a	has value from a string	defined	by the range of
      characters [low,high).  Given	two strings that compare equal
      (i.e. do_compare returns 0), do_hash returns an integer value
      that is the same for both strings.  For differing strings the
      probability that the return value will be equal is approximately
      1.0/numeric_limits<unsigned long>::max().

   virtual string_type
   do_transform(const charT* low, const charT* high) const;
      Returns a string that will	yield the same result in a
      lexicographical comparison	with another string returned from
      transform as does the do_compare	function applied to the
      original strings.  In other words, the result	of  applying a
      lexicographical comparison to two strings returned from transform
      will be the same as applying do_compare to	the original strings
      passed to	transform.

 EXAMPLE

   //
   // collate.cpp
   //
   #include <iostream>

   int main ()
   {
    using namespace std;
    locale loc;
    string s1("blue");
    string s2("blues");
     // Get a reference to the collate<char> facet
    const collate<char>&	co =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
        use_facet<collate<char> >(loc);
   #else
        use_facet(loc,(collate<char>*)0);
   #endif
     // Compare two strings
    cout	<< co.compare(s1.begin(),s1.end(),
 		      s2.begin(),s2.end()-1) <<	endl;
    cout	<< co.compare(s1.begin(),s1.end(),
 		      s2.begin(),s2.end()) << endl;
     // Retrieve	hash values for	two strings
    cout	<< co.hash(s1.begin(),s1.end())	<< endl;
    cout	<< co.hash(s2.begin(),s2.end())	<< endl;
    return 0;
   }

 SEE ALSO

   locale, facets, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  5 - collate_byname

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   collate, collate_byname - String collation, comparison, and hashing
   facet.

 SYNOPSIS

   #include <locale>
   template <class charT> class collate;
   template <class charT> class collate_byname;

 DESCRIPTION

   The collate and collate_byname facets	provides string	collation,
   comparison, and hashing facilities.   collate provides these
   facilities for the "C" locale, while	collate_byname provides	the
   same thing for named locales.

 INTERFACE

   template <class charT>
   class	collate	: public locale::facet {
   public:
    typedef charT	       char_type;
    typedef basic_string<charT> string_type;
    explicit collate(size_t refs	= 0);
    int compare(const charT*, const charT*,
 	       const charT*, const charT*) const;
    string_type transform(const charT*, const charT*) const;
    long	hash(const charT*, const charT*) const;
    static locale::id id;
   protected:
     ~collate();	 // virtual
    virtual int do_compare(const	charT*,	const charT*,
 			  const	charT*,	const charT*) const;
    virtual string_type do_transform(const charT*, const	charT*)	const;
    virtual long	do_hash	(const charT*, const charT*) const;
   };

   template <class charT>
   class	collate_byname : public	collate<charT> {
   public:
    explicit collate_byname(const char*,	size_t = 0);
   protected:
     ~collate_byname();	// virtual
    virtual int do_compare(const	charT*,	const charT*,
 			  const	charT*,	const charT*) const;
    virtual string_type do_transform(const charT*, const	charT*)	const;
    virtual long	do_hash(const charT*, const charT*) const;
   };

 TYPES

   char_type
      Type of character the facet is instantiated on.

   string_type
      Type of character string returned by member functions.

 CONSTRUCTORS AND DESTRUCTORS

   explicit collate(size_t refs = 0)

      Construct a collate facet.	 If the	refs argument is 0,
      destruction	of the object	is delegated to	the locale, or
      locales,	containing it. This allows the	user to	ignore
      lifetime	management issues.  On the other had, if	refs
      is 1, the	object must be explicitly deleted:  the	locale will
      not do so.	 In this case, the object can be maintained across the
      lifetime of multiple locales.

   explicit collate_byname(const	char* name, size_t refs	= 0);
      Construct a collate_byname	facet.	Use the	named locale specified
      by the name argument.  The refs argument serves the same purpose
      as it does for the collate constructor.

   ~collate();  // virtual and protected
   ~collate_byname();  // virtual and protected
      Destroy the facet

 FACET ID

   static locale::id id;
      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the collate facet provide an interface to
   protected members.  Each public	member xxx has a corresponding
   virtual protected member do_xxx.  All work is delagated	to
   these protected members.   For instance, the	long version of	the
   public grouping function simply calls its protected cousin
   do_grouping.

   int
   compare(const	charT* low1, const charT* high1,
 	 const charT* low2, const charT* high2)	const;

   long
   hash(const charT* low, const charT* high) const;

   string_type
   transform(const charT* low, const charT* high) const;
      Each of these public member functions xxx simply call the
      corresponding protected do_xxx function.

 PROTECTED MEMBER FUNCTIONS

   virtual int
   do_compare(const charT* low1,	const charT* high1,
 	    const charT* low2, const charT* high2) const;
      Returns 1 if the character	string represented by the range
      [low1,high1) is	greater	than the character string represented
      by the range [low2,high2), -1 if first string is less than the
      second, or 0 if the two are equal.  collate uses a
      lexicographical comparison.

   virtual long
   do_hash( const charT*	low, const charT* high)
      Generate a	has value from a string	defined	by the range of
      characters [low,high).  Given	two strings that compare equal
      (i.e. do_compare returns 0), do_hash returns an integer value
      that is the same for both strings.  For differing strings the
      probability that the return value will be equal is approximately
      1.0/numeric_limits<unsigned long>::max().

   virtual string_type
   do_transform(const charT* low, const charT* high) const;
      Returns a string that will	yield the same result in a
      lexicographical comparison	with another string returned from
      transform as does the do_compare	function applied to the
      original strings.  In other words, the result	of  applying a
      lexicographical comparison to two strings returned from transform
      will be the same as applying do_compare to	the original strings
      passed to	transform.

 EXAMPLE

   //
   // collate.cpp
   //
   #include <iostream>

   int main ()
   {
    using namespace std;
    locale loc;
    string s1("blue");
    string s2("blues");
     // Get a reference to the collate<char> facet
    const collate<char>&	co =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
        use_facet<collate<char> >(loc);
   #else
        use_facet(loc,(collate<char>*)0);
   #endif
     // Compare two strings
    cout	<< co.compare(s1.begin(),s1.end(),
 		      s2.begin(),s2.end()-1) <<	endl;
    cout	<< co.compare(s1.begin(),s1.end(),
 		      s2.begin(),s2.end()) << endl;
     // Retrieve	hash values for	two strings
    cout	<< co.hash(s1.begin(),s1.end())	<< endl;
    cout	<< co.hash(s2.begin(),s2.end())	<< endl;
    return 0;
   }

 SEE ALSO

   locale, facets, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  6 - facets

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   facets - Family of classes used to encapsulate categories of locale
   functionality.

 DESCRIPTION

   The Standard C++ Localization	library	provides a locale interface
   that contains	a collection of	diverse	facets.	 Each facet
   provides localization facilities for some specific area, such as
   character classification or numeric formatting.  Each facet also
   falls into one or more broad categories.  These categories	are
   defined in the locale class, and the standard facets fit into these
   categories as follows.

   Category     Facets

   collate      collate,	collate_byname
   ctype	       ctype, codecvt, ctype_byname, codecvt_byname
   monetary     moneypunct, moneypunct_byname, money_put,
 		  money_get
   numeric      numpunct, numpunct_byname, num_put, num_get
   time	       time_put, time_put_byname, time_get,
 		  time_get_byname
   messages     messages, messages_byname

   A facet must satisfy two properties.	First, it must be derived from
   the base class locale::facet, either directly or indirectly (for
   example,	facet -> ctype<char> -> my_ctype).	Second,	it
   must	contain	a member of type locale::id.  This ensures that the
   locale class can manage its collection of facets properly.

 SEE ALSO

   locale, specific facet reference sections

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  7 - has_facet

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   has_facet - A	function template used to determine if a locale	has a
   given facet.

 SYNOPSIS

   #include <locale>
   template <class Facet> bool has_facet(const locale&) throw();

 DESCRIPTION

   has_facet returns true if the	requested facet	is available in	the
   locale, otherwise it returns false.	You specify the	facet type by
   explicitly providing the template parameter. (See the example
   below.)

      Note that if your compiler cannot overload function templates
      on return type then you'll need	to use an alternative
      has_facet	template.  The alternative template takes	an
      additional argument that's a	pointer	to the type of facet
      you want to check on.  The declaration looks	like this:

   template <class Facet>
   const	bool has_facet(const locale&, Facet*) throw();

   The example below shows the use of both variations of	has_facet.

 EXAMPLE

   //
   // hasfacet.cpp
   //

   #include <iostream>

   int main ()
   {
    using namespace std;

    locale loc;

   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
    cout	<< has_facet<ctype<char> >(loc)	<< endl;
   #else
    cout	<< has_facet(loc,(ctype<char>*)0) << endl;
   #endif

    return 0;
   }

 SEE ALSO

   locale, facets, use_facet

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  8 - isalnum

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   isalnum - Determines if a character is alphabetic or numeric.

 SYNOPSIS

   #include <locale>
   template <class charT>

   bool isalnum (charT c, const locale& loc) const;

 DESCRIPTION

   The isalnum function returns true if the character passed as a
   parameter is either part of the alphabet specified	by the locale
   parameter	or a decimal digit, otherwise the function
   returns	false.	 The check is made using the ctype	facet
   from the locale parameter.

 EXAMPLE

   //
   // isalnum.cpp
   //

   #include <iostream>

   int main ()
   {
    using namespace std;

    locale loc;

    cout	<< isalnum('a',loc) << endl;
    cout	<< isalnum(',',loc) << endl;

    return 0;
   }

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  9 - isalpha

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   isalpha - Determines if a character is alphabetic.

 SYNOPSIS

   #include <locale>

   template <class charT>
   bool isslpha (charT c, const locale& loc) const;

 DESCRIPTION

   The isslpha function returns true if the character passed as a
   parameter is part of the alphabet specified by the	locale
   parameter, otherwise the	function returns false.	The
   check is made using	the ctype facet	from the locale parameter.

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  10 - iscntrl

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   iscntrl - Determines if a character is a control character.

 SYNOPSIS

   #include <locale>

   template <class charT>
   bool iscntrl (charT c, const locale& loc) const;

 DESCRIPTION

   The iscntrl function returns true if the character passed as a
   parameter is a control character, otherwise the function returns
   false.	The check is made using the ctype facet from the
   locale parameter.

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  11 - isdigit

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   isdigit - Determines if a character is a decimal digit.

 SYNOPSIS

   #include <locale>

   template <class charT>
   bool isdigit (charT c, const locale& loc) const;

 DESCRIPTION

   The isdigit function returns true if the character passed as a
   parameter is a decimal digit, otherwise the function returns false.
   The check is	made using	the ctype facet	from the locale
   parameter.

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  12 - isgraph

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   isgraph - Determines if a character is a graphic character.

 SYNOPSIS

   #include <locale>

   template <class charT>
   bool isgraph (charT c, const locale& loc) const;

 DESCRIPTION

   The isgraph function returns true if the character passed as a
   parameter is a graphic character, otherwise the function returns
   false.   The check is made using the ctype facet from the locale
   parameter.

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  13 - islower

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   islower - Determines whether a character is lower case.

 SYNOPSIS

   #include <locale>

   template <class charT>
   bool islower (charT c, const locale& loc) const;

 DESCRIPTION

   The islower function returns true if the character passed as a
   parameter is lower	case, otherwise	the function returns false.
   The check is made using the ctype facet from the locale parameter.

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  14 - isprint

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   isprint - Determines if a character is printable.

 SYNOPSIS

   #include <locale>

   template <class charT>
   bool isprint (charT c, const locale& loc) const;

 DESCRIPTION

   The isprint function returns true if the character passed as a
   parameter is printable, otherwise the function returns false.  The
   check is made using the ctype facet from the locale parameter.

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  15 - ispunct

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   ispunct - Determines if a character is punctuation.

 SYNOPSIS

   #include <locale>

   template <class charT>
   bool ispunct (charT c, const locale& loc) const;

 DESCRIPTION

   The ispunct function returns true if the character passed as a
   parameter is punctuation, otherwise the function returns false.  The
   check	is made	using the ctype facet from the locale parameter.

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  16 - isspace

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   isspace - Determines if a character is a space.

 SYNOPSIS

   #include <locale>

   template <class charT>
   bool isspace (charT c, const locale& loc) const;

 DESCRIPTION

   The isspace  function	returns	true if	the character passed as	a
   parameter is a space character,	otherwise the function returns
   false.  The check is made using the ctype facet from the locale
   parameter.

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  17 - isupper

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   isupper - Determines whether a character is upper case.

 SYNOPSIS

   #include <locale>

   template <class charT>
   bool isupper (charT c, const locale& loc) const;

 DESCRIPTION

   The isupper function returns true if the character passed as a
   parameter is upper	case, otherwise	the function returns false.
   The check	is made	using the ctype facet from the locale
   parameter.

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  18 - isxdigit

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   isxdigit - Determines	whether	a character is a hexidecimal digit.

 SYNOPSIS

   #include <locale>

   template <class charT>
   bool isxdigit	(charT c, const	locale&	loc) const;

 DESCRIPTION

   The isxdigit function	returns	true if	the character passed as	a
   parameter is a hexidecimal digit, otherwise the	function
   returns false.	  The check is made using	the ctype
   facet	from the locale	parameter.

 SEE ALSO

   other	is_ functions, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  19 - messages

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   messages, messages_byname - Messaging	facets.

 SYNOPSIS

   #include<locale>
   class	messages_base;

   template <class charT> class messages;

 DESCRIPTION

   messages  provides access to a localized messaging facility. The
   messages facet	provides facilities based on the "C" locale,
   while the messages_byname facet	provides the same facilities
   for named locales.

   The messages_base class provides a catalog type for use by the
   derived messages	and messages_byname classes.

   Note that the	default	messages facet uses catopen, catclose, etc.,
   to implement the	message	database.  If your platform does not
   support these then you'll need to imbue your own messages facet by
   implementing whatever database is available.

 INTERFACE

   class	messages_base {
   public:
    typedef int catalog;
   };

   template <class charT>
   class	messages : public locale::facet, public	messages_base {
   public:
    typedef charT char_type;
    typedef basic_string<charT> string_type;
    explicit messages(size_t = 0);
    catalog open(const basic_string<char>&, const locale&) const;
    string_type	get(catalog, int, int,
 		    const string_type&)	const;
    void	   close(catalog) const;
    static locale::id id;
   protected:
     ~messages();  // virtual
    virtual catalog do_open(const basic_string<char>&,
 			   const locale&) const;
    virtual string_type	do_get(catalog,	int, int,
 			       const string_type&) const;
    virtual void	   do_close(catalog) const;
   };

   class	messages_byname	: public messages<charT> {
   public:
    explicit messages_byname(const char*, size_t	= 0);
   protected:
     ~messages_byname();	 // virtual
    virtual catalog do_open(const basic_string<char>&,
 			   const locale&) const;
   virtual string_type  do_get(catalog, int, int,
 			     const string_type&) const;
    virtual void	   do_close(catalog) const;
   };

 TYPES

   char_type
      Type of character the facet is instantiated on.

   string_type
      Type of character string returned by member functions.

 CONSTRUCTORS AND DESTRUCTORS

   explicit messages(size_t refs	= 0)
      Construct a messages facet.  If the refs argument is 0 then
      destruction of	the object is delegated	to the locale, or
      locales, containing it. This allows the user to ignore lifetime
      management	issues.	 On the	other hand, if refs is 1	then
      the object	must be	explicitly deleted:  the locale will not do
      so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   explicit messages_byname(const char* name, size_t refs = 0);
      Construct a messages_byname facet.	 Use the named locale
      specified	by the name argument.	 The refs argument serves the
      same purpose as it does for the messages constructor.

   ~messages();	// virtual and protected
      Destroy the facet

 FACET ID

   static locale::id id;

      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the messages facet provide an interface	to
   protected members.  Each public	member xxx has a corresponding
   virtual protected member do_xxx.  All work is delagated	to
   these protected members.   For instance, the	long version of	the
   public open	function simply	calls its protected cousin do_open.

   void
   close(catalog	c) const;

   string_type
   get(catalog c, int set, int msgid,
      const string_type&	dfault)	const;

   catalog
   open(const basic_string<char>& fn, const locale&) const;
      Each of these public member functions xxx simply call the
      corresponding protected do_xxx function.

 PROTECTED MEMBER FUNCTIONS

   virtual void
   do_close(catalog cat)	const;
      Closes the	catalog.  The cat argument must	have been obtained by
      a	call to	open().

   virtual string_type
   do_get(catalog cat, int set, int msgid,
 	const string_type& dfault) const;
      Retrieves a specific message.  Returns the	message	identified by
      cat, set, msgid, and dfault.  cat must have been obtained by a
      previous	call to	open() and this	function must not be called
      with a cat that has	had close() called on yet after the
      last call to open().  In other words, the catalog must have been
      opened and not yet closed.

   virtual catalog
   do_open(const	basic_string<char>& name, const	locale&) const;
      Opens a message catalog.  Returns a catalog identifier that can
      be passed to the get() function in order to access specific
      messages. Returns -1	if the catalog name specificed in the
      name argument is invalid.  The loc argument	will be	used
      for codeset conversion if necessary.

 EXAMPLE

   //
   // messages.cpp
   //
   #include <string>
   #include <iostream>

   int main ()
   {
    using namespace std;

    locale loc;

     // Get a reference to the messages<char> facet
    const messages<char>& mess =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
      use_facet<messages<char> >(loc);
   #else
      use_facet(loc,(messages<char>*)0);
   #endif

     // Open a catalog and try to grab
     // both some valid messages, and an	invalid	message
    string def("Message Not Found");
    messages<char>::catalog cat =
 	   mess.open("./rwstdmessages.cat",loc);
    if (cat != -1)
     {
      string msg0 = mess.get(cat,1,1,def);
      string msg1 = mess.get(cat,1,2,def);
      string msg2 = mess.get(cat,1,6,def); // invalid msg #
      string msg3 = mess.get(cat,2,1,def);

      mess.close(cat);
      cout << msg0 << endl << msg1 << endl
 	   << msg2 << endl << msg3 << endl;
     }
    else
      cout << "Unable to	open message catalog" << endl;

    return 0;
   }

 SEE ALSO

   locale, facets

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  20 - messages_byname

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   messages, messages_byname - Messaging	facets.

 SYNOPSIS

   #include<locale>
   class	messages_base;

   template <class charT> class messages;

 DESCRIPTION

   messages  provides access to a localized messaging facility. The
   messages facet	provides facilities based on the "C" locale,
   while the messages_byname facet	provides the same facilities
   for named locales.

   The messages_base class provides a catalog type for use by the
   derived messages	and messages_byname classes.

   Note that the	default	messages facet uses catopen, catclose, etc.,
   to implement the	message	database.  If your platform does not
   support these then you'll need to imbue your own messages facet by
   implementing whatever database is available.

 INTERFACE

   class	messages_base {
   public:
    typedef int catalog;
   };

   template <class charT>
   class	messages : public locale::facet, public	messages_base {
   public:
    typedef charT char_type;
    typedef basic_string<charT> string_type;
    explicit messages(size_t = 0);
    catalog open(const basic_string<char>&, const locale&) const;
    string_type	get(catalog, int, int,
 		    const string_type&)	const;
    void	   close(catalog) const;
    static locale::id id;
   protected:
     ~messages();  // virtual
    virtual catalog do_open(const basic_string<char>&,
 			   const locale&) const;
    virtual string_type	do_get(catalog,	int, int,
 			       const string_type&) const;
    virtual void	   do_close(catalog) const;
   };

   class	messages_byname	: public messages<charT> {
   public:
    explicit messages_byname(const char*, size_t	= 0);
   protected:
     ~messages_byname();	 // virtual
    virtual catalog do_open(const basic_string<char>&,
 			   const locale&) const;
   virtual string_type  do_get(catalog, int, int,
 			     const string_type&) const;
    virtual void	   do_close(catalog) const;
   };

 TYPES

   char_type
      Type of character the facet is instantiated on.

   string_type
      Type of character string returned by member functions.

 CONSTRUCTORS AND DESTRUCTORS

   explicit messages(size_t refs	= 0)
      Construct a messages facet.  If the refs argument is 0 then
      destruction of	the object is delegated	to the locale, or
      locales, containing it. This allows the user to ignore lifetime
      management	issues.	 On the	other hand, if refs is 1	then
      the object	must be	explicitly deleted:  the locale will not do
      so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   explicit messages_byname(const char* name, size_t refs = 0);
      Construct a messages_byname facet.	 Use the named locale
      specified	by the name argument.	 The refs argument serves the
      same purpose as it does for the messages constructor.

   ~messages();	// virtual and protected
      Destroy the facet

 FACET ID

   static locale::id id;
      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the messages facet provide an interface	to
   protected members.  Each public	member xxx has a corresponding
   virtual protected member do_xxx.  All work is delagated	to
   these protected members.   For instance, the	long version of	the
   public open	function simply	calls its protected cousin do_open.

   void
   close(catalog	c) const;

   string_type
   get(catalog c, int set, int msgid,
      const string_type&	dfault)	const;

   catalog
   open(const basic_string<char>& fn, const locale&) const;
      Each of these public member functions xxx simply call the
      corresponding protected do_xxx function.

 PROTECTED MEMBER FUNCTIONS

   virtual void
   do_close(catalog cat)	const;
      Closes the	catalog.  The cat argument must	have been obtained by
      a	call to	open().

   virtual string_type
   do_get(catalog cat, int set, int msgid,
 	const string_type& dfault) const;
      Retrieves a specific message.  Returns the	message	identified by
      cat, set, msgid, and dfault.  cat must have been obtained by a
      previous	call to	open() and this	function must not be called
      with a cat that has	had close() called on yet after the
      last call to open().  In other words, the catalog must have been
      opened and not yet closed.

   virtual catalog
   do_open(const	basic_string<char>& name, const	locale&) const;
      Opens a message catalog.  Returns a catalog identifier that can
      be passed to the get() function in order to access specific
      messages. Returns -1	if the catalog name specificed in the
      name argument is invalid.  The loc argument	will be	used
      for codeset conversion if necessary.

 EXAMPLE

   //
   // messages.cpp
   //
   #include <string>
   #include <iostream>

   int main ()
   {
    using namespace std;

    locale loc;

     // Get a reference to the messages<char> facet
    const messages<char>& mess =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
      use_facet<messages<char> >(loc);
   #else
      use_facet(loc,(messages<char>*)0);
   #endif

     // Open a catalog and try to grab
     // both some valid messages, and an	invalid	message
    string def("Message Not Found");
    messages<char>::catalog cat =
 	   mess.open("./rwstdmessages.cat",loc);
    if (cat != -1)
     {
      string msg0 = mess.get(cat,1,1,def);
      string msg1 = mess.get(cat,1,2,def);
      string msg2 = mess.get(cat,1,6,def); // invalid msg #
      string msg3 = mess.get(cat,2,1,def);

      mess.close(cat);
      cout << msg0 << endl << msg1 << endl
 	   << msg2 << endl << msg3 << endl;
     }
    else
      cout << "Unable to	open message catalog" << endl;

    return 0;
   }

 SEE ALSO

   locale, facets

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  21 - moneypunct

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   moneypunct, moneypunct_byname	- Monetary punctuation facets.

 SYNOPSIS

   #include <locale>
   class	money_base;

   template <class charT, bool International = false>
   class	moneypunct;

 DESCRIPTION

   The moneypunct facets	provide	formatting specifications and
   punctuation character for	monetary values. The moneypunct	facet
   provides punctuation based	on the "C" locale, while the
   moneypunct_byname facet provides the same facilities for named
   locales.

   The facet is used by money_put for outputting	formatted
   representations of monetary values and by money_get for reading
   these strings back in.

   money_base provides a	structure, pattern, that specifies the order
   of	syntactic elements in a monetary	value and enumeration
   values representing those	elements.  The pattern struct provides
   a simple	array of characters, field.  Each index in	field
   is taken up by an	enumeration value indicating the location of a
   syntactic element.	The enumeration	values are described below:

   Format Flag	 Meaning

   none		 No grouping seperator
   space		 Use space for grouping	seperator
   symbol	 Currency symbol
   sign		 Sign of monetary value
   value		 The monetary value itself

   The do_pos_format an do_neg_format member functions of moneypunct
   both return the pattern type.  See	the description	of these
   functions for further elaboration.

 INTERFACE

   class	money_base {
   public:
    enum	part { none, space, symbol, sign, value	};
    struct pattern { char field[4]; };
   };

   template <class charT, bool International = false>
   class	moneypunct : public locale::facet, public money_base {
   public:
    typedef charT char_type;
    typedef basic_string<charT> string_type;
    explicit moneypunct(size_t =	0);
    charT	decimal_point()	const;
    charT	thousands_sep()	const;
    string	grouping()	const;
    string_type	curr_symbol()	const;
    string_type	positive_sign()	const;
    string_type	negative_sign()	const;
    int		frac_digits()	const;
    pattern	pos_format()	const;
    pattern	neg_format()	const;
    static locale::id id;
    static const	bool intl = International;
   protected:
     ~moneypunct();  // virtual
    virtual charT	do_decimal_point() const;
    virtual charT	do_thousands_sep() const;
    virtual string	do_grouping()	   const;
    virtual string_type	do_curr_symbol()   const;
    virtual string_type	do_positive_sign() const;
    virtual string_type	do_negative_sign() const;
    virtual int		do_frac_digits()   const;
    virtual pattern	do_pos_format()	   const;
    virtual pattern	do_neg_format()	   const;
   };

   template <class charT, bool Intl = false>
   class	moneypunct_byname : public moneypunct<charT, Intl> {
   public:
    explicit moneypunct_byname(const char*, size_t = 0);
   protected:
     ~moneypunct_byname();  // virtual
    virtual charT	do_decimal_point() const;
    virtual charT	do_thousands_sep() const;
    virtual string	do_grouping()	   const;
    virtual string_type	do_curr_symbol()   const;
    virtual string_type	do_positive_sign() const;
    virtual string_type	do_negative_sign() const;
    virtual int		do_frac_digits()   const;
    virtual pattern	do_pos_format()	   const;
    virtual pattern	do_neg_format()	   const;
   };

 TYPES

   char_type
      Type of character the facet is instantiated on.

   string_type
      Type of character string returned by member functions.

 CONSTRUCTORS AND DESTRUCTORS

   explicit moneypunct(size_t refs = 0)
      Constructs	a moneypunct facet.  If	the refs argument is 0 then
      destruction of the object	is delegated to	the locale, or
      locales,	containing it. This allows the user to ignore
      lifetime management issues.  On	the other had,	if refs	 is 1
      then the object must be explicitly deleted; the locale will not
      do	so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   explicit moneypunct_byname(const char* name, size_t refs = 0);
      Constructs	a moneypunct_byname facet.  Uses the named locale
      specified by	the name argument.  The	refs argument serves
      the same purpose as it does for the moneypunct constructor.

   ~moneypunct();  // virtual and protected
      Destroy the facet

 STATIC MEMBERS

   static locale::id id;

      Unique identifier for this	type of	facet.

   static const bool intl = Intl;

      true if international representation, false otherwise.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the moneypunct	and moneypunct_byname facets
   provide an interface to protected members.  Each public member xxx
   has a corresponding	virtual	protected member do_xxx.  All work is
   delagated	to these	protected members.   For instance, the
   long version of the public decimal_point	function simply	calls
   its protected cousin do_decimal_point.

   string_type  curr_symbol()   const;
   charT	       decimal_point() const;
   int	       frac_digits()   const;
   string       grouping()      const;
   pattern      neg_format()    const;
   string_type  negative_sign() const;
   pattern      pos_format()    const;
   string_type  positive_sign() const;
   charT	       thousands_sep() const;
      Each of these public member functions xxx simply calls the
      corresponding protected do_xxx function.

 PROTECTED MEMBER FUNCTIONS

   virtual string_type
   do_curr_symbol()   const;
      Returns a string to use as	the currency symbol.

   virtual charT
   do_decimal_point() const;
      Returns the radix separator to use	if fractional digits are
      allowed (see do_frac_digits).

   virtual int
   do_frac_digits()   const;
      Returns the number	of digits in the fractional part of the
      monetary representation.

   virtual string
   do_grouping()	     const;
      Returns a string in which each character is used as an integer
      value to represent the number of digits in a particular grouping,
      starting with the rightmost group.  A group is simply the digits
      between	adjacent thousands'	separators.  Each group	at a
      position larger than the size of the string	gets the same
      value as the last	element	in the string.	If a value is less
      than	or equal to zero, or equal to CHAR_MAX,	then the size
      of	that group is unlimited.   moneypunct  returns an empty
      string,	indicating no grouping.

   virtual string_type
   do_negative_sign() const;
      A string to use as	the negative sign.  The	first character	of
      this string will be placed in the position indicated by	the
      format pattern (see do_neg_format); the rest of the characters,
      if any, will be placed after all other parts of the monetary
      value.

   virtual pattern
   do_neg_format()    const;
   virtual pattern
   do_pos_format()    const;
      Returns a pattern object specifying the location of the various
      syntactic elements in a monetary	representation.	 The
      enumeration values	symbol, sign,	and value will appear exactly
      once in this pattern, with the remaining location	taken by
      either	none or	space.	none will never occupy the	first
      position in the pattern and space	will never occupy the first or
      the last position.  Beyond these restrictions, elements may
      appear in any order.  moneypunct returns {symbol, sign, none,
      value}.

   virtual string_type
   do_positive_sign() const;
      A string to use as	the positive sign.  The	first character	of
      this string will be placed in the position indicated by	the
      format pattern (see do_pos_format); the rest of the characters,
      if any, will be placed after all other parts of the monetary
      value.

   virtual charT
   do_thousands_sep() const;
      Reurns the	grouping seperator if grouping is allowed (see
      do_grouping).

 EXAMPLE

   //
   // moneypun.cpp
   //

   #include <string>

   #include <iostream>

   int main ()
   {
    using namespace std;

    locale loc;

     // Get a moneypunct	facet
    const moneypunct<char,false>& mp =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
    use_facet<moneypunct<char,false> >(loc);
   #else
    use_facet(loc,(moneypunct<char,false>*)0);
   #endif

    cout	<< "Decimal point	 = "
 	 << mp.decimal_point() << endl;
    cout	<< "Thousands seperator	 = "
 	 << mp.thousands_sep() << endl;
    cout	<< "Currency symbol	 = "
 	 << mp.curr_symbol() <<	endl;
    cout	<< "Negative Sign	 = "
 	 << mp.negative_sign() << endl;
    cout	<< "Digits after decimal = "
 	 << mp.frac_digits() <<	endl;

    return 0;
   }

 SEE ALSO

   locale, facets, money_put, money_get

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  22 - moneypunct_byname

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   moneypunct, moneypunct_byname	- Monetary punctuation facets.

 SYNOPSIS

   #include <locale>
   class	money_base;

   template <class charT, bool International = false>
   class	moneypunct;

 DESCRIPTION

   The moneypunct facets	provide	formatting specifications and
   punctuation character for	monetary values. The moneypunct	facet
   provides punctuation based	on the "C" locale, while the
   moneypunct_byname facet provides the same facilities for named
   locales.

   The facet is used by money_put for outputting	formatted
   representations of monetary values and by money_get for reading
   these strings back in.

   money_base provides a	structure, pattern, that specifies the order
   of	syntactic elements in a monetary	value and enumeration
   values representing those	elements.  The pattern struct provides
   a simple	array of characters, field.  Each index in	field
   is taken up by an	enumeration value indicating the location of a
   syntactic element.	The enumeration	values are described below:

   Format Flag	 Meaning

   none		 No grouping seperator
   space		 Use space for grouping	seperator
   symbol	 Currency symbol
   sign		 Sign of monetary value
   value		 The monetary value itself

   The do_pos_format an do_neg_format member functions of moneypunct
   both return the pattern type.  See	the description	of these
   functions for further elaboration.

 INTERFACE

   class	money_base {
   public:
    enum	part { none, space, symbol, sign, value	};
    struct pattern { char field[4]; };
   };

   template <class charT, bool International = false>
   class	moneypunct : public locale::facet, public money_base {
   public:
    typedef charT char_type;
    typedef basic_string<charT> string_type;
    explicit moneypunct(size_t =	0);
    charT	decimal_point()	const;
    charT	thousands_sep()	const;
    string	grouping()	const;
    string_type	curr_symbol()	const;
    string_type	positive_sign()	const;
    string_type	negative_sign()	const;
    int		frac_digits()	const;
    pattern	pos_format()	const;
    pattern	neg_format()	const;
    static locale::id id;
    static const	bool intl = International;
   protected:
     ~moneypunct();  // virtual
    virtual charT	do_decimal_point() const;
    virtual charT	do_thousands_sep() const;
    virtual string	do_grouping()	   const;
    virtual string_type	do_curr_symbol()   const;
    virtual string_type	do_positive_sign() const;
    virtual string_type	do_negative_sign() const;
    virtual int		do_frac_digits()   const;
    virtual pattern	do_pos_format()	   const;
    virtual pattern	do_neg_format()	   const;
   };

   template <class charT, bool Intl = false>
   class	moneypunct_byname : public moneypunct<charT, Intl> {
   public:
    explicit moneypunct_byname(const char*, size_t = 0);
   protected:
     ~moneypunct_byname();  // virtual
    virtual charT	do_decimal_point() const;
    virtual charT	do_thousands_sep() const;
    virtual string	do_grouping()	   const;
    virtual string_type	do_curr_symbol()   const;
    virtual string_type	do_positive_sign() const;
    virtual string_type	do_negative_sign() const;
    virtual int		do_frac_digits()   const;
    virtual pattern	do_pos_format()	   const;
    virtual pattern	do_neg_format()	   const;
   };

 TYPES

   char_type
      Type of character the facet is instantiated on.

   string_type
      Type of character string returned by member functions.

 CONSTRUCTORS AND DESTRUCTORS

   explicit moneypunct(size_t refs = 0)
      Constructs	a moneypunct facet.  If	the refs argument is 0 then
      destruction of the object	is delegated to	the locale, or
      locales,	containing it. This allows the user to ignore
      lifetime management issues.  On	the other hand,	if refs	 is 1
      then the object must be explicitly deleted; the locale will not
      do	so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   explicit moneypunct_byname(const char* name, size_t refs = 0);
      Constructs	a moneypunct_byname facet.  Uses the named locale
      specified by	the name argument.  The	refs argument serves
      the same purpose as it does for the moneypunct constructor.

   ~moneypunct();  // virtual and protected

      Destroy the facet

 STATIC MEMBERS

   static locale::id id;

      Unique identifier for this	type of	facet.

   static const bool intl = Intl;

      true if international representation, false otherwise.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the moneypunct	and moneypunct_byname facets
   provide an interface to protected members.  Each public member xxx
   has a corresponding	virtual	protected member do_xxx.  All work is
   delagated	to these	protected members.   For instance, the
   long version of the public decimal_point	function simply	calls
   its protected cousin do_decimal_point.

   string_type  curr_symbol()   const;
   charT	       decimal_point() const;
   int	       frac_digits()   const;
   string       grouping()      const;
   pattern      neg_format()    const;
   string_type  negative_sign() const;
   pattern      pos_format()    const;
   string_type  positive_sign() const;
   charT	       thousands_sep() const;
      Each of these public member functions xxx simply calls the
      corresponding protected do_xxx function.

 PROTECTED MEMBER FUNCTIONS

   virtual string_type
   do_curr_symbol()   const;
      Returns a string to use as	the currency symbol.

   virtual charT
   do_decimal_point() const;
      Returns the radix separator to use	if fractional digits are
      allowed (see do_frac_digits).

   virtual int
   do_frac_digits()   const;
      Returns the number	of digits in the fractional part of the
      monetary representation.

   virtual string
   do_grouping()	     const;
      Returns a string in which each character is used as an integer
      value to represent the number of digits in a particular grouping,
      starting with the rightmost group.  A group is simply the digits
      between	adjacent thousands'	separators.  Each group	at a
      position larger than the size of the string	gets the same
      value as the last	element	in the string.	If a value is less
      than	or equal to zero, or equal to CHAR_MAX,	then the size
      of	that group is unlimited.   moneypunct  returns an empty
      string,	indicating no grouping.

   virtual string_type
   do_negative_sign() const;
      A string to use as	the negative sign.  The	first character	of
      this string will be placed in the position indicated by	the
      format pattern (see do_neg_format); the rest of the characters,
      if any, will be placed after all other parts of the monetary
      value.

   virtual pattern
   do_neg_format()    const;
   virtual pattern
   do_pos_format()    const;
      Returns a pattern object specifying the location of the various
      syntactic elements in a monetary	representation.	 The
      enumeration values	symbol, sign,	and value will appear exactly
      once in this pattern, with the remaining location	taken by
      either	none or	space.	none will never occupy the	first
      position in the pattern and space	will never occupy the first or
      the last position.  Beyond these restrictions, elements may
      appear in any order.  moneypunct returns {symbol, sign, none,
      value}.

   virtual string_type
   do_positive_sign() const;
      A string to use as	the positive sign.  The	first character	of
      this string will be placed in the position indicated by	the
      format pattern (see do_pos_format); the rest of the characters,
      if any, will be placed after all other parts of the monetary
      value.

   virtual charT
   do_thousands_sep() const;
      Reurns the	grouping seperator if grouping is allowed (see
      do_grouping).

 EXAMPLE

   //
   // moneypun.cpp
   //

   #include <string>

   #include <iostream>

   int main ()
   {
    using namespace std;

    locale loc;

     // Get a moneypunct	facet
    const moneypunct<char,false>& mp =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
    use_facet<moneypunct<char,false> >(loc);
   #else
    use_facet(loc,(moneypunct<char,false>*)0);
   #endif

    cout	<< "Decimal point	 = "
 	 << mp.decimal_point() << endl;
    cout	<< "Thousands seperator	 = "
 	 << mp.thousands_sep() << endl;
    cout	<< "Currency symbol	 = "
 	 << mp.curr_symbol() <<	endl;
    cout	<< "Negative Sign	 = "
 	 << mp.negative_sign() << endl;
    cout	<< "Digits after decimal = "
 	 << mp.frac_digits() <<	endl;

    return 0;
   }

 SEE ALSO

   locale, facets, money_put, money_get

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  23 - money_get

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   money_get - Monetary formatting facet	for input.

 SYNOPSIS

   #include <locale>
   template <class charT, bool Intl = false,
 	   class InputIterator = istreambuf_iterator<charT> >
   class	money_get;

 DESCRIPTION

   The money_get	facet interprets formatted monetary string values.
   The	Intl template pa,rameter is used to specify locale	or
   international formatting. If Intl is true then international
   formatting	is used, otherwise locale formatting is	used.

 INTERFACE

   template <class charT, bool Intl = false,
 	   class InputIterator = istreambuf_iterator<charT> >
   class	money_get : public locale::facet {
   public:
    typedef charT	       char_type;
    typedef InputIterator       iter_type;
    typedef basic_string<charT> string_type;
    explicit money_get(size_t = 0);
    iter_type get(iter_type, iter_type, ios_base&,
 		 ios_base::iostate&, long double&) const;
    iter_type get(iter_type, iter_type, ios_base&,
 		 ios_base::iostate&, string_type&) const;
    static const	bool intl = Intl;
    static locale::id id;
   protected:
     ~money_get();  // virtual
    virtual iter_type do_get(iter_type, iter_type, ios_base&,
 			    ios_base::iostate&,
 			    long double&) const;
    virtual iter_type do_get(iter_type, iter_type, ios_base&,
 			    ios_base::iostate&,
 			    string_type&) const;
   };

 TYPES

   char_type
      Type of character upon which the facet is instantiated.

   iter_type
      Type of iterator used to scan the character buffer.

   string_type
      Type of character string passed to	member functions.

 CONSTRUCTORS AND DESTRUCTORS

   explicit money_get(size_t refs = 0)
      Construct a money_get facet.  If the refs argument	is 0 then
      destruction of	the object is delegated	to the locale, or
      locales, containing it. This allows the user to ignore lifetime
      management	issues.	 On the	other had, if refs  is 1	then
      the object	must be	explicitly deleted; the locale will not do
      so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   ~money_get();	 // virtual and	protected
      Destroy the facet

   <REFSECT1> <ANCHOR>

 STATIC MEMBERS

   static locale::id id;
      Unique identifier for this	type of	facet.

   static const bool intl = Intl;
      true if international formatting is used, false otherwise.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the money_get facet provide an interface to
   protected members.  Each public	member get has a corresponding
   virtual protected member do_get.

   iter_type
   get(iter_type	s, iter_type end, ios_base& f,
      ios_base::iostate&	err, long double& units) const;
   iter_type
   get(iter_type	s, iter_type end, ios_base& f,
      ios_base::iostate&	err, string_type& digits) const;
      Each of these two overloads of the	public member function get calls the
      corresponding protected do_get function.

 PROTECTED MEMBER FUNCTIONS

   virtual iter_type
   do_get(iter_type s, iter_type	end,
 	ios_base& f,
 	ios_base::iostate& err,
 	long double& units) const;
   virtual iter_type
   do_get(iter_type s, iter_type	end,
 	ios_base& f,
 	ios_base::iostate& err,
 	string_type& digits) const;
      Reads in a	localized character representation of a	monetary value
      and generates a generic representation, either	as a seqeuence
      of digits or as	a long double value.   In either case do_get
      uses the smallest possible unit of currency.

      Both overloads of do_get read characters from the range [s,end)
      until one of three things occurs:

      +	     A monetary	value is assembled

      +	     An	error occurs

      +	     No	more characters	are available.

      The functions use f.flags() and the moneypunct<charT> facet from
      f.getloc()	for formatting information to use in intrepreting the
      sequence of characters. do_get then places	a pure sequence	of
      digits representing the monetary value in	the smallest possible
      unit of currency into the string argument digits, or it
      calculates	a long double value based on those digits and returns
      that value	in units.

      The following specifics apply to formatting:

      +	     Digit group seperators are	optional.  If no grouping is
           specified then in thousands seperator characters are treated
           as delimiters.

      +	     If	space or none are part of the format pattern in
           moneypunct then optional whitespace is consumed, except at
           the end. See the moneypunct reference section for a description
           of money specific formatting flags.

      +	     If	iosbase::showbase is set in f.flags() then the currency
           symbol is optional, and if it appears after all other elements
           then it will not be consumed.	 Otherwise the currency	symbol
           is required, and will be consumed where ever it occurs.

      +	     digits will be preceded by	a '-' ,	or units will be negated,
           if the monetary value is	negative.

      +	     See the moneypunct	reference section for a	description of
           money specific formatting flags.

      The err argument will be set to iosbase::failbit if an error
      occurs during parsing.

      Returns an	iterator pointing one past the last character that is
      part of a valid monetary sequence.

 EXAMPLE

   //
   // moneyget.cpp
   //

   #include <string>
   #include <sstream>

   int main ()
   {
    using namespace std;
    typedef istreambuf_iterator<char,char_traits<char> >	iter_type;

    locale loc;
    string buffer("$100.02");
    string dest;
    long	double ldest;
    ios_base::iostate state;
    iter_type end;

     // Get a money_get facet
    const money_get<char,false,iter_type>& mgf =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
      use_facet<money_get<char,false,iter_type> >(loc);
   #else
      use_facet(loc,(money_get<char,false,iter_type>*)0);
   #endif

     {
       // Build an istringstream	from the buffer	and construct
       // a beginning iterator on it.
      istringstream ins(buffer);
      iter_type begin(ins);

       // Get a a string	representation of the monetary value
      mgf.get(begin,end,ins,state,dest);
     }
     {
       // Build another istringstream from the buffer, etc.
       // so we have an iterator	pointing to the	beginning
      istringstream ins(buffer);
      iter_type begin(ins);

       // Get a a long double representation
       // of the	monetary value
      mgf.get(begin,end,ins,state,ldest);
     }
    cout	<< buffer << " --> " <<	dest
 	 << " --> " << ldest <<	endl;

    return 0;
   }

 SEE ALSO

   locale, facets,money_put, moneypunct

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  24 - money_put

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   money_put - Monetary formatting facet	for output.

 SYNOPSIS

   #include <locale>
   template <class charT, bool Intl = false,
 	   class OutputIterator	= ostreambuf_iterator<charT> >
   class	money_put;

 DESCRIPTION

   The money_put	facet takes a long double value, or generic sequence
   of digits and writes out	a formatted representation of the
   monetary value.

 INTERFACE

   template <class charT, bool Intl = false,
 	   class OutputIterator	= ostreambuf_iterator<charT> >
   class	money_put : public locale::facet {
   public:
    typedef charT	       char_type;
    typedef OutputIterator      iter_type;
    typedef basic_string<charT> string_type;
    explicit money_put(size_t = 0);
    iter_type put(iter_type, ios_base&, char_type,
 		 long double) const;
    iter_type put(iter_type, ios_base&, char_type,
 		 const string_type&) const;
    static const	bool intl = Intl;
    static locale::id id;
   protected:
     ~money_put();  // virtual
    virtual iter_type  do_put(iter_type,	ios_base&, char_type,
 			     long double) const;
    virtual iter_type do_put(iter_type, ios_base&, char_type,
 			    const string_type&)	const;
   };

 TYPES

   char_type
      Type of the character upon	which the facet	is instantiated.

   iter_type
      Type of iterator used to scan the character buffer.

   string_type
      Type of character string passed to	member functions.

 CONSTRUCTORS AND DESTRUCTORS

   explicit money_put(size_t refs = 0)
      Construct a  money_put facet.  If the refs argument	is 0
      then destruction of	the object is delegated	to the locale,
      or locales, containing it. This allows the user to ignore
      lifetime management	issues.	 On the	other had, if refs  is
      1	then the object	must be	explicitly deleted; the locale will
      not do	so.  In	this case, the object can be maintained across
      the	lifetime of multiple locales.

   ~money_put();	 // virtual and	protected
      Destroy the facet

 STATIC MEMBERS

   static locale::id id;
      Unique identifier for this	type of	facet.

   static const bool intl = Intl;
      true if international representation, false otherwise.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the money_put facet provide an interface to
   protected members.  Each public	member put has a corresponding
   virtual protected member do_put.

   iter_type
   put(iter_type	s, ios_base& f,	char_type fill,
      long double units)	const;
   iter_type
   put(iter_type	s, ios_base& f,	char_type fill,
      const string_type&	digits)	const;

      Each of these two overloads of the	public member function put
      simply calls the corresponding protected do_put function.

 PROTECTED MEMBER FUNCTIONS

   virtual iter_type
   do_put(iter_type s, ios_base&	f, char_type fill,
 	long double units) const;

      Writes out	a character string representation of the monetary
      value	contained in units.  Since units represents the
      monetary value in the	smallest possible unit	of
      currency any	fractional portions of the value are ignored.
      f.flags() and the moneypunct<charT> facet from f.getloc() provide
      the formatting information.

      The fill argument is used for any padding.

      Returns an	iterator pointing one past the last character written.

   virtual iter_type
   do_put(iter_type s, ios_base&	f, char_type fill,
 	const string_type& digits) const;
      Writes out	a character string representation of the monetary
      contained in	digits.	 digits	represents the monetary	value
      as a sequence of digits in	the smallest possible unit of
      currency.	 do_put	only looks at an optional -	character and
      any immediatly contigous digits.	f.flags() and the
      moneypunct<charT> facet from f.getloc() provide the formatting
      information.

      The fill argument is used for any padding.

      Returns an	iterator pointing one past the last character written.

 EXAMPLE

   //
   // moneyput.cpp
   //

   #include <string>
   #include <iostream>

   int main ()
   {
    using namespace std;

    typedef ostreambuf_iterator<char,char_traits<char> >	iter_type;

    locale loc;
    string buffer("10002");
    long	double ldval = 10002;

     // Construct a ostreambuf_iterator on cout
    iter_type begin(cout);

     // Get a money put facet
    const money_put<char,false,iter_type>& mp =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
    use_facet<money_put<char,false,iter_type> >(loc);
   #else
    use_facet(loc,(money_put<char,false,iter_type>*)0);
   #endif

     // Put out the string representation of the	monetary value
    cout	<< buffer << " --> ";
    mp.put(begin,cout,' ',buffer);

     // Put out the long	double representation
     // of the monetary value
    cout	<< endl	<< ldval << " --> ";
    mp.put(begin,cout,' ',ldval);

    cout	<<  endl;

    return 0;
   }

 SEE ALSO

   locale, facets, money_get, moneypunct

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  25 - numpunct

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   numpunct, numpunct_byname - Numeric punctuation facet.

 SYNOPSIS

   #include <locale>
   template <class charT>  class	numpunct;
   template <class charT>  class	numpunct_byname;

 DESCRIPTION

   The numpunct<charT> facet specifies numeric punctuation.  This
   template provides punctuation based on	the "C"	locale,	while
   the numpunct_byname facet	provides the same facilities for named
   locales.

   Both num_put and num_get make	use of this facet.

 INTERFACE

   template <class charT>
   class	numpunct : public locale::facet	{
   public:
    typedef charT	       char_type;
    typedef basic_string<charT> string_type;
    explicit numpunct(size_t refs = 0);
    char_type	decimal_point()	  const;
    char_type	thousands_sep()	  const;
    string	grouping()	  const;
    string_type	truename()	  const;
    string_type	falsename()	  const;
    static locale::id id;
   protected:
     ~numpunct();  // virtual
    virtual char_type	do_decimal_point() const;
    virtual char_type	do_thousands_sep() const;
    virtual string	do_grouping()	   const;
    virtual string_type	do_truename()	   const;  // for bool
    virtual string_type	do_falsename()	   const;  // for bool
   };

   template <class charT>
   class	numpunct_byname	: public numpunct<charT> {
   public:
    explicit numpunct_byname(const char*, size_t	refs = 0);
   protected:
     ~numpunct_byname();	 // virtual
    virtual char_type	do_decimal_point() const;
    virtual char_type	do_thousands_sep() const;
    virtual string	do_grouping()	   const;
    virtual string_type	do_truename()	   const;  // for bool
    virtual string_type	do_falsename()	   const;  // for bool
   };

 TYPES

   char_type
      Type of character upon which the facet is instantiated.

   string_type

      Type of character string returned by member functions.

 CONSTRUCTORS AND DESTRUCTORS

   explicit numpunct(size_t refs	= 0)
      Construct a numpunct facet.  If the refs argument is 0 then
      destruction of	the object is delegated	to the locale, or
      locales, containing it. This allows the user to ignore lifetime
      management	issues.	 On the	other had, if refs  is 1	then
      the object	must be	explicitly deleted; the locale will not do
      so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   explicit numpunct_byname(const char* name, size_t refs = 0);
      Construct a numpunct_byname facet.	 Use the named locale
      specified	by the name argument.	 The refs argument serves the
      same purpose as it does for the numpunct constructor.

   ~numpunct();	// virtual and protected
   ~numpunct_byname();  // virtual and protected

      Destroy the facet

 FACET ID

   static locale::id id;

      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the numpunct facet provide an interface	to
   protected members.  Each public	member xxx has a corresponding
   virtual protected member do_xxx.  All work is delagated	to
   these protected members.   For instance, the	long version of	the
   public grouping function simply calls its protected cousin
   do_grouping.

   char_type    decimal_point()	 const;
   string_type  falsename()	 const;
   string       grouping()	 const;
   char_type    thousands_sep()	 const;
   string_type  truename()	 const;

      Each of these public member functions xxx simply call the
      corresponding protected do_xxx function.

 PROTECTED MEMBER FUNCTIONS

   virtual char_type
   do_decimal_point() const;

      Returns the decimal radix separator .  numpunct returns '.'.

   virtual string_type
   do_falsename()     const;  //	for bool
   virtual string_type
   do_truename()	     const;  //	for bool

      Returns a string representing the name of the boolean values true
      and false respectively.  numpunct returns  "true" and
      "false".

   virtual string
   do_grouping()	     const;

      Returns a string in which each character is used as an integer
      value to represent the number of digits in a particular grouping,
      starting with the rightmost group.  A group is simply the digits
      between	adjacent thousands separators.  Each group at a
      position larger than the size of the string	gets the same
      value as the last	element	in the string.	If a value is less
      than	or equal to zero, or equal to CHAR_MAX then the	size
      of	that group is unlimited.  numpunct returns an empty string,
      indicating no grouping.

   virtual char_type
   do_thousands_sep() const;

      Returns the decimal digit group seperator.	 numpunct returns ','.

 EXAMPLE

   //
   // numpunct.cpp
   //

   #include <iostream>

   int main ()
   {
    using namespace std;
    locale loc;

     // Get a numpunct facet
    const numpunct<char>& np =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
    use_facet<numpunct<char> >(loc);
   #else
    use_facet(loc,(numpunct<char>*)0);
   #endif

    cout	<< "Decimal point	= "
 	 << np.decimal_point() << endl;
    cout	<< "Thousands seperator	= "
 	 << np.thousands_sep() << endl;
    cout	<< "True name		= "
 	 << np.truename() << endl;
    cout	<< "False name		= "
 	 << np.falsename() << endl;

    return 0;
   }

 SEE ALSO

   locale, facets, num_put, num_get, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  26 - numpunct_byname

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   numpunct, numpunct_byname - Numeric punctuation facet.

 SYNOPSIS

   #include <locale>
   template <class charT>  class	numpunct;
   template <class charT>  class	numpunct_byname;

 DESCRIPTION

   The numpunct<charT> facet specifies numeric punctuation.  This template
   provides punctuation based on	the "C"	locale,	while the numpunct_byname
   facet	provides the same facilities for named locales.

   Both num_put and num_get make	use of this facet.

 INTERFACE

   template <class charT>
   class	numpunct : public locale::facet	{
   public:
    typedef charT	       char_type;
    typedef basic_string<charT> string_type;
    explicit numpunct(size_t refs = 0);
    char_type	decimal_point()	  const;
    char_type	thousands_sep()	  const;
    string	grouping()	  const;
    string_type	truename()	  const;
    string_type	falsename()	  const;
    static locale::id id;
   protected:
     ~numpunct();  // virtual
    virtual char_type	do_decimal_point() const;
    virtual char_type	do_thousands_sep() const;
    virtual string	do_grouping()	   const;
    virtual string_type	do_truename()	   const;  // for bool
    virtual string_type	do_falsename()	   const;  // for bool
   };

   template <class charT>
   class	numpunct_byname	: public numpunct<charT> {
   public:
    explicit numpunct_byname(const char*, size_t	refs = 0);
   protected:
     ~numpunct_byname();	 // virtual
    virtual char_type	do_decimal_point() const;
    virtual char_type	do_thousands_sep() const;
    virtual string	do_grouping()	   const;
    virtual string_type	do_truename()	   const;  // for bool
    virtual string_type	do_falsename()	   const;  // for bool
   };

 TYPES

   char_type
      Type of character upon which the facet is instantiated.

   string_type

      Type of character string returned by member functions.

 CONSTRUCTORS AND DESTRUCTORS

   explicit numpunct(size_t refs	= 0)
      Construct a numpunct facet.  If the refs argument is 0 then
      destruction of	the object is delegated	to the locale, or
      locales, containing it. This allows the user to ignore lifetime
      management	issues.	 On the	other had, if refs  is 1	then
      the object	must be	explicitly deleted; the locale will not do
      so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   explicit numpunct_byname(const char* name, size_t refs = 0);
      Construct a numpunct_byname facet.	 Use the named locale
      specified	by the name argument.	 The refs argument serves the
      same purpose as it does for the numpunct constructor.

   ~numpunct();	// virtual and protected
   ~numpunct_byname();  // virtual and protected
      Destroy the facet

 FACET ID

   static locale::id id;

      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the numpunct facet provide an interface	to
   protected members.  Each public	member xxx has a corresponding
   virtual protected member do_xxx.  All work is delagated	to
   these protected members.   For instance, the	long version of	the
   public grouping function simply calls its protected cousin
   do_grouping.

   char_type    decimal_point()	 const;
   string_type  falsename()	 const;
   string       grouping()	 const;
   char_type    thousands_sep()	 const;
   string_type  truename()	 const;

   Each of these public member functions xxx simply call the
   corresponding protected do_xxx function.

 PROTECTED MEMBER FUNCTIONS

   virtual char_type
   do_decimal_point() const;

      Returns the decimal radix separator .  numpunct returns '.'.

   virtual string_type
   do_falsename()     const;  //	for bool
   virtual string_type
   do_truename()	     const;  //	for bool

      Returns a string representing the name of the boolean values true
      and false respectively.  numpunct returns  "true" and
      "false".

   virtual string
   do_grouping()	     const;

      Returns a string in which each character is used as an integer
      value to represent the number of digits in a particular grouping,
      starting with the rightmost group.  A group is simply the digits
      between	adjacent thousands separators.  Each group at a
      position larger than the size of the string	gets the same
      value as the last	element	in the string.	If a value is less
      than	or equal to zero, or equal to CHAR_MAX then the	size
      of	that group is unlimited.  numpunct returns an empty string,
      indicating no grouping.

   virtual char_type
   do_thousands_sep() const;

      Returns the decimal digit group seperator.	 numpunct returns ','.

 EXAMPLE

   //
   // numpunct.cpp
   //

   #include <iostream>

   int main ()
   {
    using namespace std;
    locale loc;

     // Get a numpunct facet
    const numpunct<char>& np =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
    use_facet<numpunct<char> >(loc);
   #else
    use_facet(loc,(numpunct<char>*)0);
   #endif

    cout	<< "Decimal point	= "
 	 << np.decimal_point() << endl;
    cout	<< "Thousands seperator	= "
 	 << np.thousands_sep() << endl;
    cout	<< "True name		= "
 	 << np.truename() << endl;
    cout	<< "False name		= "
 	 << np.falsename() << endl;

    return 0;
   }

 SEE ALSO

   locale, facets, num_put, num_get, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  27 - num_get

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   num_get - Numeric formatting facet for input.

 SYNOPSIS

   #include <locale>
   template <class charT, class InputIterator > class num_get;

 DESCRIPTION

   The num_get provides facilities for formatted	input of numbers.
   basic_istream	and all	other input-oriented streams use this facet to imple-
   ment formatted numeric input.

 INTERFACE

   template <class charT, class InputIterator = istreambuf_iterator<charT> >
   class	num_get	: public locale::facet {
   public:
    typedef charT	    char_type;
    typedef InputIterator    iter_type;
    explicit num_get(size_t refs	= 0);
    iter_type get(iter_type, iter_type, ios_base&,
 		 ios_base::iostate&, bool&)	     const;
    iter_type get(iter_type, iter_type, ios_base& ,
 		 ios_base::iostate&, long&)	     const;
    iter_type get(iter_type, iter_type, ios_base&,
 		 ios_base::iostate&, unsigned short&) const;
    iter_type get(iter_type, iter_type, ios_base&,
 		 ios_base::iostate&, unsigned int&)  const;
    iter_type get(iter_type, iter_type, ios_base&,
 		 ios_base::iostate&, unsigned long&) const;
    iter_type get(iter_type, iter_type, ios_base&,
 		 ios_base::iostate&, float&)	     const;
    iter_type get(iter_type, iter_type, ios_base&,
 		 ios_base::iostate&, double&)	     const;
    iter_type get(iter_type, iter_type, ios_base&,
 		 ios_base::iostate&, long double&)   const;
    static locale::id id;

   protected:
     ~num_get();	 // virtual
    virtual iter_type do_get(iter_type, iter_type, ios_base&,
 			    ios_base::iostate&,	bool&) const;
    virtual iter_type do_get(iter_type, iter_type, ios_base&,
 			    ios_base::iostate&,	long&) const;
    virtual iter_type do_get(iter_type, iter_type, ios_base&,
 			    ios_base::iostate&,
 			    unsigned short&) const;
    virtual iter_type do_get(iter_type, iter_type, ios_base&,
 			    ios_base::iostate&,
 			    unsigned int&) const;
    virtual iter_type do_get(iter_type, iter_type, ios_base&,
 			    ios_base::iostate&,
 			    unsigned long&) const;
    virtual iter_type do_get(iter_type, iter_type, ios_base&,
 			    ios_base::iostate&,	float&)	const;
    virtual iter_type do_get(iter_type, iter_type, ios_base&,
 			    ios_base::iostate&,	double&) const;
    virtual iter_type do_get(iter_type, iter_type, ios_base&,
 			    ios_base::iostate&,
 			    long double&) const;
   };

 TYPES

   char_type
      Type of character the facet is instantiated on.

   iter_type
      Type of iterator used to scan the character buffer.

 CONSTRUCTOR AND	DESTRUCTOR

   explicit num_get(size_t refs = 0)
      Construct a num_get facet.	 If the	refs argument is 0 then
      destruction of	the object is delegated	to the locale, or
      locales, containing it. This allows the user to ignore lifetime
      management	issues.	 On the	other had, if refs  is 1	then
      the object	must be	explicitly deleted; the locale will not do
      so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   ~num_get();  // virtual and protected
      Destroy the facet

 FACET ID

   static locale::id id;
      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the num_get facet provide an interface to
   protected members.  Each public	member xxx has a corresponding
   virtual protected member do_xxx.  All work is delagated	to
   these protected members.  For instance, the	long version of	the
   public get function	simply calls its protected cousin
   do_get.

   iter_type
   get(iter_type	in, iter_type end, ios_base& io,
      ios_base::iostate&	err, bool& v)	       const;
   iter_type
   get(iter_type	in, iter_type end, ios_base& io,
      ios_base::iostate&	err, long& v)	       const;
   iter_type
   get(iter_type	in, iter_type end, ios_base& io,
      ios_base::iostate&	err, unsigned short& v)	const;
   iter_type
   get(iter_type	in, iter_type end, ios_base& io,
      ios_base::iostate&	err, unsigned int& v)  const;
   iter_type
   get(iter_type	in, iter_type end, ios_base& io,
      ios_base::iostate&	err, unsigned long& v) const;
   iter_type
   get(iter_type	in, iter_type end, ios_base& io,
      ios_base::iostate&	err, float& v)	       const;
   iter_type
   get(iter_type	in, iter_type end, ios_base& io,
      ios_base::iostate&	err, double& v)	       const;
   iter_type
   get(iter_type	in, iter_type end, ios_base& io,
      ios_base::iostate&	err, long double& v)   const;
      Each of the eight overloads of the	get function simply call the
      corresponding do_get function.

 PROTECTED MEMBER FUNCTIONS

   virtual iter_type
   do_get(iter_type in, iter_type end, ios_base&	io,
 	ios_base::iostate& err,	bool& v) const;
   virtual iter_type
   do_get(iter_type in, iter_type end, ios_base&	io,
 	ios_base::iostate& err,	long& v) const;
   virtual iter_type
   do_get(iter_type in, iter_type end, ios_base&	io,
 	ios_base::iostate& err,
 	unsigned short&	v) const;
   virtual iter_type
   do_get(iter_type in, iter_type end, ios_base&	io,
 	ios_base::iostate& err,
 	unsigned int& v) const;
   virtual iter_type
   do_get(iter_type in, iter_type end, ios_base&	io,
 	ios_base::iostate& err,
 	unsigned long& v) const;
   virtual iter_type
   do_get(iter_type in, iter_type end, ios_base&	io,
 	ios_base::iostate& err,	float& v) const;
   virtual iter_type
   do_get(iter_type in, iter_type end, ios_base&	io,
 	ios_base::iostate& err,	double&	v) const;
   virtual iter_type
   do_get(iter_type in, iter_type end, ios_base&	io,
 	ios_base::iostate& long	double&	v) const;

      The eight overloads of the	do_get member function all take	a
      sequence of characters	[int,end), and extract a numeric
      value.	 The numeric value is returned in v.   The io argument
      is used to obtain	formatting information and the err argument
      is used to set error conditions in a calling stream.

 EXAMPLE

   //
   // numget.cpp
   //

   #include <sstream>

   int main ()
   {
    using namespace std;

   typedef istreambuf_iterator<char,char_traits<char> > iter_type;

    locale loc;
    ios_base::iostate state;
    bool	bval = false;
    long	lval = 0L;
    long	double ldval = 0.0;
    iter_type end;

     // Get a num_get facet
    const num_get<char,iter_type>& tg =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
    use_facet<num_get<char,iter_type> >(loc);
   #else
    use_facet(loc,(num_get<char,iter_type>*)0);
   #endif

     {
       // Build an istringstream	from the buffer	and construct
       // beginning and ending iterators	on it.
      istringstream ins("true");
      iter_type begin(ins);

       // Get a bool value
      tg.get(begin,end,ins,state,bval);
     }
    cout	<< bval	<< endl;
     {
       // Get a long value
      istringstream ins("2422235");
      iter_type begin(ins);
      tg.get(begin,end,ins,state,lval);
     }
    cout	<< lval	<< endl;
     {
       // Get a long double value
      istringstream ins("32324342.98908");
      iter_type begin(ins);
      tg.get(begin,end,ins,state,ldval);
     }
    cout	<< ldval << endl;
    return 0;
   }

 SEE ALSO

   locale, facets, num_put, numpunct, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  28 - num_put

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   num_put - Numeric formatting	facet for output.

 SYNOPSIS

   #include <locale>
   template <class charT, class OutputIterator> class num_put;

 DESCRIPTION

   The num_put<charT,OutputIterator> template provides facilities for
   formatted output of	numbers.  basic_ostream	and all	other input
   oriented streams use this facet to implement formatted
   numeric	output.

 INTERFACE

   template <class charT, class OutputIterator =
             ostreambuf_iterator<charT> >
   class	num_put	: public locale::facet {
   public:
    typedef charT	    char_type;
    typedef OutputIterator   iter_type;
    explicit num_put(size_t = 0);

    iter_type put(iter_type, ios_base&, char_type, bool)	const;
    iter_type put(iter_type, ios_base&, char_type, long)	const;
    iter_type put(iter_type, ios_base&, char_type,
 		 unsigned long)	const;
    iter_type put(iter_type, ios_base&, char_type,
 		 double) const;
    iter_type put(iter_type, ios_base&, char_type,
 		 long double) const;
    static locale::id id;

   protected:
     ~num_put();	 // virtual
    virtual iter_type do_put(iter_type, ios_base&, char_type,
 			    bool) const;
    virtual iter_type do_put(iter_type, ios_base&, char_type,
 			    long) const;
    virtual iter_type do_put(iter_type, ios_base&, char_type,
 			    unsigned long) const;
    virtual iter_type do_put(iter_type, ios_base&, char_type,
 			    double) const;
    virtual iter_type do_put(iter_type, ios_base&, char_type,
 			    long double) const;
   };

 TYPES

   char_type
      Type of character upon which the facet is instantiated.

   iter_type
      Type of iterator used to scan the character buffer.

 CONSTRUCTORS AND DESTRUCTORS

   explicit num_put(size_t refs = 0)
      Construct a num_put facet.	 If the	refs argument is 0 then
      destruction of	the object is delegated	to the locale, or
      locales, containing it. This allows the user to ignore lifetime
      management	issues.	 On the	other had, if refs  is 1	then
      the object	must be	explicitly deleted; the locale will not do
      so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   ~num_put();  // virtual and protected
      Destroy the facet

 FACET ID

   static locale::id id;
      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the num_put facet provide an interface to
   protected members.  Each public	member xxx has a corresponding
   virtual protected member do_xxx.  All work is delagated	to
   these protected members.   For instance, the	long version of	the
   public put function	simply calls its protected cousin
   do_put.

   iter_type
   put(iter_type	s, ios_base& io, char_type fill, bool v) const;
   iter_type
   put(iter_type	s, ios_base& io, char_type fill, long v) const;
   iter_type
   put(iter_type	s, ios_base& io, char_type fill,
      unsigned long v) const;
   iter_type
   put(iter_type	s, ios_base& io, char_type fill, double	v) const;
   iter_type
   put(iter_type	s, ios_base& io, char_type fill, long double v)	const;

      Each of the five overloads	of the put function simply call	the
      corresponding do_put function.

 PROTECTED MEMBER FUNCTIONS

   virtual iter_type
   do_put(iter_type s, ios_base&	io,
 	char_type fill,	bool v)	const;
   virtual iter_type
   do_put(iter_type s, ios_base&	io,
 	char_type fill,	long v)	const;
   virtual iter_type
   do_put(iter_type s, ios_base&	io,
 	char_type fill,unsigned	long) const;
   virtual iter_type
   do_put(iter_type s, ios_base&	io,
 	char_type fill,	double v) const;
   virtual iter_type
   do_put(iter_type s, ios_base&	io,
 	char_type fill,long double v) const;

      The five overloads	of the do_put member function all take a
      numeric value and output a	formatted character string
      representing	that value. The character string is output
      through the	s argument to the function. The io argument is
      used to	obtain formatting specifications, and the fill
      argument determines the character to use in padding.

 EXAMPLE

   //
   // numput.cpp
   //

   #include <iostream>

   int main ()
   {
    using namespace std;

    typedef ostreambuf_iterator<char,char_traits<char> >	iter_type;

    locale loc;
    bool	bval = true;
    long	lval = 422432L;
    unsigned long ulval = 12328889UL;
    double dval = 10933.8934;
    long	double ldval = 100028933.8934;

     // Construct a ostreambuf_iterator on cout
    iter_type begin(cout);

     // Get a num_put facet reference
    const num_put<char,iter_type>& np =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
    use_facet<num_put<char,iter_type> >(loc);
   #else
    use_facet(loc,(num_put<char,iter_type>*)0);
   #endif

     // Put out a bool
    cout	<< bval	<< " --> ";
    np.put(begin,cout,' ',bval);

     // Put out a long
    cout	<< endl	<< lval	<< " --> ";
    np.put(begin,cout,' ',lval);

     // Put out an unsigned long
    cout	<< endl	<< ulval << " --> ";
    np.put(begin,cout,' ',ulval);

     // Put out a double
    cout	<< endl	<< dval	<< " --> ";
    np.put(begin,cout,' ',dval);

     // Put out a long double
    cout	<< endl	<< ldval << " --> ";
    np.put(begin,cout,' ',ldval);

    cout	<<  endl;

    return 0;
   }

 SEE ALSO

   locale, facets, numget, numpunct, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  29 - time_get

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   time_get - Time formatting facet for input.

 SYNOPSIS

   #include <locale>
   class	time_base;
   template <class charT, class InputIterator =
 	   istreambuf_iterator<charT> >
   class	time_get;

 DESCRIPTION

   The time_get facet extracts time and date components from a
   character string and stores the	resulting values in a struct
   tm	argument.  The facet parses the string using a specific format
   as a guide.	   If the string does not fit the format, then the
   facet will indicate an error by setting the err argument in the
   public member functions to iosbase::failbit.  See member function
   descriptions for details.

   The time_base	class provides a set of	values for specifying the
   order	in which	the three parts	of a date appear.  The
   dateorder function returns one of these five	possible values:

   Order	       Meaning
   noorder      Date format has no set ordering
   dmy	       Date order is day, month, year
   mdy	       Date order is  month, day, year
   ymd	       Date order is  year, month, day
   ydm	       Date order is year, day,	month

 INTERFACE

   class	time_base {
   public:
    enum	dateorder { no_order, dmy, mdy,	ymd, ydm };
   };

   template <class charT, class InputIterator =
 	   istreambuf_iterator<charT> >
   class	time_get : public locale::facet, public	time_base {
   public:
    typedef charT	    char_type;
    typedef InputIterator    iter_type;
    explicit time_get(size_t = 0);
    dateorder date_order()  const;
    iter_type get_time(iter_type, iter_type, ios_base&,
 		      ios_base::iostate&, tm*)	const;
    iter_type get_date(iter_type, iter_type, ios_base&,
 		      ios_base::iostate&, tm*)	const;
    iter_type get_weekday(iter_type, iter_type, ios_base&,
 			 ios_base::iostate&, tm*) const;
    iter_type get_monthname(iter_type, iter_type, ios_base&,
 			   ios_base::iostate&, tm*) const;
    iter_type get_year(iter_type, iter_type, ios_base&,
 		      ios_base::iostate&, tm*) const;
    static locale::id id;
   protected:
     ~time_get();  // virtual
    virtual dateorder do_date_order()  const;
    virtual iter_type do_get_time(iter_type, iter_type, os_base&,
 				 ios_base::iostate&, tm*) const;
    virtual iter_type do_get_date(iter_type, iter_type, ios_base&,
 				 ios_base::iostate&, tm*) const;
    virtual iter_type do_get_weekday(iter_type, iter_type, os_base&,
 				    ios_base::iostate&,	tm*) const;
    virtual iter_type do_get_monthname(iter_type, ios_base&,
 				      ios_base::iostate&, tm*) const;
    virtual iter_type do_get_year(iter_type, iter_type, ios_base&,
 				 ios_base::iostate&, tm*) const;
   };

 TYPES

   char_type
      Type of character the facet is instantiated on.

   iter_type

      Type of iterator used to scan the character buffer.

 CONSTRUCTORS AND DESTRUCTORS

   explicit time_get(size_t refs	= 0)
      Construct a time_get facet.  If the refs argument is 0 then
      destruction of	the object is delegated	to the locale, or
      locales, containing it. This allows the user to ignore lifetime
      management	issues.	 On the	other had, if refs  is 1	then
      the object	must be	explicitly deleted; the locale will not do
      so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   ~time_get();	// virtual and protected
      Destroy the facet

 FACET ID

   static locale::id id;
      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

   The public members of	the time_get facet provide an interface	to
   protected members.  Each public	member xxx has a corresponding
   virtual protected member do_xxx.  All work is delagated	to
   these protected members.   For instance, the	long version of	the
   public get_time function simply calls its protected cousin
   do_get_time.

   dateorder
   date_order()	const;
   iter_type
   get_date(iter_type s,	iter_type end, ios_base& f,
 	  ios_base::iostate& err, tm* t)  const;
   iter_type
   get_monthname(iter_type s, iter_type end, ios_base& f,
 	       ios_base::iostate& err, tm* t) const;
   iter_type
   get_time(iter_type s,	iter_type end, ios_base& f,
 	  ios_base::iostate& err, tm* t)  const;
   iter_type
   get_weekday(iter_type	s, iter_type end, ios_base& f,
 	     ios_base::iostate&	err, tm* t) const;
   iter_type
   get_year(iter_type s,	iter_type end, ios_base& f,
 	  ios_base::iostate& err, tm* t) const;
      Each of these public functions simply calls a corresponding protected
      virtual do_ function.

 PROTECTED MEMBER FUNCTIONS

   virtual dateorder
   do_date_order()  const;

      Return the	a value	indicating the relative	ordering of the	three
      basic parts of a	date.  Possible	return values are:

      +	     noorder, indicating that the date format has no ordering,
           an ordering cannot be determined, or the	date format
           contains variable components other than	Month, Day and
           Year.  noorder is never returned by the default time_put, but
           may be used by derived classes.

      +	     one of dmy, mdy, ymd, ydm,	indicating the relative	ordering
           of Day, Month and Year.

   virtual iter_type
   do_get_date(iter_type	s, iter_type end, ios_base&,
 	     ios_base::iostate&	err, tm* t) const;

      Fills out the t argument with date	values parsed from the
      character buffer specified by the range (s,end].  If	the
      buffer does	not contain a valid date	representation
      then the	err argument will be set to iosbase::failbit.

      Returns an	iterator pointing just beyond the last character that
      can be determined	to be part of a	valid date.

   virtual iter_type
   do_get_monthname(iter_type s,	ios_base&,
 		  ios_base::iostate& err, tm* t) const;

      Fills out the tm_mon member of the	t argument with	a month	name
      parsed from the character	buffer specified by the	range (s,end].
      As with do_get_weekday, this name may be an abbreviation, but the
      function	will attempt to	read a full name if valid characters
      are found after an abbreviation.  For	example, if a full
      name	is "December", and an abbreviation is	"Dec", then
      the	string "Dece" will cause an error. If an error occurs
      then the  err	argument will be set to	iosbase::failbit.

      Returns an	iterator pointing just beyond the last character that
      can be determined	to be part of a	valid name.

   virtual iter_type
   do_get_time(iter_type	s, iter_type end, os_base&,
 	     ios_base::iostate&	err, tm* t) const;

      Fills out the t argument with time	values parsed from the
      character buffer specified by the range (s,end].  The buffer
      must contain a valid time representation. Returns an iterator
      pointing just beyond the last character that can	be determined
      to be part of a valid time.

   virtual iter_type

   do_get_weekday(iter_type s, iter_type	end, os_base&,
 		ios_base::iostate& err,	tm* t) const;

      Fills out the tm_wday member of the t argument with a weekday
      name parsed from the character buffer specified	by the range
      (s,end].  This name may be an abbreviation, but the function will
      attempt	to read	a full name if valid	characters are found
      after an abbreviation.  For instance, if a full name is "Monday",
      and an abbreviation is "Mon", then the string	"Mond" will
      cause an error. If an error	occurs then the	 err argument
      will be set to iosbase::failbit.

      Returns an	iterator pointing just beyond the last character that
      can be determined	to be part of a	valid name.

   virtual iter_type

   do_get_year(iter_type	s, iter_type end, ios_base&,
 	     ios_base::iostate&	err, tm* t) const;

      Fills in the tm_year member of the	t argument with	a year parsed
      from the character buffer specified by the range (s,end].  If an
      error occurs then the  err argument will be set	to
      iosbase::failbit.

      Returns an	iterator pointing just beyond the last character that
      can be determined	to be part of a	valid year.

 EXAMPLE

   //
   // timeget.cpp
   //
   #include <locale>
   #include <sstream>
   #include <time.h>

    using namespace std;

   // Print out a tm struct
   ostream& operator<< (ostream&	os, const struct tm& t)
   {
    os << "Daylight Savings = " << t.tm_isdst <<	endl;
    os << "Day of year	   = " << t.tm_yday << endl;
    os << "Day of week	   = " << t.tm_wday << endl;
    os << "Year		   = " << t.tm_year << endl;
    os << "Month		   = " << t.tm_mon << endl;
    os << "Day of month	   = " << t.tm_mday << endl;
    os << "Hour		   = " << t.tm_hour << endl;
    os << "Minute	   = " << t.tm_min << endl;
    os << "Second	   = " << t.tm_sec << endl;
    return os;
   }

   int main ()
   {
    typedef istreambuf_iterator<char,char_traits<char> >	iter_type;

    locale loc;
    time_t tm = time(NULL);
    struct tm* tmb = localtime(&tm);
    struct tm timeb;
    memcpy(&timeb,tmb,sizeof(struct tm));
    ios_base::iostate state;
    iter_type end;

     // Get a time_get facet
    const time_get<char,iter_type>& tg =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
    use_facet<time_get<char,iter_type> >(loc);
   #else
    use_facet(loc,(time_get<char,iter_type>*)0);
   #endif

    cout	<< timeb << endl;
     {
       // Build an istringstream	from the buffer	and construct
       // beginning and ending iterators	on it.
      istringstream ins("12:46:32");
      iter_type begin(ins);

       // Get the time
      tg.get_time(begin,end,ins,state,&timeb);
     }
    cout	<< timeb << endl;
     {
       // Get the date
      istringstream ins("Dec 6 1996");
      iter_type begin(ins);
      tg.get_date(begin,end,ins,state,&timeb);
     }
    cout	<< timeb << endl;
     {
       // Get the weekday
      istringstream ins("Tuesday");
      iter_type begin(ins);
      tg.get_weekday(begin,end,ins,state,&timeb);
     }
    cout	<< timeb << endl;
    return 0;
   }

 SEE ALSO

   locale, facets, time_put

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  30 - time_get_byname

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   time_get_byname - A facet that provides formatted time input
   facilities based	on the named locales.

 SYNOPSIS

   #include <locale>
   template <class charT, class InputIterator =
 	   istreambuf_iterator<charT> >
   class	time_get_byname;

 DESCRIPTION

   The time_get_byname  template	provides the same functionality	as the
   time_get  template, but specific to a	particular named locale.  For
   a description of the member functions of time_get_byname, see the
   reference for time_get.	 Only the constructor is described
   here.

 INTERFACE

   template <class charT, class InputIterator =
 	   istreambuf_iterator<charT> >
   class	time_get_byname	: public time_get<charT, InputIterator>	{
   public:
    explicit time_get_byname(const char*, size_t	= 0);
   protected:
     ~time_get_byname();	 // virtual
    virtual dateorder do_date_order()  const;
    virtual iter_type do_get_time(iter_type, iter_type, ios_base&,
 				 ios_base::iostate&, tm*) const;
    virtual iter_type do_get_date(iter_type, iter_type, ios_base&,
 				 ios_base::iostate&, tm*) const;
    virtual iter_type do_get_weekday(iter_type, iter_type, ios_base&,
 				  ios_base::iostate& err, tm*) const;
    virtual iter_type do_get_monthname(iter_type, iter_type, ios_base&,
 				      ios_base::iostate&, tm*) const;
    virtual iter_type do_get_year(iter_type, iter_type, ios_base&,
 				 ios_base::iostate&, tm*) const;
   };

 CONSTRUCTOR

   explicit time_get_byname(const char* name, size_t refs = 0);
      Construct a time_get_byname facet.	 The facet will	provide	time
      formatting facilities relative to the named locale specified by
      the name	argument. If the refs argument	is 0 then
      destruction of the object is delegated to the locale, or locales,
      containing it. This allows the user to	ignore lifetime
      management issues.  On the other had, if refs  is 1 then the
      object must be explicitly	deleted; the locale will not do	so. In
      this case, the object can be maintained	across the lifetime of
      multiple locales.

 SEE ALSO

   locale, facets, time_get, time_put_byname

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  31 - time_put

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   time_put - Time formatting facet for ouput.

 SYNOPSIS

   #include <locale>
   template <class charT, class OutputIterator =
 	   ostreambuf_iterator<charT> >
   class	time_put;

 DESCRIPTION

   The time_put facet provides facilities for formated output of
   date/time values.  The member function of time_put take	a
   date/time in the form	of a struct tm and	translate this into
   character string representation.

 INTERFACE

   template <class charT, class OutputIterator =
 	   ostreambuf_iterator<charT> >
   class	time_put : public locale::facet	{
   public:
    typedef charT	    char_type;
    typedef OutputIterator   iter_type;
    explicit time_put(size_t = 0);
    iter_type put(iter_type, ios_base&,
 		 char_type, const tm*,
 		 const charT*, const charT*) const;
    iter_type put(iter_type, ios_base&, char_type,
 		 const tm*, char, char = 0) const;
    static locale::id id;
   protected:
     ~time_put();  // virtual
    virtual iter_type do_put(iter_type, ios_base&,
 			    char_type, const tm*,
 			    char, char)	const;
   };

 TYPES

   char_type
      Type of character the facet is instantiated on.

   iter_type

      Type of iterator used to scan the character buffer.

 CONSTRUCTORS AND DESTRUCTORS

   explicit time_put(size_t refs	= 0)

      Construct a time_put facet.  If the refs argument is 0 then
      destruction of	the object is delegated	to the locale, or
      locales, containing it. This allows the user to ignore lifetime
      management	issues.	 On the	other had, if refs  is 1	then
      the object	must be	explicitly deleted; the locale will not do
      so.  In	this case, the object can be maintained across the
      lifetime of multiple locales.

   ~time_put();	// virtual and protected

      Destroy the facet

 FACET ID

   static locale::id id;

      Unique identifier for this	type of	facet.

 PUBLIC MEMBER FUNCTIONS

   iter_type
   put(iter_type	s, ios_base& f,
      char_type fill, const tm* tmb,
      const charT* pattern, const charT*	pat_end) const;

      Creates a character string	representing the Date/Time contained
      in	tmb. The format	of the string is determined by a sequence of
      format modifiers contained in the range [pattern,pat_end).	These
      modifiers	are from the same set as those use by the strftime
      function and	apply in exactly the same way.	The resulting
      string is	written	out to the buffer pointed to by	the iterator
      s.	 See the Table 1 below for a description of strftime
      formatting	characters.

      The fill argument is used for any padding.

      Returns an	iterator pointing one past the last character written.

   iter_type
   put(iter_type	s, ios_base& f,	char_type fill,
      const tm* tmb, char format, char modifier = 0) const;

      Calls the protected virtual do_put	function.

 PROTECTED MEMBER FUNCTIONS

   virtual iter_type
   do_put(iter_type s, ios_base&,
 	char_type fill,	const tm* t,
 	char format, char modifier) const;

      Writes out	a character string representation of the Date/Time
      contained in	t.  The	string is formatted according the the
      specifier	format and modifier modifier.	 These values are
      interpreted in exactly the same way that the strftime function
      intrprets its format and modifier flags.  See the Table 1 below
      for a description of strftime formatting	characters.

      The fill argument is used for any padding.

      Returns an	iterator pointing one past the last character written.

      Table 1. Formatting characters used by strftime().

      For those formats that do not use all members of the struct tm,
      only those members that	are actually used are noted [in
      brackets].

      Format
      character	Meaning			       Example

      a		Abbreviated weekday name
 		[from tm::tm_wday]	       Sun
      A		Full weekday name
 		[from tm::tm_wday]	       Sunday
      b		Abbreviated month name	       Feb
      B		Full month name		       February
      c		Date and time
 		[may use all members]	       Feb 29 14:34:56 1984
      d		Day of the month	       29
      H		Hour of	the 24-hour day	       14
      I		Hour of	the 12-hour day	       02
      j		Day of the year,
 		from 001 [from tm::tm_yday]    60
      m		Month of the year, from	01     02
      M		Minutes	after the hour	       34
      p		AM/PM indicator, if any	       AM
      S		Seconds	after the minute       56
      U		Sunday week of the year,
 		from 00	[from tm::tm_yday
 		and tm::tm_wday]
      w		Day of the week,
 		with 0 for Sunday	       0
      W		Monday week of the year,
 		from 00	[from tm::tm_yday
 		and tm::tm_wday]
      x		Date [uses tm::tm_yday
 		in some	locales]	       Feb 29 1984
      X		Time			       14:34:56
      y		Year of	the century,
 		from 00	(deprecated)	       84
      Y		Year			       1984
      Z		Time zone name
 		[from tm::tm_isdst]	       PST or PDT

 EXAMPLE

   //
   // timeput.cpp
   //
   #include <iostream>

   int main ()
   {
    using namespace std;

    typedef ostreambuf_iterator<char,char_traits<char> >	iter_type;

    locale loc;
    time_t tm = time(NULL);
    struct tm* tmb = localtime(&tm);
    struct tm timeb;
    memcpy(&timeb,tmb,sizeof(struct tm));
    char	pat[] =	"%c";

     // Get a time_put facet
    const time_put<char,iter_type>& tp =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
    use_facet<time_put<char,iter_type> >(loc);
   #else
    use_facet(loc,(time_put<char,iter_type>*)0);
   #endif

     // Construct a ostreambuf_iterator on cout
    iter_type begin(cout);

    cout	<< " --> ";
    tp.put(begin,cout,' ',&timeb,pat,pat+2);

    cout	<< endl	<< " --> ";
    tp.put(begin,cout,' ',&timeb,'c',' ');

    cout	<<  endl;

    return 0;
   }

 SEE ALSO

   locale, facets, time_get

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  32 - time_put_byname

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   time_put_byname - A facet that provides formatted time output
   facilities based	on the named locales.

 SYNOPSIS

   #include <locale>
   template <class charT, class OuputIterator =
 	   ostreambuf_iterator<charT> >
   class	time_put_byname;

 DESCRIPTION

   The time_put_byname  template	provides the same functionality	as the
   time_put  template, but specific to a	particular named locale.  For
   a description of the member functions of time_put_byname, see the
   reference for time_put.	 Only the constructor is described
   here.

 INTERFACE

   template <class charT, class OutputIterator =
             ostreambuf_iterator<charT> >
   class	time_put_byname	: public time_put<charT, OutputIterator>
   {
   public:
    explicit time_put_byname(const char*, size_t	refs = 0);
   protected:
     ~time_put_byname();	 // virtual
    virtual iter_type do_put(iter_type s, ios_base&,
 			    char_type, const tm* t,
 			    char format, char modifier)	const;
   };

 CONSTRUCTOR

   explicit time_put_byname(const char* name, size_t refs = 0);

   Construct a time_put_byname facet.	 The facet will	provide	time
   formatting facilities relative to the named locale specified by
   the name argument. If the refs argument is 0 then destruction of the
   object	is delegated to the locale, or locales, containing it.
   This allows the user to	ignore lifetime	management issues.  On
   the other had, if refs  is 1 then the object must be explicitly
   deleted; the locale will not do	so. In	this case, the object
   can be maintained	across the lifetime of multiple locales.

 SEE ALSO

   locale, facets, time_put, time_get_byname

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  33 - tolower

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   tolower - Converts a character to lower case.

 SYNOPSIS

   #include <locale>

   template <class charT>
   charT	tolower	(charT c, const	locale&	loc) const;

 DESCRIPTION

   The tolower returns the the parameter	c converted to lower case.
   The conversion is	made using the ctype facet from	the locale
   parameter.

 EXAMPLE

   //
   // toupper.cpp
   //
   #include <iostream>

   int main ()
   {
    using namespace std;

    locale loc;

    cout	<< 'a' << toupper('c') << tolower('F') << endl;

    return 0;
   }

 SEE ALSO

   toupper, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  34 - toupper

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   toupper - Converts a character to upper case.

 SYNOPSIS

   #include <locale>

   template <class charT>
   charT	toupper	(charT c, const	locale&	loc) const;

 DESCRIPTION

   The toupper returns the the parameter	c converted to upper case.
   The conversion is	made using the ctype facet from	the locale
   parameter.

 EXAMPLE

   //
   // toupper.cpp
   //
   #include <iostream>

   int main ()
   {
    using namespace std;

    locale loc;

    cout	<< 'a' << toupper('c') << tolower('F') << endl;

    return 0;
   }

 SEE ALSO

   tolower, locale, ctype

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  35 - use_facet

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   use_facet - Template function	used to	obtain a facet.

 SYNOPSIS

   #include <locale>
   template <class Facet> const Facet& use_facet(const locale&);

 DESCRIPTION

   use_facet returns a reference	to the corresponding facet contained
   in	the locale argument.  You	specify	the facet type be
   explicitly providing the template parameter (See the example below).
   If that facet is	not present then use_facet throws
   bad_cast.  Otherwise, the reference will remain	valid for as
   long as any copy of   the locale exists.

   Note that if your compiler cannot overload function templates	on
   return type then you'll need	to use an alternate use_facet
   template.	 The alternate template	takes an additional
   argument that's a pointer to the type of facet	you want to
   extract from the locale.  The declaration looks like this:

 template <class Facet> const	Facet& use_facet(const locale&,
 Facet*);

   The example below shows the use of both variations of	use_facet.

 EXAMPLE

   //
   // usefacet.cpp
   //
   #include <iostream>

   int main ()
   {
    using namespace std;

    locale loc;

     // Get a ctype facet
    const ctype<char>& ct =
   #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
       use_facet<ctype<char> >(loc);
   #else
       use_facet(loc,(ctype<char>*)0);
   #endif

    cout	<< 'a' << ct.toupper('c') << endl;

    return 0;
   }

 SEE ALSO

   locale, facets, has_facet
  Close     Help