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