161 lines
9.2 KiB
HTML
161 lines
9.2 KiB
HTML
<!--
|
|
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>
|