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