[857] | 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 : detail::iterator_base<Category, T, Distance, Pointer, Reference> {};
|
---|
| 56 | # endif
|
---|
| 57 | } // namespace boost
|
---|
| 58 |
|
---|
| 59 | #endif // BOOST_ITERATOR_HPP
|
---|