Boost Iterator Traits

Header boost/iterator_traits.hpp
namespace boost {

  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;

      // Determine the traversal_category based on the old iterator_category
      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;

      // Determine the return_category based on the old iterator_category and value_type
      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;
  };

}

jeremy siek
Last modified: Sun Mar 18 17:10:26 EST 2001