1 // Boost.Range library
2 //
3 //  Copyright Eric Niebler 2014. Use, modification and
4 //  distribution is subject to the Boost Software License, Version
5 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 //  http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // For more information, see http://www.boost.org/libs/range/
9 //
10 
11 #ifndef BOOST_RANGE_DETAIL_MSVC_HAS_ITERATOR_WORKAROUND_HPP
12 #define BOOST_RANGE_DETAIL_MSVC_HAS_ITERATOR_WORKAROUND_HPP
13 
14 #if defined(_MSC_VER)
15 # pragma once
16 #endif
17 
18 #ifndef BOOST_RANGE_MUTABLE_ITERATOR_HPP
19 # error This file should only be included from <boost/range/mutable_iterator.hpp>
20 #endif
21 
22 #if BOOST_WORKAROUND(BOOST_MSVC, <= 1600)
23 namespace boost
24 {
25 namespace cb_details
26 {
27     template <class Buff, class Traits>
28     struct iterator;
29 }
30 
31 namespace python
32 {
33     template <class Container
34               , class NextPolicies /*= objects::default_iterator_call_policies*/>
35     struct iterator;
36 }
37 
38 namespace type_erasure
39 {
40     template<
41         class Traversal,
42         class T                 /*= _self*/,
43         class Reference         /*= ::boost::use_default*/,
44         class DifferenceType    /*= ::std::ptrdiff_t*/,
45         class ValueType         /*= typename deduced<iterator_value_type<T> >::type*/
46     >
47     struct iterator;
48 }
49 
50 namespace unordered { namespace iterator_detail
51 {
52     template <typename Node>
53     struct iterator;
54 }}
55 
56 namespace container { namespace container_detail
57 {
58     template<class IIterator, bool IsConst>
59     class iterator;
60 }}
61 
62 namespace spirit { namespace lex { namespace lexertl
63 {
64     template <typename Functor>
65     class iterator;
66 }}}
67 
68 namespace range_detail
69 {
70     template <class Buff, class Traits>
71     struct has_iterator< ::boost::cb_details::iterator<Buff, Traits> >
72       : mpl::false_
73     {};
74 
75     template <class Buff, class Traits>
76     struct has_iterator< ::boost::cb_details::iterator<Buff, Traits> const>
77       : mpl::false_
78     {};
79 
80     template <class Container, class NextPolicies>
81     struct has_iterator< ::boost::python::iterator<Container, NextPolicies> >
82       : mpl::false_
83     {};
84 
85     template <class Container, class NextPolicies>
86     struct has_iterator< ::boost::python::iterator<Container, NextPolicies> const>
87       : mpl::false_
88     {};
89 
90     template<class Traversal, class T, class Reference, class DifferenceType, class ValueType>
91     struct has_iterator< ::boost::type_erasure::iterator<Traversal, T, Reference, DifferenceType, ValueType> >
92       : mpl::false_
93     {};
94 
95     template<class Traversal, class T, class Reference, class DifferenceType, class ValueType>
96     struct has_iterator< ::boost::type_erasure::iterator<Traversal, T, Reference, DifferenceType, ValueType> const>
97       : mpl::false_
98     {};
99 
100     template <typename Node>
101     struct has_iterator< ::boost::unordered::iterator_detail::iterator<Node> >
102       : mpl::false_
103     {};
104 
105     template <typename Node>
106     struct has_iterator< ::boost::unordered::iterator_detail::iterator<Node> const>
107       : mpl::false_
108     {};
109 
110     template<class IIterator, bool IsConst>
111     struct has_iterator< ::boost::container::container_detail::iterator<IIterator, IsConst> >
112       : mpl::false_
113     {};
114 
115     template<class IIterator, bool IsConst>
116     struct has_iterator< ::boost::container::container_detail::iterator<IIterator, IsConst> const>
117       : mpl::false_
118     {};
119 
120     template <typename Functor>
121     struct has_iterator< ::boost::spirit::lex::lexertl::iterator<Functor> >
122       : mpl::false_
123     {};
124 
125     template <typename Functor>
126     struct has_iterator< ::boost::spirit::lex::lexertl::iterator<Functor> const>
127       : mpl::false_
128     {};
129 }
130 }
131 #endif
132 #endif
133