<!--
    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>__iterator_category()</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="--distance-type.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="IV.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>
<H2>__iterator_category()</H2><PRE><HR><B><I>Does not inherit</I></B> <HR></PRE>

<UL>
<LI><A HREF="#sec1">Local Index</A></LI>
<LI><A HREF="#sec2">Summary</A></LI>
<LI><A HREF="#sec3">Synopsis</A></LI>
<LI><A HREF="#sec4">Description</A></LI>
<LI><A HREF="#sec5">Tag Types</A></LI>
<LI><A HREF="#sec6">See Also</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
No Entries
<A NAME="sec2"><H3>Summary</H3></A>
<P>An iterator primitive that determines the category to which an iterator belongs. </P>
<BLOCKQUOTE><HR><B>
NOTE -- This function is now obsolete. It is retained here to support compilers that do not include partial specialization, but will be dropped in a subsequent release.
</B><HR></BLOCKQUOTE>
<A NAME="sec3"><H3>Synopsis</H3></A>

<PRE>#include &lt;iterator&gt;
template &lt;class Category, class T, class Distance, 
          class Pointer, class Reference&gt;
inline Category 
         __iterator_category(const iterator&lt;Category,
                                 T, Distance, Pointer,
                                 Reference&gt;&amp;);
template &lt;class T&gt;
inline random_access_iterator_tag __iterator_category(const T*);
</PRE>
<A NAME="sec4"><H3>Description</H3></A>
<P>The <SAMP>__iterator_category()</SAMP> family of function templates allows you to determine the category to which any iterator belongs. The first function takes an iterator of a specific type and returns the tag for that type. The last takes a&nbsp;<SAMP>T*</SAMP> and returns <SAMP>random_access_iterator_tag</SAMP>.</P>
<A NAME="sec5"><H3>Tag Types</H3></A>

<UL><PRE>input_iterator_tag
output_iterator_tag
forward_iterator_tag
bidirectional_iterator_tag
random_access_iterator_tag
</PRE></UL>
<P>The <SAMP>__iterator_category()</SAMP> function is particularly useful for improving the efficiency of algorithms. An algorithm can use this function to select the most efficient implementation an iterator is capable of handling without sacrificing the ability to work with a wide range of iterator types. For instance, both the <SAMP>advance()</SAMP>  and <SAMP>distance()</SAMP>  primitives use <SAMP>__iterator_category()</SAMP> to maximize their efficiency by using the tag returned from <SAMP>__iterator_category()</SAMP> to select from one of several different auxiliary functions. Because this is a compile time selection, use of this primitive incurs no significant runtime overhead.</P>
<P><SAMP>__iterator_category()</SAMP> is typically used like this:</P>

<UL><PRE>
template &lt;class Iterator&gt;
void foo(Iterator start, Iterator finish)
{
  __foo(begin,end,__iterator_category(start));
}

template &lt;class Iterator&gt;
void __foo(Iterator start, Iterator finish,
           input_iterator_tag&gt;
{
  // Most general implementation
}

template &lt;class Iterator&gt;
void __foo(Iterator start, Iterator finish,
           bidirectional_iterator_tag&gt;
{
  // Implementation takes advantage of bi-directional
  // capability of the iterators
}

...etc.
</PRE></UL>
<P>See the <B><I><A HREF="iterator.html">iterator</A></I></B> section for a description of iterators and the capabilities associated with each type of iterator tag.</P>
<A NAME="sec6"><H3>See Also</H3></A>
<P>Other iterator primitives:  <SAMP><A HREF="--distance-type.html">__distance_type()</A></SAMP>, <SAMP><A HREF="distance.html">distance()</A></SAMP>, <SAMP><A HREF="advance.html">advance()</A></SAMP>, <B><I><A HREF="iterator.html">iterator</A></I></B></P>


<BR>
<HR>
<A HREF="--distance-type.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="IV.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>
