diff --git a/include/boost/detail/iterator.hpp b/include/boost/detail/iterator.hpp index af238af..9f71a24 100644 --- a/include/boost/detail/iterator.hpp +++ b/include/boost/detail/iterator.hpp @@ -28,6 +28,9 @@ // See http://www.boost.org for most recent version including documentation. // Revision History +// 03 Mar 2001 - Put all implementation into namespace +// boost::detail::iterator_traits_. Some progress made on fixes +// for Intel compiler. (David Abrahams) // 02 Mar 2001 - Changed BOOST_MSVC to BOOST_MSVC_STD_ITERATOR in a few // places. (Jeremy Siek) // 19 Feb 2001 - Improved workarounds for stock MSVC6; use yes_type and @@ -58,7 +61,7 @@ # include # include -# if defined(BOOST_MSVC) && !defined(__SGI_STL_PORT) +# if defined(BOOST_MSVC_STD_ITERATOR) # include # include # include @@ -88,6 +91,8 @@ using std::iterator_traits; using std::distance; # else +namespace iterator_traits_ { + // Workarounds for less-capable implementations template struct iterator_traits_select; @@ -111,7 +116,11 @@ template <> struct iterator_traits_select }; +typedef char yes_type; +typedef double no_type; + # ifdef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF + no_type bad_category_helper(...); template yes_type bad_category_helper(std::_DBG_iter*); @@ -245,11 +254,11 @@ no_type is_boost_iterator_helper(...); // Is the iterator one of the known mutable container iterators? template -yes_type is_mutable_iterator_helper(const volatile std::_Tree::iterator*); +yes_type is_mutable_iterator_helper(const volatile typename std::_Tree::iterator*); template -yes_type is_mutable_iterator_helper(const volatile std::list::iterator*); +yes_type is_mutable_iterator_helper(const volatile typename std::list::iterator*); template -yes_type is_mutable_iterator_helper(const volatile std::deque::iterator*); +yes_type is_mutable_iterator_helper(const volatile typename std::deque::iterator*); no_type is_mutable_iterator_helper(...); // Is the iterator an ostream_iterator? @@ -257,9 +266,15 @@ template yes_type is_ostream_iterator_helper(const volatile std::ostream_iterator*); no_type is_ostream_iterator_helper(...); +#ifdef __ICL +template struct check; +template <> struct check {}; +check<(sizeof(is_std_iterator_helper((std::istream_iterator*)0)) == sizeof(yes_type))> assertion; +#endif + template struct msvc_iterator_classification { - enum { + BOOST_STATIC_CONSTANT(unsigned, value = (sizeof(is_ostream_iterator_helper((T*)0)) == sizeof(yes_type)) ? msvc_stdlib_ostream_iterator : (sizeof(is_mutable_iterator_helper((T*)0)) == sizeof(yes_type)) @@ -268,7 +283,7 @@ struct msvc_iterator_classification { && sizeof(is_boost_iterator_helper((T*)0)) == sizeof(no_type)) ? msvc_stdlib_const_iterator : not_msvc_stdlib_iterator - }; + ); }; # endif @@ -313,12 +328,14 @@ template <> struct iterator_traits_select }; }; +} // namespace boost::detail::iterator_traits_ + template struct iterator_traits - : iterator_traits_select::value>::template traits + : iterator_traits_::iterator_traits_select::value>::template traits { private: - typedef typename iterator_traits_select< + typedef typename iterator_traits_::iterator_traits_select< is_pointer::type>::value>::template traits traits; public: // Why do I need to define these typedefs? It keeps MSVC happy somehow. @@ -327,6 +344,8 @@ struct iterator_traits typedef typename traits::iterator_category iterator_category; }; +namespace iterator_traits_ { + template struct distance_select { template @@ -353,16 +372,18 @@ struct distance_select { } }; +} // namespace boost::detail::iterator_traits_ + template inline typename ::boost::detail::iterator_traits::difference_type distance(const Iterator& first, const Iterator& last) { typedef typename ::boost::detail::iterator_traits::iterator_category iterator_category; - return distance_select::distance(first, last); + return iterator_traits_::distance_select::distance(first, last); } # endif // workarounds -}} +}} // namespace boost::detail # undef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF # undef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION