forked from boostorg/iterator
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <html>
 | |
| <!--
 | |
|   -- Copyright (c) Jeremy Siek 2000
 | |
|   --
 | |
|   -- Permission to use, copy, modify, distribute and sell this software
 | |
|   -- and its documentation for any purpose is hereby granted without fee,
 | |
|   -- provided that the above copyright notice appears in all copies and
 | |
|   -- that both that copyright notice and this permission notice appear
 | |
|   -- in supporting documentation.  I make no representations about the
 | |
|   -- suitability of this software for any purpose.  It is provided "as is"
 | |
|   -- without express or implied warranty.
 | |
|   -->
 | |
|   <head>
 | |
|     <title>Boost Iterator Traits</title>
 | |
|   </head>
 | |
| 
 | |
| <BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b" 
 | |
| 	ALINK="#ff0000"> 
 | |
| <IMG SRC="../../c++boost.gif" 
 | |
|      ALT="C++ Boost" width="277" height="86"> 
 | |
| <BR Clear>
 | |
| 
 | |
|     <h1>Boost Iterator Traits</h1>
 | |
| Header <tt><a href="../../boost/iterator_traits.hpp">boost/iterator_traits.hpp</a></tt>
 | |
| 
 | |
| <p>
 | |
| The <tt>boost::iterator_traits</tt> class provides access to the
 | |
| associated types of iterators that model the Boost <a
 | |
| href="./iterator_concepts.htm">Iterator Concepts</a>, which are a
 | |
| replacement for the iterator requirements in the C++ standard.
 | |
| The main difference between <tt>std::iterator_traits</tt> and
 | |
| <tt>boost::iterator_traits</tt> is that the <tt>iterator_category</tt>
 | |
| type has been removed, and replaced with two new types:
 | |
| 
 | |
| <ul>
 | |
|   <li><tt>traversal_category</tt>:   Can the iterator go forward, backward, etc.?
 | |
|   <li><tt>return_category</tt>:   Is the iterator read or write only?
 | |
|     Is the dereferenced type an lvalue?
 | |
| </ul>
 | |
| 
 | |
| 
 | |
| <p>
 | |
| An important feature of the <tt>boost::iterator_traits</tt> is that it
 | |
| is <b>backwards compatible</b>, i.e., it will automatically work for
 | |
| iterators for which there are valid definitions of
 | |
| <tt>std::iterator_traits</tt>. The old <tt>iterator_category</tt> is
 | |
| mapped to the appropriate traversal and return categories.
 | |
| 
 | |
| <p>
 | |
| When creating a new iterator type that is meant to work with
 | |
| <tt>boost::iterator_traits</tt>, you can either create a
 | |
| specialization of <tt>boost::iterator_traits</tt> for your iterator
 | |
| type, or you can provide all the necessary associated types as nested
 | |
| typedefs.  In this case, your iterator class will need to inherit from
 | |
| <tt>new_iterator_base</tt> to let <tt>boost::iterator_traits</tt> know
 | |
| that it will be able to find typedefs for <tt>traversal_category</tt>
 | |
| and <tt>return_category</tt> in you iterator class.
 | |
| 
 | |
| 
 | |
| <pre>
 | |
| namespace boost {
 | |
| 
 | |
|   <i>// Inherit from iterator_base if your iterator defines its own
 | |
|   // return_category and traversal_category. Otherwise, the "old style"
 | |
|   // iterator category will be mapped to the return_category and
 | |
|   // traversal_category.</i>
 | |
|   struct new_iterator_base { };
 | |
| 
 | |
|   template <typename Iterator>
 | |
|   struct iterator_traits
 | |
|   {
 | |
|     if (Iterator inherits from new_iterator_base) {
 | |
|       typedef typename Iterator::value_type value_type;
 | |
|       typedef typename Iterator::reference reference;
 | |
|       typedef typename Iterator::pointer pointer;
 | |
|       typedef typename Iterator::difference_type difference_type;
 | |
|       typedef typename Iterator::return_category return_category;
 | |
|       typedef typename Iterator::traversal_category traversal_category;
 | |
|     } else {
 | |
|       typedef std::iterator_traits<Iterator> OldTraits;
 | |
|       typedef typename OldTraits::value_type value_type;
 | |
|       typedef typename OldTraits::reference reference;
 | |
|       typedef typename OldTraits::pointer pointer;
 | |
|       typedef typename OldTraits::difference_type difference_type;
 | |
| 
 | |
|       typedef typename OldTraits::iterator_category Cat;
 | |
| 
 | |
|       <i>// Determine the traversal_category based on the old iterator_category</i>
 | |
|       if (Cat inherits from std::random_access_iterator_tag)
 | |
|         typedef boost::random_access_iterator_tag traversal_category;
 | |
|       else if (Cat inherits from std::bidirectional_iterator_tag)
 | |
|         typedef boost::bidirectional_iterator_tag traversal_category;
 | |
|       else if (Cat inherits from std::forward_iterator_tag)
 | |
|         typedef boost::forward_iterator_tag traversal_category;
 | |
|       else 
 | |
|         typedef boost::single_pass_iterator_tag traversal_category;
 | |
| 
 | |
|       <i>// Determine the return_category based on the old iterator_category and value_type</i>
 | |
|       if (Cat inherits from std::forward_iterator_tag)
 | |
|         if (is-const(T))
 | |
|           typedef boost::constant_lvalue_iterator_tag return_category;
 | |
|         else
 | |
|           typedef boost::mutable_lvalue_iterator_tag return_category;
 | |
|       else if (Cat inherits from std::input_iterator_tag)
 | |
|         typedef boost::readable_iterator_tag return_category;
 | |
|       else if (Cat inherits from std::output_iterator_tag)
 | |
|         typedef boost::writable_iterator_tag return_category;
 | |
|       else
 | |
|         typedef boost::error_iterator_tag return_category;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   template <typename T>
 | |
|   struct iterator_traits<T*>
 | |
|   {
 | |
|     typedef T value_type;
 | |
|     typedef T& reference;
 | |
|     typedef T* pointer;
 | |
|     typedef std::ptrdiff_t difference_type;
 | |
|     if (is-const(T))
 | |
|       typedef boost::constant_lvalue_iterator_tag return_category;
 | |
|     else
 | |
|       typedef boost::mutable_lvalue_iterator_tag return_category;
 | |
|     typedef boost::random_access_iterator_tag traversal_category;
 | |
|   };
 | |
| 
 | |
| }
 | |
| </pre>
 | |
| 
 | |
|     <hr>
 | |
|     <address><a href="mailto:jsiek@lsc.nd.edu">jeremy siek</a></address>
 | |
| <!-- Created: Sun Mar 18 14:06:57 EST 2001 -->
 | |
| <!-- hhmts start -->
 | |
| Last modified: Mon Mar 19 12:59:30 EST 2001
 | |
| <!-- hhmts end -->
 | |
|   </body>
 | |
| </html>
 |