Ugly, not-to-be-pushed sucking in of all of Boost to get windows to work.
[dyninst.git] / external / boost / iterator.hpp
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