annotate DEPENDENCIES/generic/include/boost/range/detail/microsoft.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 #ifndef BOOST_RANGE_DETAIL_MICROSOFT_HPP
Chris@16 2 #define BOOST_RANGE_DETAIL_MICROSOFT_HPP
Chris@16 3
Chris@16 4 // Boost.Range MFC/ATL Extension
Chris@16 5 //
Chris@16 6 // Copyright Shunsuke Sogame 2005-2006.
Chris@16 7 // Distributed under the Boost Software License, Version 1.0.
Chris@16 8 // (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 9 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 10
Chris@16 11
Chris@16 12
Chris@16 13
Chris@16 14 // config
Chris@16 15 //
Chris@16 16
Chris@16 17
Chris@16 18 #include <boost/range/iterator.hpp>
Chris@16 19
Chris@16 20
Chris@16 21 #define BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1 1
Chris@16 22
Chris@16 23
Chris@16 24 #if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
Chris@16 25 #define BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator range_mutable_iterator
Chris@16 26 #define BOOST_RANGE_DETAIL_MICROSOFT_range_begin range_begin
Chris@16 27 #define BOOST_RANGE_DETAIL_MICROSOFT_range_end range_end
Chris@16 28 #else
Chris@16 29 #define BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator range_mutable_iterator
Chris@16 30 #define BOOST_RANGE_DETAIL_MICROSOFT_range_begin range_begin
Chris@16 31 #define BOOST_RANGE_DETAIL_MICROSOFT_range_end range_end
Chris@16 32 #endif
Chris@16 33
Chris@16 34
Chris@16 35
Chris@16 36
Chris@16 37 // yet another customization way
Chris@16 38 //
Chris@16 39
Chris@16 40
Chris@16 41 #include <boost/iterator/iterator_traits.hpp> // iterator_difference
Chris@16 42 #include <boost/mpl/identity.hpp>
Chris@16 43 #include <boost/mpl/if.hpp>
Chris@16 44 #include <boost/preprocessor/cat.hpp>
Chris@16 45 #include <boost/preprocessor/control/iif.hpp>
Chris@16 46 #include <boost/preprocessor/comma_if.hpp>
Chris@16 47 #include <boost/preprocessor/detail/is_unary.hpp>
Chris@16 48 #include <boost/preprocessor/list/for_each.hpp>
Chris@16 49 #include <boost/preprocessor/repetition/enum_params.hpp>
Chris@16 50 #include <boost/preprocessor/repetition/repeat.hpp>
Chris@16 51 #include <boost/preprocessor/seq/for_each_i.hpp>
Chris@16 52 #include <boost/preprocessor/seq/size.hpp>
Chris@16 53 #include <boost/preprocessor/tuple/eat.hpp>
Chris@16 54 #include <boost/range/const_iterator.hpp>
Chris@16 55 #include <boost/range/size_type.hpp>
Chris@16 56 #include <boost/type_traits/is_const.hpp>
Chris@16 57 #include <boost/type_traits/is_same.hpp>
Chris@16 58 #include <boost/type_traits/remove_cv.hpp>
Chris@16 59 #include <boost/utility/addressof.hpp>
Chris@16 60 #include <boost/utility/enable_if.hpp> // disable_if
Chris@16 61
Chris@16 62 #if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
Chris@16 63 #include <boost/range/mutable_iterator.hpp>
Chris@16 64 #else
Chris@16 65 #include <iterator> // distance
Chris@16 66 #include <boost/range/begin.hpp>
Chris@16 67 #include <boost/range/end.hpp>
Chris@16 68 #include <boost/range/iterator.hpp>
Chris@16 69 #endif
Chris@16 70
Chris@16 71
Chris@16 72 namespace boost { namespace range_detail_microsoft {
Chris@16 73
Chris@16 74
Chris@16 75 // customization point
Chris@16 76 //
Chris@16 77
Chris@16 78 template< class Tag >
Chris@16 79 struct customization;
Chris@16 80
Chris@16 81
Chris@16 82 template< class T >
Chris@16 83 struct customization_tag;
Chris@16 84
Chris@16 85
Chris@16 86 struct using_type_as_tag
Chris@16 87 { };
Chris@16 88
Chris@16 89
Chris@16 90 // Topic:
Chris@16 91 // In fact, it is unnecessary for VC++.
Chris@16 92 // VC++'s behavior seems conforming, while GCC fails without this.
Chris@16 93 template< class Iterator, class T >
Chris@16 94 struct mutable_ :
Chris@16 95 disable_if< is_const<T>, Iterator >
Chris@16 96 { };
Chris@16 97
Chris@16 98
Chris@16 99 // helpers
Chris@16 100 //
Chris@16 101
Chris@16 102 template< class Tag, class T >
Chris@16 103 struct customization_tag_of
Chris@16 104 {
Chris@16 105 typedef typename mpl::if_< is_same<using_type_as_tag, Tag>,
Chris@16 106 T,
Chris@16 107 Tag
Chris@16 108 >::type type;
Chris@16 109 };
Chris@16 110
Chris@16 111
Chris@16 112 template< class T >
Chris@16 113 struct customization_of
Chris@16 114 {
Chris@16 115 typedef typename remove_cv<T>::type bare_t;
Chris@16 116 typedef typename customization_tag<bare_t>::type tag_t;
Chris@16 117 typedef customization<tag_t> type;
Chris@16 118 };
Chris@16 119
Chris@16 120
Chris@16 121 template< class T >
Chris@16 122 struct mutable_iterator_of
Chris@16 123 {
Chris@16 124 typedef typename remove_cv<T>::type bare_t;
Chris@16 125 typedef typename customization_of<bare_t>::type cust_t;
Chris@16 126 typedef typename cust_t::template meta<bare_t>::mutable_iterator type;
Chris@16 127 };
Chris@16 128
Chris@16 129
Chris@16 130 template< class T >
Chris@16 131 struct const_iterator_of
Chris@16 132 {
Chris@16 133 typedef typename remove_cv<T>::type bare_t;
Chris@16 134 typedef typename customization_of<bare_t>::type cust_t;
Chris@16 135 typedef typename cust_t::template meta<bare_t>::const_iterator type;
Chris@16 136 };
Chris@16 137
Chris@16 138
Chris@16 139 template< class T >
Chris@16 140 struct size_type_of
Chris@16 141 {
Chris@16 142 typedef typename range_detail_microsoft::mutable_iterator_of<T>::type miter_t;
Chris@16 143 typedef typename iterator_difference<miter_t>::type type;
Chris@16 144 };
Chris@16 145
Chris@16 146
Chris@16 147 template< class T > inline
Chris@16 148 typename mutable_iterator_of<T>::type
Chris@16 149 begin_of(T& x)
Chris@16 150 {
Chris@16 151 typedef typename customization_of<T>::type cust_t;
Chris@16 152 return cust_t().template begin<typename mutable_iterator_of<T>::type>(x);
Chris@16 153 }
Chris@16 154
Chris@16 155
Chris@16 156 template< class T > inline
Chris@16 157 typename const_iterator_of<T>::type
Chris@16 158 begin_of(T const& x)
Chris@16 159 {
Chris@16 160 typedef typename customization_of<T>::type cust_t;
Chris@16 161 return cust_t().template begin<typename const_iterator_of<T>::type>(x);
Chris@16 162 }
Chris@16 163
Chris@16 164
Chris@16 165 template< class T > inline
Chris@16 166 typename mutable_iterator_of<T>::type
Chris@16 167 end_of(T& x)
Chris@16 168 {
Chris@16 169 typedef typename customization_of<T>::type cust_t;
Chris@16 170 return cust_t().template end<typename mutable_iterator_of<T>::type>(x);
Chris@16 171 }
Chris@16 172
Chris@16 173
Chris@16 174 template< class T > inline
Chris@16 175 typename const_iterator_of<T>::type
Chris@16 176 end_of(T const& x)
Chris@16 177 {
Chris@16 178 typedef typename customization_of<T>::type cust_t;
Chris@16 179 return cust_t().template end<typename const_iterator_of<T>::type>(x);
Chris@16 180 }
Chris@16 181
Chris@16 182
Chris@16 183 #if defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
Chris@16 184
Chris@16 185 template< class T > inline
Chris@16 186 typename size_type_of<T>::type
Chris@16 187 size_of(T const& x)
Chris@16 188 {
Chris@16 189 return std::distance(boost::begin(x), boost::end(x));
Chris@16 190 }
Chris@16 191
Chris@16 192 #endif
Chris@16 193
Chris@16 194
Chris@16 195 template< class Range >
Chris@16 196 struct compatible_mutable_iterator :
Chris@16 197 BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator<Range>
Chris@16 198 { };
Chris@16 199
Chris@16 200
Chris@16 201 } } // namespace boost::range_detail_microsoft
Chris@16 202
Chris@16 203
Chris@16 204 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open(NamespaceList) \
Chris@16 205 BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open_op, ~, NamespaceList) \
Chris@16 206 /**/
Chris@16 207
Chris@16 208 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open_op(r, data, elem) \
Chris@16 209 namespace elem { \
Chris@16 210 /**/
Chris@16 211
Chris@16 212
Chris@16 213 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close(NamespaceList) \
Chris@16 214 BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close_op, ~, NamespaceList) \
Chris@16 215 /**/
Chris@16 216
Chris@16 217 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close_op(r, data, elem) \
Chris@16 218 } \
Chris@16 219 /**/
Chris@16 220
Chris@16 221
Chris@16 222 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_expand_op(r, data, elem) \
Chris@16 223 :: elem \
Chris@16 224 /**/
Chris@16 225
Chris@16 226
Chris@16 227 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(Tag, NamespaceList, Name) \
Chris@16 228 namespace boost { namespace range_detail_microsoft { \
Chris@16 229 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_tag(Tag, BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
Chris@16 230 } } \
Chris@16 231 \
Chris@16 232 namespace boost { \
Chris@16 233 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_mutable_iterator(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
Chris@16 234 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_const_iterator(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
Chris@16 235 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size_type(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
Chris@16 236 } \
Chris@16 237 \
Chris@16 238 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open(NamespaceList) \
Chris@16 239 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
Chris@16 240 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin_const(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
Chris@16 241 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
Chris@16 242 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end_const(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
Chris@16 243 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
Chris@16 244 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close(NamespaceList) \
Chris@16 245 /**/
Chris@16 246
Chris@16 247
Chris@16 248 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name) \
Chris@16 249 BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_expand_op, ~, NamespaceList) :: Name \
Chris@16 250 /**/
Chris@16 251
Chris@16 252
Chris@16 253 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_tag(Tag, Fullname) \
Chris@16 254 template< > \
Chris@16 255 struct customization_tag< Fullname > : \
Chris@16 256 customization_tag_of< Tag, Fullname > \
Chris@16 257 { }; \
Chris@16 258 /**/
Chris@16 259
Chris@16 260
Chris@16 261 // metafunctions
Chris@16 262 //
Chris@16 263
Chris@16 264 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_mutable_iterator(Fullname) \
Chris@16 265 template< > \
Chris@16 266 struct BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator< Fullname > : \
Chris@16 267 range_detail_microsoft::mutable_iterator_of< Fullname > \
Chris@16 268 { }; \
Chris@16 269 /**/
Chris@16 270
Chris@16 271
Chris@16 272 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_const_iterator(Fullname) \
Chris@16 273 template< > \
Chris@16 274 struct range_const_iterator< Fullname > : \
Chris@16 275 range_detail_microsoft::const_iterator_of< Fullname > \
Chris@16 276 { }; \
Chris@16 277 /**/
Chris@16 278
Chris@16 279
Chris@16 280 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size_type(Fullname) \
Chris@16 281 template< > \
Chris@16 282 struct range_size< Fullname > : \
Chris@16 283 range_detail_microsoft::size_type_of< Fullname > \
Chris@16 284 { }; \
Chris@16 285 /**/
Chris@16 286
Chris@16 287
Chris@16 288 // functions
Chris@16 289 //
Chris@16 290
Chris@16 291 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin(Fullname) \
Chris@16 292 inline \
Chris@16 293 boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
Chris@16 294 BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname& x) \
Chris@16 295 { \
Chris@16 296 return boost::range_detail_microsoft::begin_of(x); \
Chris@16 297 } \
Chris@16 298 /**/
Chris@16 299
Chris@16 300
Chris@16 301 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin_const(Fullname) \
Chris@16 302 inline \
Chris@16 303 boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
Chris@16 304 BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname const& x) \
Chris@16 305 { \
Chris@16 306 return boost::range_detail_microsoft::begin_of(x); \
Chris@16 307 } \
Chris@16 308 /**/
Chris@16 309
Chris@16 310
Chris@16 311 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end(Fullname) \
Chris@16 312 inline \
Chris@16 313 boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
Chris@16 314 BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname& x) \
Chris@16 315 { \
Chris@16 316 return boost::range_detail_microsoft::end_of(x); \
Chris@16 317 } \
Chris@16 318 /**/
Chris@16 319
Chris@16 320
Chris@16 321 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end_const(Fullname) \
Chris@16 322 inline \
Chris@16 323 boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
Chris@16 324 BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname const& x) \
Chris@16 325 { \
Chris@16 326 return boost::range_detail_microsoft::end_of(x); \
Chris@16 327 } \
Chris@16 328 /**/
Chris@16 329
Chris@16 330
Chris@16 331 #if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
Chris@16 332
Chris@16 333 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size(Fullname) \
Chris@16 334 /**/
Chris@16 335
Chris@16 336 #else
Chris@16 337
Chris@16 338 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size(Fullname) \
Chris@16 339 inline \
Chris@16 340 boost::range_detail_microsoft::size_type_of< Fullname >::type \
Chris@16 341 boost_range_size(Fullname const& x) \
Chris@16 342 { \
Chris@16 343 return boost::range_detail_microsoft::size_of(x); \
Chris@16 344 } \
Chris@16 345 /**/
Chris@16 346
Chris@16 347 #endif
Chris@16 348
Chris@16 349
Chris@16 350 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(Tag, NamespaceList, Name, ParamSeqOrCount) \
Chris@16 351 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_impl( \
Chris@16 352 Tag, NamespaceList, Name, \
Chris@16 353 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq(ParamSeqOrCount) \
Chris@16 354 ) \
Chris@16 355 /**/
Chris@16 356
Chris@16 357 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq(ParamSeqOrCount) \
Chris@16 358 BOOST_PP_IIF(BOOST_PP_IS_UNARY(ParamSeqOrCount), \
Chris@16 359 ParamSeqOrCount BOOST_PP_TUPLE_EAT(3), \
Chris@16 360 BOOST_PP_REPEAT \
Chris@16 361 )(ParamSeqOrCount, BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq_op, ~) \
Chris@16 362 /**/
Chris@16 363
Chris@16 364 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq_op(z, n, _) \
Chris@16 365 (class) \
Chris@16 366 /**/
Chris@16 367
Chris@16 368
Chris@16 369 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_impl(Tag, NamespaceList, Name, ParamSeq) \
Chris@16 370 namespace boost { namespace range_detail_microsoft { \
Chris@16 371 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_tag( \
Chris@16 372 Tag, \
Chris@16 373 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
Chris@16 374 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
Chris@16 375 ) \
Chris@16 376 } } \
Chris@16 377 \
Chris@16 378 namespace boost { \
Chris@16 379 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_mutable_iterator( \
Chris@16 380 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
Chris@16 381 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
Chris@16 382 ) \
Chris@16 383 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_const_iterator( \
Chris@16 384 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
Chris@16 385 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
Chris@16 386 ) \
Chris@16 387 \
Chris@16 388 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size_type( \
Chris@16 389 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
Chris@16 390 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
Chris@16 391 ) \
Chris@16 392 } \
Chris@16 393 \
Chris@16 394 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open(NamespaceList) \
Chris@16 395 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin( \
Chris@16 396 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
Chris@16 397 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
Chris@16 398 ) \
Chris@16 399 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin_const( \
Chris@16 400 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
Chris@16 401 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
Chris@16 402 ) \
Chris@16 403 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end( \
Chris@16 404 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
Chris@16 405 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
Chris@16 406 ) \
Chris@16 407 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end_const( \
Chris@16 408 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
Chris@16 409 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
Chris@16 410 ) \
Chris@16 411 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size( \
Chris@16 412 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
Chris@16 413 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
Chris@16 414 ) \
Chris@16 415 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close(NamespaceList) \
Chris@16 416 /**/
Chris@16 417
Chris@16 418
Chris@16 419 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq) \
Chris@16 420 BOOST_PP_SEQ_FOR_EACH_I(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params_op, ~, ParamSeq) \
Chris@16 421 /**/
Chris@16 422
Chris@16 423 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params_op(r, data, i, elem) \
Chris@16 424 BOOST_PP_COMMA_IF(i) elem BOOST_PP_CAT(T, i) \
Chris@16 425 /**/
Chris@16 426
Chris@16 427
Chris@16 428 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
Chris@16 429 BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_expand_op, ~, NamespaceList) \
Chris@16 430 :: Name < BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(ParamSeq), T) > \
Chris@16 431 /**/
Chris@16 432
Chris@16 433
Chris@16 434 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_tag(Tag, Params, Fullname) \
Chris@16 435 template< Params > \
Chris@16 436 struct customization_tag< Fullname > : \
Chris@16 437 customization_tag_of< Tag, Fullname > \
Chris@16 438 { }; \
Chris@16 439 /**/
Chris@16 440
Chris@16 441
Chris@16 442 // metafunctions
Chris@16 443 //
Chris@16 444
Chris@16 445 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_mutable_iterator(Params, Fullname) \
Chris@16 446 template< Params > \
Chris@16 447 struct BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator< Fullname > : \
Chris@16 448 range_detail_microsoft::mutable_iterator_of< Fullname > \
Chris@16 449 { }; \
Chris@16 450 /**/
Chris@16 451
Chris@16 452
Chris@16 453 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_const_iterator(Params, Fullname) \
Chris@16 454 template< Params > \
Chris@16 455 struct range_const_iterator< Fullname > : \
Chris@16 456 range_detail_microsoft::const_iterator_of< Fullname > \
Chris@16 457 { }; \
Chris@16 458 /**/
Chris@16 459
Chris@16 460
Chris@16 461 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size_type(Params, Fullname) \
Chris@16 462 template< Params > \
Chris@16 463 struct range_size< Fullname > : \
Chris@16 464 range_detail_microsoft::size_type_of< Fullname > \
Chris@16 465 { }; \
Chris@16 466 /**/
Chris@16 467
Chris@16 468
Chris@16 469 // functions
Chris@16 470 //
Chris@16 471
Chris@16 472 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin(Params, Fullname) \
Chris@16 473 template< Params > inline \
Chris@16 474 typename boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
Chris@16 475 BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname& x) \
Chris@16 476 { \
Chris@16 477 return boost::range_detail_microsoft::begin_of(x); \
Chris@16 478 } \
Chris@16 479 /**/
Chris@16 480
Chris@16 481
Chris@16 482 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin_const(Params, Fullname) \
Chris@16 483 template< Params > inline \
Chris@16 484 typename boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
Chris@16 485 BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname const& x) \
Chris@16 486 { \
Chris@16 487 return boost::range_detail_microsoft::begin_of(x); \
Chris@16 488 } \
Chris@16 489 /**/
Chris@16 490
Chris@16 491
Chris@16 492 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end(Params, Fullname) \
Chris@16 493 template< Params > inline \
Chris@16 494 typename boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
Chris@16 495 BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname& x) \
Chris@16 496 { \
Chris@16 497 return boost::range_detail_microsoft::end_of(x); \
Chris@16 498 } \
Chris@16 499 /**/
Chris@16 500
Chris@16 501
Chris@16 502 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end_const(Params, Fullname) \
Chris@16 503 template< Params > inline \
Chris@16 504 typename boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
Chris@16 505 BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname const& x) \
Chris@16 506 { \
Chris@16 507 return boost::range_detail_microsoft::end_of(x); \
Chris@16 508 } \
Chris@16 509 /**/
Chris@16 510
Chris@16 511
Chris@16 512 #if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
Chris@16 513
Chris@16 514 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size(Params, Fullname) \
Chris@16 515 /**/
Chris@16 516
Chris@16 517 #else
Chris@16 518
Chris@16 519 #define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size(Params, Fullname) \
Chris@16 520 template< Params > inline \
Chris@16 521 typename boost::range_detail_microsoft::size_type_of< Fullname >::type \
Chris@16 522 boost_range_size(Fullname const& x) \
Chris@16 523 { \
Chris@16 524 return boost::range_detail_microsoft::size_of(x); \
Chris@16 525 } \
Chris@16 526 /**/
Chris@16 527
Chris@16 528 #endif
Chris@16 529
Chris@16 530
Chris@16 531
Chris@16 532
Chris@16 533 // list_iterator and helpers
Chris@16 534 //
Chris@16 535
Chris@16 536
Chris@16 537 #include <boost/assert.hpp>
Chris@16 538 #include <boost/iterator/iterator_categories.hpp>
Chris@16 539 #include <boost/iterator/iterator_facade.hpp>
Chris@16 540 #include <boost/mpl/if.hpp>
Chris@16 541 #include <boost/type_traits/is_same.hpp>
Chris@16 542
Chris@16 543
Chris@16 544 // POSITION's header is undocumented, so is NULL.
Chris@16 545 //
Chris@16 546 struct __POSITION; // incomplete, but used as just a pointer.
Chris@16 547 typedef __POSITION *POSITION;
Chris@16 548
Chris@16 549
Chris@16 550 namespace boost { namespace range_detail_microsoft {
Chris@16 551
Chris@16 552
Chris@16 553 template<
Chris@16 554 class ListT,
Chris@16 555 class Value,
Chris@16 556 class Reference,
Chris@16 557 class Traversal
Chris@16 558 >
Chris@16 559 struct list_iterator;
Chris@16 560
Chris@16 561
Chris@16 562 template<
Chris@16 563 class ListT,
Chris@16 564 class Value,
Chris@16 565 class Reference,
Chris@16 566 class Traversal
Chris@16 567 >
Chris@16 568 struct list_iterator_super
Chris@16 569 {
Chris@16 570 typedef typename mpl::if_< is_same<use_default, Reference>,
Chris@16 571 Value&,
Chris@16 572 Reference
Chris@16 573 >::type ref_t;
Chris@16 574
Chris@16 575 typedef typename mpl::if_< is_same<use_default, Traversal>,
Chris@16 576 bidirectional_traversal_tag,
Chris@16 577 Traversal
Chris@16 578 >::type trv_t;
Chris@16 579
Chris@16 580 typedef iterator_facade<
Chris@16 581 list_iterator<ListT, Value, Reference, Traversal>,
Chris@16 582 Value,
Chris@16 583 trv_t,
Chris@16 584 ref_t
Chris@16 585 > type;
Chris@16 586 };
Chris@16 587
Chris@16 588
Chris@16 589 template<
Chris@16 590 class ListT,
Chris@16 591 class Value,
Chris@16 592 class Reference = use_default,
Chris@16 593 class Traversal = use_default
Chris@16 594 >
Chris@16 595 struct list_iterator :
Chris@16 596 list_iterator_super<ListT, Value, Reference, Traversal>::type
Chris@16 597 {
Chris@16 598 private:
Chris@16 599 typedef list_iterator self_t;
Chris@16 600 typedef typename list_iterator_super<ListT, Value, Reference, Traversal>::type super_t;
Chris@16 601 typedef typename super_t::reference ref_t;
Chris@16 602
Chris@16 603 public:
Chris@16 604 explicit list_iterator()
Chris@16 605 { }
Chris@16 606
Chris@16 607 explicit list_iterator(ListT& lst, POSITION pos) :
Chris@16 608 m_plst(boost::addressof(lst)), m_pos(pos)
Chris@16 609 { }
Chris@16 610
Chris@16 611 template< class, class, class, class > friend struct list_iterator;
Chris@16 612 template< class ListT_, class Value_, class Reference_, class Traversal_>
Chris@16 613 list_iterator(list_iterator<ListT_, Value_, Reference_, Traversal_> const& other) :
Chris@16 614 m_plst(other.m_plst), m_pos(other.m_pos)
Chris@16 615 { }
Chris@16 616
Chris@16 617 private:
Chris@16 618 ListT *m_plst;
Chris@16 619 POSITION m_pos;
Chris@16 620
Chris@16 621 friend class iterator_core_access;
Chris@16 622 ref_t dereference() const
Chris@16 623 {
Chris@16 624 BOOST_ASSERT(m_pos != 0 && "out of range");
Chris@16 625 return m_plst->GetAt(m_pos);
Chris@16 626 }
Chris@16 627
Chris@16 628 // A B C D x
Chris@16 629 // Head Tail NULL(0)
Chris@16 630 //
Chris@16 631 void increment()
Chris@16 632 {
Chris@16 633 BOOST_ASSERT(m_pos != 0 && "out of range");
Chris@16 634 m_plst->GetNext(m_pos);
Chris@16 635 }
Chris@16 636
Chris@16 637 void decrement()
Chris@16 638 {
Chris@16 639 if (m_pos == 0) {
Chris@16 640 m_pos = m_plst->GetTailPosition();
Chris@16 641 return;
Chris@16 642 }
Chris@16 643
Chris@16 644 m_plst->GetPrev(m_pos);
Chris@16 645 }
Chris@16 646
Chris@16 647 bool equal(self_t const& other) const
Chris@16 648 {
Chris@16 649 BOOST_ASSERT(m_plst == other.m_plst && "iterators incompatible");
Chris@16 650 return m_pos == other.m_pos;
Chris@16 651 }
Chris@16 652 };
Chris@16 653
Chris@16 654
Chris@16 655 // customization helpers
Chris@16 656 //
Chris@16 657
Chris@16 658 struct array_functions
Chris@16 659 {
Chris@16 660 template< class Iterator, class X >
Chris@16 661 Iterator begin(X& x)
Chris@16 662 {
Chris@16 663 return x.GetData();
Chris@16 664 }
Chris@16 665
Chris@16 666 template< class Iterator, class X >
Chris@16 667 Iterator end(X& x)
Chris@16 668 {
Chris@16 669 return begin<Iterator>(x) + x.GetSize();
Chris@16 670 }
Chris@16 671 };
Chris@16 672
Chris@16 673
Chris@16 674 struct list_functions
Chris@16 675 {
Chris@16 676 template< class Iterator, class X >
Chris@16 677 Iterator begin(X& x)
Chris@16 678 {
Chris@16 679 return Iterator(x, x.GetHeadPosition());
Chris@16 680 }
Chris@16 681
Chris@16 682 template< class Iterator, class X >
Chris@16 683 Iterator end(X& x)
Chris@16 684 {
Chris@16 685 return Iterator(x, POSITION(0));
Chris@16 686 }
Chris@16 687 };
Chris@16 688
Chris@16 689
Chris@16 690 } } // namespace boost::range_detail_microsoft
Chris@16 691
Chris@16 692
Chris@16 693
Chris@16 694
Chris@16 695 // test
Chris@16 696 //
Chris@16 697
Chris@16 698
Chris@16 699 #if defined(BOOST_RANGE_DETAIL_MICROSOFT_TEST)
Chris@16 700
Chris@16 701
Chris@16 702 #include <algorithm>
Chris@16 703 #include <iterator>
Chris@16 704 #include <vector>
Chris@16 705 #include <boost/concept_check.hpp>
Chris@16 706 #include <boost/next_prior.hpp>
Chris@16 707 #include <boost/range/begin.hpp>
Chris@16 708 #include <boost/range/concepts.hpp>
Chris@16 709 #include <boost/range/const_iterator.hpp>
Chris@16 710 #include <boost/range/difference_type.hpp>
Chris@16 711 #include <boost/range/distance.hpp>
Chris@16 712 #include <boost/range/empty.hpp>
Chris@16 713 #include <boost/range/iterator_range.hpp>
Chris@16 714 #include <boost/range/mutable_iterator.hpp>
Chris@16 715 #include <boost/range/rbegin.hpp>
Chris@16 716 #include <boost/range/rend.hpp>
Chris@16 717 #include <boost/range/value_type.hpp>
Chris@16 718 #include <boost/type_traits/is_same.hpp>
Chris@16 719
Chris@16 720
Chris@16 721 namespace boost { namespace range_detail_microsoft {
Chris@16 722
Chris@16 723
Chris@16 724 template< class Range1, class Range2 >
Chris@16 725 bool test_equals(Range1 const& rng1, Range2 const& rng2)
Chris@16 726 {
Chris@16 727 return
Chris@16 728 boost::distance(rng1) == boost::distance(rng2) &&
Chris@16 729 std::equal(boost::begin(rng1), boost::end(rng1), boost::begin(rng2))
Chris@16 730 ;
Chris@16 731 }
Chris@16 732
Chris@16 733
Chris@16 734 template< class AssocContainer, class PairT >
Chris@16 735 bool test_find_key_and_mapped(AssocContainer const& ac, PairT const& pa)
Chris@16 736 {
Chris@16 737 typedef typename boost::range_const_iterator<AssocContainer>::type iter_t;
Chris@16 738 for (iter_t it = boost::const_begin(ac), last = boost::const_end(ac); it != last; ++it) {
Chris@16 739 if (it->first == pa.first && it->second == pa.second)
Chris@16 740 return true;
Chris@16 741 }
Chris@16 742
Chris@16 743 return false;
Chris@16 744 }
Chris@16 745
Chris@16 746
Chris@16 747 // test functions
Chris@16 748 //
Chris@16 749
Chris@16 750 template< class Range >
Chris@16 751 bool test_emptiness(Range& )
Chris@16 752 {
Chris@16 753 bool result = true;
Chris@16 754
Chris@16 755 Range emptyRng;
Chris@16 756 result = result && boost::empty(emptyRng);
Chris@16 757
Chris@16 758 return result;
Chris@16 759 }
Chris@16 760
Chris@16 761
Chris@16 762 template< class Range >
Chris@16 763 bool test_trivial(Range& rng)
Chris@16 764 {
Chris@16 765 bool result = true;
Chris@16 766
Chris@16 767 // convertibility check
Chris@16 768 typedef typename range_const_iterator<Range>::type citer_t;
Chris@16 769 citer_t cit = boost::begin(rng);
Chris@16 770 (void)cit; // unused
Chris@16 771
Chris@16 772 // mutability check
Chris@16 773 typedef typename range_value<Range>::type val_t;
Chris@16 774 val_t v = *boost::begin(rng);
Chris@16 775 *boost::begin(rng) = v;
Chris@16 776 result = result && *boost::begin(rng) == v;
Chris@16 777
Chris@16 778 return result;
Chris@16 779 }
Chris@16 780
Chris@16 781
Chris@16 782 template< class Range >
Chris@16 783 bool test_forward(Range& rng)
Chris@16 784 {
Chris@16 785 boost::function_requires< ForwardRangeConcept<Range> >();
Chris@16 786
Chris@16 787 bool result = (test_trivial)(rng);
Chris@16 788
Chris@16 789 typedef typename range_value<Range>::type val_t;
Chris@16 790
Chris@16 791 std::vector<val_t> saved;
Chris@16 792 std::copy(boost::begin(rng), boost::end(rng), std::back_inserter(saved));
Chris@16 793 std::rotate(boost::begin(saved), boost::next(boost::begin(saved)), boost::end(saved));
Chris@16 794
Chris@16 795 std::rotate(boost::begin(rng), boost::next(boost::begin(rng)), boost::end(rng));
Chris@16 796
Chris@16 797 return result && (test_equals)(saved, rng);
Chris@16 798 };
Chris@16 799
Chris@16 800
Chris@16 801 template< class Range >
Chris@16 802 bool test_bidirectional(Range& rng)
Chris@16 803 {
Chris@16 804 boost::function_requires< BidirectionalRangeConcept<Range> >();
Chris@16 805
Chris@16 806 bool result = (test_forward)(rng);
Chris@16 807
Chris@16 808 typedef typename range_value<Range>::type val_t;
Chris@16 809
Chris@16 810 std::vector<val_t> saved;
Chris@16 811 std::copy(boost::begin(rng), boost::end(rng), std::back_inserter(saved));
Chris@16 812
Chris@16 813 result = result && (test_equals)(
Chris@16 814 boost::make_iterator_range(boost::rbegin(saved), boost::rend(saved)),
Chris@16 815 boost::make_iterator_range(boost::rbegin(rng), boost::rend(rng))
Chris@16 816 );
Chris@16 817
Chris@16 818 return result;
Chris@16 819 }
Chris@16 820
Chris@16 821
Chris@16 822 template< class Range >
Chris@16 823 bool test_random_access(Range& rng)
Chris@16 824 {
Chris@16 825 boost::function_requires< RandomAccessRangeConcept<Range> >();
Chris@16 826
Chris@16 827 bool result = (test_bidirectional)(rng);
Chris@16 828
Chris@16 829 typedef typename range_value<Range>::type val_t;
Chris@16 830
Chris@16 831 std::vector<val_t> saved;
Chris@16 832 std::copy(boost::begin(rng), boost::end(rng), std::back_inserter(saved));
Chris@16 833 std::sort(boost::begin(saved), boost::end(saved));
Chris@16 834
Chris@16 835 std::random_shuffle(boost::begin(rng), boost::end(rng));
Chris@16 836 std::sort(boost::begin(rng), boost::end(rng));
Chris@16 837 result = result && (test_equals)(rng, saved);
Chris@16 838
Chris@16 839 std::random_shuffle(boost::begin(rng), boost::end(rng));
Chris@16 840 std::stable_sort(boost::begin(rng), boost::end(rng));
Chris@16 841 result = result && (test_equals)(rng, saved);
Chris@16 842
Chris@16 843 std::random_shuffle(boost::begin(rng), boost::end(rng));
Chris@16 844 std::partial_sort(boost::begin(rng), boost::end(rng), boost::end(rng));
Chris@16 845 result = result && (test_equals)(rng, saved);
Chris@16 846
Chris@16 847 return result;
Chris@16 848 }
Chris@16 849
Chris@16 850
Chris@16 851 // initializer
Chris@16 852 //
Chris@16 853
Chris@16 854 template< class ArrayT, class SampleRange >
Chris@16 855 bool test_init_array(ArrayT& arr, SampleRange const& sample)
Chris@16 856 {
Chris@16 857 typedef typename range_const_iterator<SampleRange>::type iter_t;
Chris@16 858 typedef typename range_value<SampleRange>::type val_t;
Chris@16 859
Chris@16 860 for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
Chris@16 861 val_t v = *it; // works around ATL3 CSimpleArray
Chris@16 862 arr.Add(v);
Chris@16 863 }
Chris@16 864
Chris@16 865 return (test_equals)(arr, sample);
Chris@16 866 }
Chris@16 867
Chris@16 868
Chris@16 869 template< class ListT, class SampleRange >
Chris@16 870 bool test_init_list(ListT& lst, SampleRange const& sample)
Chris@16 871 {
Chris@16 872 typedef typename range_const_iterator<SampleRange>::type iter_t;
Chris@16 873
Chris@16 874 for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
Chris@16 875 lst.AddTail(*it);
Chris@16 876 }
Chris@16 877
Chris@16 878 return (test_equals)(lst, sample);
Chris@16 879 }
Chris@16 880
Chris@16 881
Chris@16 882 template< class StringT, class SampleRange >
Chris@16 883 bool test_init_string(StringT& str, SampleRange const& sample)
Chris@16 884 {
Chris@16 885 typedef typename range_const_iterator<SampleRange>::type iter_t;
Chris@16 886 typedef typename range_value<SampleRange>::type val_t;
Chris@16 887
Chris@16 888 for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
Chris@16 889 str += *it;
Chris@16 890 }
Chris@16 891
Chris@16 892 return (test_equals)(str, sample);
Chris@16 893 }
Chris@16 894
Chris@16 895
Chris@16 896 template< class MapT, class SampleMap >
Chris@16 897 bool test_init_map(MapT& map, SampleMap const& sample)
Chris@16 898 {
Chris@16 899 typedef typename range_const_iterator<SampleMap>::type iter_t;
Chris@16 900
Chris@16 901 for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
Chris@16 902 map.SetAt(it->first, it->second);
Chris@16 903 }
Chris@16 904
Chris@16 905 return boost::distance(map) == boost::distance(sample);
Chris@16 906 }
Chris@16 907
Chris@16 908
Chris@16 909 // metafunction test
Chris@16 910 //
Chris@16 911
Chris@16 912 template< class Range, class Iter >
Chris@16 913 struct test_mutable_iter :
Chris@16 914 boost::is_same< typename boost::BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator<Range>::type, Iter >
Chris@16 915 { };
Chris@16 916
Chris@16 917
Chris@16 918 template< class Range, class Iter >
Chris@16 919 struct test_const_iter :
Chris@16 920 boost::is_same< typename boost::range_const_iterator<Range>::type, Iter >
Chris@16 921 { };
Chris@16 922
Chris@16 923
Chris@16 924 } } // namespace boost::range_detail_microsoft
Chris@16 925
Chris@16 926
Chris@16 927 #endif // defined(BOOST_RANGE_DETAIL_MICROSOFT_TEST)
Chris@16 928
Chris@16 929
Chris@16 930
Chris@16 931 #endif