| [29] | 1 | // interator.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 |
|---|