Home | History | Annotate | Download | only in boost
      1 //  iterator.hpp workarounds for non-conforming standard libraries  ---------//
      2 
      3 //  (C) Copyright Beman Dawes 2000. Distributed under the Boost
      4 //  Software License, Version 1.0. (See accompanying file
      5 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
      6 
      7 //  See http://www.boost.org/libs/utility for documentation.
      8 
      9 //  Revision History
     10 //  12 Jan 01 added <cstddef> for std::ptrdiff_t (Jens Maurer)
     11 //  28 Jun 00 Workarounds to deal with known MSVC bugs (David Abrahams)
     12 //  26 Jun 00 Initial version (Jeremy Siek)
     13 
     14 #ifndef BOOST_ITERATOR_HPP
     15 #define BOOST_ITERATOR_HPP
     16 
     17 #include <iterator>
     18 #include <cstddef>           // std::ptrdiff_t
     19 #include <boost/config.hpp>
     20 
     21 namespace boost
     22 {
     23 # if defined(BOOST_NO_STD_ITERATOR) && !defined(BOOST_MSVC_STD_ITERATOR)
     24   template <class Category, class T,
     25     class Distance = std::ptrdiff_t,
     26     class Pointer = T*, class Reference = T&>
     27   struct iterator
     28   {
     29     typedef T         value_type;
     30     typedef Distance  difference_type;
     31     typedef Pointer   pointer;
     32     typedef Reference reference;
     33     typedef Category  iterator_category;
     34   };
     35 # else
     36 
     37   // declare iterator_base in namespace detail to work around MSVC bugs which
     38   // prevent derivation from an identically-named class in a different namespace.
     39   namespace detail {
     40    template <class Category, class T, class Distance, class Pointer, class Reference>
     41 #  if !defined(BOOST_MSVC_STD_ITERATOR)
     42    struct iterator_base : std::iterator<Category, T, Distance, Pointer, Reference> {};
     43 #  else
     44    struct iterator_base : std::iterator<Category, T, Distance>
     45    {
     46      typedef Reference reference;
     47      typedef Pointer pointer;
     48      typedef Distance difference_type;
     49    };
     50 #  endif
     51   }
     52 
     53   template <class Category, class T, class Distance = std::ptrdiff_t,
     54             class Pointer = T*, class Reference = T&>
     55   struct iterator : boost::detail::iterator_base<Category, T, Distance, Pointer, Reference> {};
     56 # endif
     57 } // namespace boost
     58 
     59 #endif // BOOST_ITERATOR_HPP
     60