first commit
This commit is contained in:
160
extern/stdcxx/4.2.1/doc/stdlibug/41-2.html
vendored
Normal file
160
extern/stdcxx/4.2.1/doc/stdlibug/41-2.html
vendored
Normal file
@@ -0,0 +1,160 @@
|
||||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed
|
||||
with this work for additional information regarding copyright
|
||||
ownership. The ASF licenses this file to you under the Apache
|
||||
License, Version 2.0 (the License); you may not use this file
|
||||
except in compliance with the License. You may obtain a copy of
|
||||
the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied. See the License for the specific language governing
|
||||
permissions and limitations under the License.
|
||||
|
||||
Copyright 1999-2007 Rogue Wave Software, Inc.
|
||||
-->
|
||||
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Defining Traits and Facets for User-Defined Types</TITLE>
|
||||
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
|
||||
<BODY BGCOLOR=#FFFFFF>
|
||||
<A HREF="41-1.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="41-3.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library User's Guide</B></DIV>
|
||||
<H2>41.2 Defining Traits and Facets for User-Defined Types</H2>
|
||||
<A NAME="idx967"><!></A>
|
||||
<P>A user-defined type requires its own traits class, its own code conversion facet, and its own character classification facet. The traits class defines a conversion <SAMP>state_type</SAMP> and also defines operations such as copying arrays of the type and comparing arrays. The code conversion facet provides conversion to and from simple <SAMP>char</SAMP>s. The <SAMP>ctype</SAMP> facet provides character classification and manipulation routines, including the method for converting the new type to and from simple <SAMP>char</SAMP>s.</P>
|
||||
<A NAME="idx968"><!></A>
|
||||
<P>The following code shows a traits class declaration for <SAMP>Echar</SAMP>:</P>
|
||||
|
||||
<UL><PRE>
|
||||
struct Etraits
|
||||
{
|
||||
typedef Echar char_type;
|
||||
typedef long int_type;
|
||||
|
||||
typedef std::streamoff off_type;
|
||||
typedef std::mbstate_t state_type;
|
||||
typedef std::fpos<state_type> pos_type;
|
||||
|
||||
static void assign (char_type& c1, const char_type& c2);
|
||||
static bool eq(const char_type& c1,const char_type& c2);
|
||||
static bool lt (const char_type& c1, const char_type& c2);
|
||||
static int compare (const char_type* s1, const char_type* s2,
|
||||
std::size_t n);
|
||||
static std::size_t length(const char_type *s);
|
||||
static const char_type*
|
||||
find (const char_type* s, int n, const char_type& a);
|
||||
static char_type* move (char_type* s1, const char_type* s2,
|
||||
std::size_t n);
|
||||
static char_type* copy(char_type *dst,const char_type *src,
|
||||
std::size_t n);
|
||||
static char_type* assign (char_type* s, std::size_t n,
|
||||
const char_type& a);
|
||||
static int_type not_eof(const int_type& c);
|
||||
static char_type to_char_type(const int_type& c);
|
||||
static int_type to_int_type(const char_type& c);
|
||||
static bool eq_int_type(const int_type& c1,const int_type& c2);
|
||||
static state_type get_state(pos_type pos);
|
||||
static int_type eof();
|
||||
};
|
||||
</PRE></UL>
|
||||
<P>See the <A HREF="../stdlibref/noframes.html"><I>Apache C++ Standard Library Reference Guide</I></A> section on <A HREF="../stdlibref/char-traits.html">char_traits</A> for a complete description of the member functions in a traits class.</P>
|
||||
<P>To create a new code conversion facet, you must inherit from the <SAMP>std::codecvt</SAMP> template and then override some or all the protected virtual functions. Iostreams calls the protected functions through the public interface defined for <SAMP>std::codecvt</SAMP>. You must also provide a constructor taking a single <SAMP>std::size_t</SAMP> argument, and initialize <SAMP>codecvt</SAMP> with that argument.</P>
|
||||
<A NAME="idx969"><!></A>
|
||||
<P>A code conversion facet for <SAMP>Echar</SAMP> has a declaration that looks like this:</P>
|
||||
|
||||
<UL><PRE>
|
||||
class Ecodecvt : public std::codecvt<Echar,char,Estate>
|
||||
{
|
||||
public:
|
||||
explicit Ecodecvt (std::size_t refs = 0)
|
||||
: std::codecvt<Echar,char,Estate>(refs) { }
|
||||
|
||||
protected:
|
||||
|
||||
virtual result do_out(Estate& state, const Echar* from,
|
||||
const Echar* from_end,
|
||||
const Echar*& from_next,
|
||||
char* to, char* to_limit,
|
||||
char*& to_next) const;
|
||||
virtual result do_in(Estate& state,
|
||||
const char* from,
|
||||
const char* from_end,
|
||||
const char*& from_next,
|
||||
Echar* to, Echar* to_limit,
|
||||
Echar*& to_next) const;
|
||||
virtual result do_unshift(Estate& state,
|
||||
char* to, char* to_limit,
|
||||
char*& to_next) const;
|
||||
virtual int do_encoding() const throw();
|
||||
virtual bool do_always_noconv() const throw();
|
||||
virtual int do_length(Estate& state, const char* from,
|
||||
const char* end, size_t maxm) const;
|
||||
virtual int do_max_length() const throw();
|
||||
};
|
||||
</PRE></UL>
|
||||
<P>See <A HREF="40.html">Chapter 40</A> on defining a code conversion facet for more details. Also see the <A HREF="../stdlibref/noframes.html"><I>Apache C++ Standard Library Reference Guide</I></A> section on <A HREF="../stdlibref/codecvt.html">codecvt</A> for a complete description of member functions.</P>
|
||||
<P>To create a character classification facet, you must inherit from the <SAMP>std::ctype</SAMP> template and provide implementations for all protected virtual functions. You must also provide a constructor taking a single <SAMP>std::size_t</SAMP> argument, and initialize <SAMP>std::ctype</SAMP> with that argument.</P>
|
||||
<P>Note that the <SAMP>widen()</SAMP> functions define conversions from simple <SAMP>char</SAMP>s to the user-defined character type, and the narrow function provides conversions from the user-defined type to simple <SAMP>char</SAMP>s.</P>
|
||||
<A NAME="idx970"><!></A>
|
||||
<P>A character classification facet for <SAMP>Echar</SAMP> has a declaration that looks like this:</P>
|
||||
|
||||
<UL><PRE>
|
||||
class Ectype : public std::ctype<Echar>
|
||||
{
|
||||
public:
|
||||
typedef Echar char_type;
|
||||
explicit Ectype (std::size_t refs = 0) :
|
||||
std::ctype<Echar>(refs) { } // must pass refs onto
|
||||
// the ctype constructor
|
||||
|
||||
protected:
|
||||
|
||||
virtual bool do_is(mask m, Echar c) const;
|
||||
virtual const Echar* do_is(
|
||||
const Echar* low,
|
||||
const Echar* high,
|
||||
mask* vec) const;
|
||||
virtual const Echar* do_scan_is(
|
||||
mask m, const Echar* low,
|
||||
const Echar* high) const;
|
||||
virtual const Echar* do_scan_not(
|
||||
mask m, const Echar* low,
|
||||
const Echar* high) const;
|
||||
virtual Echar do_toupper(Echar e) const;
|
||||
virtual const Echar* do_toupper(Echar* low,
|
||||
const Echar* high) const;
|
||||
virtual Echar do_tolower(Echar) const;
|
||||
virtual const Echar* do_tolower(Echar* low,
|
||||
const Echar* high) const;
|
||||
virtual Echar do_widen(char) const;
|
||||
virtual const char* do_widen(const char* lo,
|
||||
const char* hi,
|
||||
Echar* dest) const;
|
||||
virtual char do_narrow(Echar, char dfault) const;
|
||||
virtual const Echar* do_narrow(const Echar* lo,
|
||||
const Echar* hi,char dfault,
|
||||
char* dest) const;
|
||||
|
||||
};
|
||||
</PRE></UL>
|
||||
|
||||
<BR>
|
||||
<HR>
|
||||
<A HREF="41-1.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="41-3.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>
|
||||
|
||||
<!-- Google Analytics tracking code -->
|
||||
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
_uacct = "UA-1775151-1";
|
||||
urchinTracker();
|
||||
</script>
|
||||
<!-- end of Google Analytics tracking code -->
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
Reference in New Issue
Block a user