annotate DEPENDENCIES/generic/include/boost/detail/iterator.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 // (C) Copyright David Abrahams 2002.
Chris@16 2 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 3 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 4 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 5
Chris@16 6 // Boost versions of
Chris@16 7 //
Chris@16 8 // std::iterator_traits<>::iterator_category
Chris@16 9 // std::iterator_traits<>::difference_type
Chris@16 10 // std::distance()
Chris@16 11 //
Chris@16 12 // ...for all compilers and iterators
Chris@16 13 //
Chris@16 14 // Additionally, if X is a pointer
Chris@16 15 // std::iterator_traits<X>::pointer
Chris@16 16
Chris@16 17 // Otherwise, if partial specialization is supported or X is not a pointer
Chris@16 18 // std::iterator_traits<X>::value_type
Chris@16 19 // std::iterator_traits<X>::pointer
Chris@16 20 // std::iterator_traits<X>::reference
Chris@16 21 //
Chris@16 22 // See http://www.boost.org for most recent version including documentation.
Chris@16 23
Chris@16 24 // Revision History
Chris@16 25 // 04 Mar 2001 - More attempted fixes for Intel C++ (David Abrahams)
Chris@16 26 // 03 Mar 2001 - Put all implementation into namespace
Chris@16 27 // boost::detail::iterator_traits_. Some progress made on fixes
Chris@16 28 // for Intel compiler. (David Abrahams)
Chris@16 29 // 02 Mar 2001 - Changed BOOST_MSVC to BOOST_MSVC_STD_ITERATOR in a few
Chris@16 30 // places. (Jeremy Siek)
Chris@16 31 // 19 Feb 2001 - Improved workarounds for stock MSVC6; use yes_type and
Chris@16 32 // no_type from type_traits.hpp; stopped trying to remove_cv
Chris@16 33 // before detecting is_pointer, in honor of the new type_traits
Chris@16 34 // semantics. (David Abrahams)
Chris@16 35 // 13 Feb 2001 - Make it work with nearly all standard-conforming iterators
Chris@16 36 // under raw VC6. The one category remaining which will fail is
Chris@16 37 // that of iterators derived from std::iterator but not
Chris@16 38 // boost::iterator and which redefine difference_type.
Chris@16 39 // 11 Feb 2001 - Clean away code which can never be used (David Abrahams)
Chris@16 40 // 09 Feb 2001 - Always have a definition for each traits member, even if it
Chris@16 41 // can't be properly deduced. These will be incomplete types in
Chris@16 42 // some cases (undefined<void>), but it helps suppress MSVC errors
Chris@16 43 // elsewhere (David Abrahams)
Chris@16 44 // 07 Feb 2001 - Support for more of the traits members where possible, making
Chris@16 45 // this useful as a replacement for std::iterator_traits<T> when
Chris@16 46 // used as a default template parameter.
Chris@16 47 // 06 Feb 2001 - Removed useless #includes of standard library headers
Chris@16 48 // (David Abrahams)
Chris@16 49
Chris@16 50 #ifndef ITERATOR_DWA122600_HPP_
Chris@16 51 # define ITERATOR_DWA122600_HPP_
Chris@16 52
Chris@16 53 # include <boost/config.hpp>
Chris@16 54 # include <iterator>
Chris@16 55
Chris@16 56 // STLPort 4.0 and betas have a bug when debugging is enabled and there is no
Chris@16 57 // partial specialization: instead of an iterator_category typedef, the standard
Chris@16 58 // container iterators have _Iterator_category.
Chris@16 59 //
Chris@16 60 // Also, whether debugging is enabled or not, there is a broken specialization
Chris@16 61 // of std::iterator<output_iterator_tag,void,void,void,void> which has no
Chris@16 62 // typedefs but iterator_category.
Chris@16 63 # if defined(__SGI_STL_PORT)
Chris@16 64
Chris@16 65 # if (__SGI_STL_PORT <= 0x410) && !defined(__STL_CLASS_PARTIAL_SPECIALIZATION) && defined(__STL_DEBUG)
Chris@16 66 # define BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF
Chris@16 67 # endif
Chris@16 68
Chris@16 69 # define BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION
Chris@16 70
Chris@16 71 # endif // STLPort <= 4.1b4 && no partial specialization
Chris@16 72
Chris@16 73 # if !defined(BOOST_NO_STD_ITERATOR_TRAITS) \
Chris@16 74 && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
Chris@16 75 && !defined(BOOST_MSVC_STD_ITERATOR)
Chris@16 76
Chris@16 77 namespace boost { namespace detail {
Chris@16 78
Chris@16 79 // Define a new template so it can be specialized
Chris@16 80 template <class Iterator>
Chris@16 81 struct iterator_traits
Chris@16 82 : std::iterator_traits<Iterator>
Chris@16 83 {};
Chris@16 84 using std::distance;
Chris@16 85
Chris@16 86 }} // namespace boost::detail
Chris@16 87
Chris@16 88 # else
Chris@16 89
Chris@16 90 # if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
Chris@16 91 && !defined(BOOST_MSVC_STD_ITERATOR)
Chris@16 92
Chris@16 93 // This is the case where everything conforms except BOOST_NO_STD_ITERATOR_TRAITS
Chris@16 94
Chris@16 95 namespace boost { namespace detail {
Chris@16 96
Chris@16 97 // Rogue Wave Standard Library fools itself into thinking partial
Chris@16 98 // specialization is missing on some platforms (e.g. Sun), so fails to
Chris@16 99 // supply iterator_traits!
Chris@16 100 template <class Iterator>
Chris@16 101 struct iterator_traits
Chris@16 102 {
Chris@16 103 typedef typename Iterator::value_type value_type;
Chris@16 104 typedef typename Iterator::reference reference;
Chris@16 105 typedef typename Iterator::pointer pointer;
Chris@16 106 typedef typename Iterator::difference_type difference_type;
Chris@16 107 typedef typename Iterator::iterator_category iterator_category;
Chris@16 108 };
Chris@16 109
Chris@16 110 template <class T>
Chris@16 111 struct iterator_traits<T*>
Chris@16 112 {
Chris@16 113 typedef T value_type;
Chris@16 114 typedef T& reference;
Chris@16 115 typedef T* pointer;
Chris@16 116 typedef std::ptrdiff_t difference_type;
Chris@16 117 typedef std::random_access_iterator_tag iterator_category;
Chris@16 118 };
Chris@16 119
Chris@16 120 template <class T>
Chris@16 121 struct iterator_traits<T const*>
Chris@16 122 {
Chris@16 123 typedef T value_type;
Chris@16 124 typedef T const& reference;
Chris@16 125 typedef T const* pointer;
Chris@16 126 typedef std::ptrdiff_t difference_type;
Chris@16 127 typedef std::random_access_iterator_tag iterator_category;
Chris@16 128 };
Chris@16 129
Chris@16 130 }} // namespace boost::detail
Chris@16 131
Chris@16 132 # else
Chris@16 133
Chris@16 134 # include <boost/type_traits/remove_const.hpp>
Chris@16 135 # include <boost/type_traits/detail/yes_no_type.hpp>
Chris@16 136 # include <boost/type_traits/is_pointer.hpp>
Chris@16 137
Chris@16 138 # ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 139 # include <boost/type_traits/is_same.hpp>
Chris@16 140 # include <boost/type_traits/remove_pointer.hpp>
Chris@16 141 # endif
Chris@16 142 # ifdef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION
Chris@16 143 # include <boost/type_traits/is_base_and_derived.hpp>
Chris@16 144 # endif
Chris@16 145
Chris@16 146 # include <boost/mpl/if.hpp>
Chris@16 147 # include <boost/mpl/has_xxx.hpp>
Chris@16 148 # include <cstddef>
Chris@16 149
Chris@16 150 // should be the last #include
Chris@16 151 # include "boost/type_traits/detail/bool_trait_def.hpp"
Chris@16 152
Chris@16 153 namespace boost { namespace detail {
Chris@16 154
Chris@16 155 BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type)
Chris@16 156 BOOST_MPL_HAS_XXX_TRAIT_DEF(reference)
Chris@16 157 BOOST_MPL_HAS_XXX_TRAIT_DEF(pointer)
Chris@16 158 BOOST_MPL_HAS_XXX_TRAIT_DEF(difference_type)
Chris@16 159 BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator_category)
Chris@16 160
Chris@16 161 // is_mutable_iterator --
Chris@16 162 //
Chris@16 163 // A metafunction returning true iff T is a mutable iterator type
Chris@16 164 // with a nested value_type. Will only work portably with iterators
Chris@16 165 // whose operator* returns a reference, but that seems to be OK for
Chris@16 166 // the iterators supplied by Dinkumware. Some input iterators may
Chris@16 167 // compile-time if they arrive here, and if the compiler is strict
Chris@16 168 // about not taking the address of an rvalue.
Chris@16 169
Chris@16 170 // This one detects ordinary mutable iterators - the result of
Chris@16 171 // operator* is convertible to the value_type.
Chris@16 172 template <class T>
Chris@16 173 type_traits::yes_type is_mutable_iterator_helper(T const*, BOOST_DEDUCED_TYPENAME T::value_type*);
Chris@16 174
Chris@16 175 // Since you can't take the address of an rvalue, the guts of
Chris@16 176 // is_mutable_iterator_impl will fail if we use &*t directly. This
Chris@16 177 // makes sure we can still work with non-lvalue iterators.
Chris@16 178 template <class T> T* mutable_iterator_lvalue_helper(T& x);
Chris@16 179 int mutable_iterator_lvalue_helper(...);
Chris@16 180
Chris@16 181
Chris@16 182 // This one detects output iterators such as ostream_iterator which
Chris@16 183 // return references to themselves.
Chris@16 184 template <class T>
Chris@16 185 type_traits::yes_type is_mutable_iterator_helper(T const*, T const*);
Chris@16 186
Chris@16 187 type_traits::no_type is_mutable_iterator_helper(...);
Chris@16 188
Chris@16 189 template <class T>
Chris@16 190 struct is_mutable_iterator_impl
Chris@16 191 {
Chris@16 192 static T t;
Chris@16 193
Chris@16 194 BOOST_STATIC_CONSTANT(
Chris@16 195 bool, value = sizeof(
Chris@16 196 detail::is_mutable_iterator_helper(
Chris@16 197 (T*)0
Chris@16 198 , mutable_iterator_lvalue_helper(*t) // like &*t
Chris@16 199 ))
Chris@16 200 == sizeof(type_traits::yes_type)
Chris@16 201 );
Chris@16 202 };
Chris@16 203
Chris@16 204 BOOST_TT_AUX_BOOL_TRAIT_DEF1(
Chris@16 205 is_mutable_iterator,T,::boost::detail::is_mutable_iterator_impl<T>::value)
Chris@16 206
Chris@16 207
Chris@16 208 // is_full_iterator_traits --
Chris@16 209 //
Chris@16 210 // A metafunction returning true iff T has all the requisite nested
Chris@16 211 // types to satisfy the requirements for a fully-conforming
Chris@16 212 // iterator_traits implementation.
Chris@16 213 template <class T>
Chris@16 214 struct is_full_iterator_traits_impl
Chris@16 215 {
Chris@16 216 enum { value =
Chris@16 217 has_value_type<T>::value
Chris@16 218 & has_reference<T>::value
Chris@16 219 & has_pointer<T>::value
Chris@16 220 & has_difference_type<T>::value
Chris@16 221 & has_iterator_category<T>::value
Chris@16 222 };
Chris@16 223 };
Chris@16 224
Chris@16 225 BOOST_TT_AUX_BOOL_TRAIT_DEF1(
Chris@16 226 is_full_iterator_traits,T,::boost::detail::is_full_iterator_traits_impl<T>::value)
Chris@16 227
Chris@16 228
Chris@16 229 # ifdef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF
Chris@16 230 BOOST_MPL_HAS_XXX_TRAIT_DEF(_Iterator_category)
Chris@16 231
Chris@16 232 // is_stlport_40_debug_iterator --
Chris@16 233 //
Chris@16 234 // A metafunction returning true iff T has all the requisite nested
Chris@16 235 // types to satisfy the requirements of an STLPort 4.0 debug iterator
Chris@16 236 // iterator_traits implementation.
Chris@16 237 template <class T>
Chris@16 238 struct is_stlport_40_debug_iterator_impl
Chris@16 239 {
Chris@16 240 enum { value =
Chris@16 241 has_value_type<T>::value
Chris@16 242 & has_reference<T>::value
Chris@16 243 & has_pointer<T>::value
Chris@16 244 & has_difference_type<T>::value
Chris@16 245 & has__Iterator_category<T>::value
Chris@16 246 };
Chris@16 247 };
Chris@16 248
Chris@16 249 BOOST_TT_AUX_BOOL_TRAIT_DEF1(
Chris@16 250 is_stlport_40_debug_iterator,T,::boost::detail::is_stlport_40_debug_iterator_impl<T>::value)
Chris@16 251
Chris@16 252 template <class T>
Chris@16 253 struct stlport_40_debug_iterator_traits
Chris@16 254 {
Chris@16 255 typedef typename T::value_type value_type;
Chris@16 256 typedef typename T::reference reference;
Chris@16 257 typedef typename T::pointer pointer;
Chris@16 258 typedef typename T::difference_type difference_type;
Chris@16 259 typedef typename T::_Iterator_category iterator_category;
Chris@16 260 };
Chris@16 261 # endif // BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF
Chris@16 262
Chris@16 263 template <class T> struct pointer_iterator_traits;
Chris@16 264
Chris@16 265 # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 266 template <class T>
Chris@16 267 struct pointer_iterator_traits<T*>
Chris@16 268 {
Chris@16 269 typedef typename remove_const<T>::type value_type;
Chris@16 270 typedef T* pointer;
Chris@16 271 typedef T& reference;
Chris@16 272 typedef std::random_access_iterator_tag iterator_category;
Chris@16 273 typedef std::ptrdiff_t difference_type;
Chris@16 274 };
Chris@16 275 # else
Chris@16 276
Chris@16 277 // In case of no template partial specialization, and if T is a
Chris@16 278 // pointer, iterator_traits<T>::value_type can still be computed. For
Chris@16 279 // some basic types, remove_pointer is manually defined in
Chris@16 280 // type_traits/broken_compiler_spec.hpp. For others, do it yourself.
Chris@16 281
Chris@16 282 template<class P> class please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee;
Chris@16 283
Chris@16 284 template<class P>
Chris@16 285 struct pointer_value_type
Chris@16 286 : mpl::if_<
Chris@16 287 is_same<P, typename remove_pointer<P>::type>
Chris@16 288 , please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee<P>
Chris@16 289 , typename remove_const<
Chris@16 290 typename remove_pointer<P>::type
Chris@16 291 >::type
Chris@16 292 >
Chris@16 293 {
Chris@16 294 };
Chris@16 295
Chris@16 296
Chris@16 297 template<class P>
Chris@16 298 struct pointer_reference
Chris@16 299 : mpl::if_<
Chris@16 300 is_same<P, typename remove_pointer<P>::type>
Chris@16 301 , please_invoke_BOOST_TT_BROKEN_COMPILER_SPEC_on_cv_unqualified_pointee<P>
Chris@16 302 , typename remove_pointer<P>::type&
Chris@16 303 >
Chris@16 304 {
Chris@16 305 };
Chris@16 306
Chris@16 307 template <class T>
Chris@16 308 struct pointer_iterator_traits
Chris@16 309 {
Chris@16 310 typedef T pointer;
Chris@16 311 typedef std::random_access_iterator_tag iterator_category;
Chris@16 312 typedef std::ptrdiff_t difference_type;
Chris@16 313
Chris@16 314 typedef typename pointer_value_type<T>::type value_type;
Chris@16 315 typedef typename pointer_reference<T>::type reference;
Chris@16 316 };
Chris@16 317
Chris@16 318 # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 319
Chris@16 320 // We'll sort iterator types into one of these classifications, from which we
Chris@16 321 // can determine the difference_type, pointer, reference, and value_type
Chris@16 322 template <class Iterator>
Chris@16 323 struct standard_iterator_traits
Chris@16 324 {
Chris@16 325 typedef typename Iterator::difference_type difference_type;
Chris@16 326 typedef typename Iterator::value_type value_type;
Chris@16 327 typedef typename Iterator::pointer pointer;
Chris@16 328 typedef typename Iterator::reference reference;
Chris@16 329 typedef typename Iterator::iterator_category iterator_category;
Chris@16 330 };
Chris@16 331
Chris@16 332 template <class Iterator>
Chris@16 333 struct msvc_stdlib_mutable_traits
Chris@16 334 : std::iterator_traits<Iterator>
Chris@16 335 {
Chris@16 336 typedef typename std::iterator_traits<Iterator>::distance_type difference_type;
Chris@16 337 typedef typename std::iterator_traits<Iterator>::value_type* pointer;
Chris@16 338 typedef typename std::iterator_traits<Iterator>::value_type& reference;
Chris@16 339 };
Chris@16 340
Chris@16 341 template <class Iterator>
Chris@16 342 struct msvc_stdlib_const_traits
Chris@16 343 : std::iterator_traits<Iterator>
Chris@16 344 {
Chris@16 345 typedef typename std::iterator_traits<Iterator>::distance_type difference_type;
Chris@16 346 typedef const typename std::iterator_traits<Iterator>::value_type* pointer;
Chris@16 347 typedef const typename std::iterator_traits<Iterator>::value_type& reference;
Chris@16 348 };
Chris@16 349
Chris@16 350 # ifdef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION
Chris@16 351 template <class Iterator>
Chris@16 352 struct is_bad_output_iterator
Chris@16 353 : is_base_and_derived<
Chris@16 354 std::iterator<std::output_iterator_tag,void,void,void,void>
Chris@16 355 , Iterator>
Chris@16 356 {
Chris@16 357 };
Chris@16 358
Chris@16 359 struct bad_output_iterator_traits
Chris@16 360 {
Chris@16 361 typedef void value_type;
Chris@16 362 typedef void difference_type;
Chris@16 363 typedef std::output_iterator_tag iterator_category;
Chris@16 364 typedef void pointer;
Chris@16 365 typedef void reference;
Chris@16 366 };
Chris@16 367 # endif
Chris@16 368
Chris@16 369 // If we're looking at an MSVC6 (old Dinkumware) ``standard''
Chris@16 370 // iterator, this will generate an appropriate traits class.
Chris@16 371 template <class Iterator>
Chris@16 372 struct msvc_stdlib_iterator_traits
Chris@16 373 : mpl::if_<
Chris@16 374 is_mutable_iterator<Iterator>
Chris@16 375 , msvc_stdlib_mutable_traits<Iterator>
Chris@16 376 , msvc_stdlib_const_traits<Iterator>
Chris@16 377 >::type
Chris@16 378 {};
Chris@16 379
Chris@16 380 template <class Iterator>
Chris@16 381 struct non_pointer_iterator_traits
Chris@16 382 : mpl::if_<
Chris@16 383 // if the iterator contains all the right nested types...
Chris@16 384 is_full_iterator_traits<Iterator>
Chris@16 385 // Use a standard iterator_traits implementation
Chris@16 386 , standard_iterator_traits<Iterator>
Chris@16 387 # ifdef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF
Chris@16 388 // Check for STLPort 4.0 broken _Iterator_category type
Chris@16 389 , mpl::if_<
Chris@16 390 is_stlport_40_debug_iterator<Iterator>
Chris@16 391 , stlport_40_debug_iterator_traits<Iterator>
Chris@16 392 # endif
Chris@16 393 // Otherwise, assume it's a Dinkum iterator
Chris@16 394 , msvc_stdlib_iterator_traits<Iterator>
Chris@16 395 # ifdef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF
Chris@16 396 >::type
Chris@16 397 # endif
Chris@16 398 >::type
Chris@16 399 {
Chris@16 400 };
Chris@16 401
Chris@16 402 template <class Iterator>
Chris@16 403 struct iterator_traits_aux
Chris@16 404 : mpl::if_<
Chris@16 405 is_pointer<Iterator>
Chris@16 406 , pointer_iterator_traits<Iterator>
Chris@16 407 , non_pointer_iterator_traits<Iterator>
Chris@16 408 >::type
Chris@16 409 {
Chris@16 410 };
Chris@16 411
Chris@16 412 template <class Iterator>
Chris@16 413 struct iterator_traits
Chris@16 414 {
Chris@16 415 // Explicit forwarding from base class needed to keep MSVC6 happy
Chris@16 416 // under some circumstances.
Chris@16 417 private:
Chris@16 418 # ifdef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION
Chris@16 419 typedef
Chris@16 420 typename mpl::if_<
Chris@16 421 is_bad_output_iterator<Iterator>
Chris@16 422 , bad_output_iterator_traits
Chris@16 423 , iterator_traits_aux<Iterator>
Chris@16 424 >::type base;
Chris@16 425 # else
Chris@16 426 typedef iterator_traits_aux<Iterator> base;
Chris@16 427 # endif
Chris@16 428 public:
Chris@16 429 typedef typename base::value_type value_type;
Chris@16 430 typedef typename base::pointer pointer;
Chris@16 431 typedef typename base::reference reference;
Chris@16 432 typedef typename base::difference_type difference_type;
Chris@16 433 typedef typename base::iterator_category iterator_category;
Chris@16 434 };
Chris@16 435
Chris@16 436 // This specialization cuts off ETI (Early Template Instantiation) for MSVC.
Chris@16 437 template <> struct iterator_traits<int>
Chris@16 438 {
Chris@16 439 typedef int value_type;
Chris@16 440 typedef int pointer;
Chris@16 441 typedef int reference;
Chris@16 442 typedef int difference_type;
Chris@16 443 typedef int iterator_category;
Chris@16 444 };
Chris@16 445
Chris@16 446 }} // namespace boost::detail
Chris@16 447
Chris@16 448 # endif // workarounds
Chris@16 449
Chris@16 450 namespace boost { namespace detail {
Chris@16 451
Chris@16 452 namespace iterator_traits_
Chris@16 453 {
Chris@16 454 template <class Iterator, class Difference>
Chris@16 455 struct distance_select
Chris@16 456 {
Chris@16 457 static Difference execute(Iterator i1, const Iterator i2, ...)
Chris@16 458 {
Chris@16 459 Difference result = 0;
Chris@16 460 while (i1 != i2)
Chris@16 461 {
Chris@16 462 ++i1;
Chris@16 463 ++result;
Chris@16 464 }
Chris@16 465 return result;
Chris@16 466 }
Chris@16 467
Chris@16 468 static Difference execute(Iterator i1, const Iterator i2, std::random_access_iterator_tag*)
Chris@16 469 {
Chris@16 470 return i2 - i1;
Chris@16 471 }
Chris@16 472 };
Chris@16 473 } // namespace boost::detail::iterator_traits_
Chris@16 474
Chris@16 475 template <class Iterator>
Chris@16 476 inline typename iterator_traits<Iterator>::difference_type
Chris@16 477 distance(Iterator first, Iterator last)
Chris@16 478 {
Chris@16 479 typedef typename iterator_traits<Iterator>::difference_type diff_t;
Chris@16 480 typedef typename ::boost::detail::iterator_traits<Iterator>::iterator_category iterator_category;
Chris@16 481
Chris@16 482 return iterator_traits_::distance_select<Iterator,diff_t>::execute(
Chris@16 483 first, last, (iterator_category*)0);
Chris@16 484 }
Chris@16 485
Chris@16 486 }}
Chris@16 487
Chris@16 488 # endif
Chris@16 489
Chris@16 490
Chris@16 491 # undef BOOST_BAD_CONTAINER_ITERATOR_CATEGORY_TYPEDEF
Chris@16 492 # undef BOOST_BAD_OUTPUT_ITERATOR_SPECIALIZATION
Chris@16 493
Chris@16 494 #endif // ITERATOR_DWA122600_HPP_