williamr@2: // Copyright David Abrahams 2003. williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: #ifndef ITERATOR_TRAITS_DWA200347_HPP williamr@2: # define ITERATOR_TRAITS_DWA200347_HPP williamr@2: williamr@2: # include williamr@2: # include williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: // Unfortunately, g++ 2.95.x chokes when we define a class template williamr@2: // iterator_category which has the same name as its williamr@2: // std::iterator_category() function, probably due in part to the williamr@2: // "std:: is visible globally" hack it uses. Use williamr@2: // BOOST_ITERATOR_CATEGORY to write code that's portable to older williamr@2: // GCCs. williamr@2: williamr@2: # if BOOST_WORKAROUND(__GNUC__, <= 2) williamr@2: # define BOOST_ITERATOR_CATEGORY iterator_category_ williamr@2: # else williamr@2: # define BOOST_ITERATOR_CATEGORY iterator_category williamr@2: # endif williamr@2: williamr@2: williamr@2: template williamr@2: struct iterator_value williamr@2: { williamr@2: typedef typename detail::iterator_traits::value_type type; williamr@2: }; williamr@2: williamr@2: template williamr@2: struct iterator_reference williamr@2: { williamr@2: typedef typename detail::iterator_traits::reference type; williamr@2: }; williamr@2: williamr@2: williamr@2: template williamr@2: struct iterator_pointer williamr@2: { williamr@2: typedef typename detail::iterator_traits::pointer type; williamr@2: }; williamr@2: williamr@2: template williamr@2: struct iterator_difference williamr@2: { williamr@2: typedef typename detail::iterator_traits::difference_type type; williamr@2: }; williamr@2: williamr@2: template williamr@2: struct BOOST_ITERATOR_CATEGORY williamr@2: { williamr@2: typedef typename detail::iterator_traits::iterator_category type; williamr@2: }; williamr@2: williamr@2: # if BOOST_WORKAROUND(BOOST_MSVC, < 1300) williamr@2: template <> williamr@2: struct iterator_value williamr@2: { williamr@2: typedef void type; williamr@2: }; williamr@2: williamr@2: template <> williamr@2: struct iterator_reference williamr@2: { williamr@2: typedef void type; williamr@2: }; williamr@2: williamr@2: template <> williamr@2: struct iterator_pointer williamr@2: { williamr@2: typedef void type; williamr@2: }; williamr@2: williamr@2: template <> williamr@2: struct iterator_difference williamr@2: { williamr@2: typedef void type; williamr@2: }; williamr@2: williamr@2: template <> williamr@2: struct BOOST_ITERATOR_CATEGORY williamr@2: { williamr@2: typedef void type; williamr@2: }; williamr@2: # endif williamr@2: williamr@2: } // namespace boost::iterator williamr@2: williamr@2: #endif // ITERATOR_TRAITS_DWA200347_HPP