forked from boostorg/range
https://svn.boost.org/svn/boost/trunk ........ r41161 | bemandawes | 2007-11-16 15:21:47 -0800 (Fri, 16 Nov 2007) | 1 line Fix markup error ........ r41163 | bgubenko | 2007-11-16 17:28:10 -0800 (Fri, 16 Nov 2007) | 1 line mark some fusion library tests for acc toolset ........ r41164 | djowel | 2007-11-16 17:51:04 -0800 (Fri, 16 Nov 2007) | 1 line fix for trac ticket #1450 ........ r41165 | lbourdev | 2007-11-16 19:38:25 -0800 (Fri, 16 Nov 2007) | 10 lines Updated to version 2.1.2 Added support for more compilers. Added new flag GIL_NONWORD_POINTER_ALIGNMENT_SUPPORTED to indicate whether dereferencing on non-word boundary is supported. Enabling this flag improves performance. Fixed two bugs related to non-byte-aligned images. The image alignment parameter is now specified in bytes, and has a default of 0, which means "packed" alignment. In particular, for non-byte-aligned images alignment of 0 means there are no padding bits at the ends of rows. Added the allocator as an optional parameter to image constructors and image recreate methods. ........ r41167 | grafik | 2007-11-16 20:11:49 -0800 (Fri, 16 Nov 2007) | 1 line Add "--out-xml=xyz.xml" option that dumps the output of all actions, and the test.jam information, to the given file. Changes are mostly from Dave. ........ r41169 | johnmaddock | 2007-11-17 02:00:43 -0800 (Sat, 17 Nov 2007) | 1 line Ooops, check on wrong index, now fixed. ........ r41170 | johnmaddock | 2007-11-17 04:17:05 -0800 (Sat, 17 Nov 2007) | 1 line Fix WinCE issues. ........ r41172 | johnmaddock | 2007-11-17 10:41:29 -0800 (Sat, 17 Nov 2007) | 1 line Changed test to catch throw exceptions from thread creation. ........ r41173 | bemandawes | 2007-11-17 12:13:16 -0800 (Sat, 17 Nov 2007) | 1 line // Add or correct comment identifying Boost library this header is associated with. ........ r41174 | grafik | 2007-11-17 12:14:24 -0800 (Sat, 17 Nov 2007) | 1 line Add in Dave's comments, and expand information in XML output to include action names, sources, properties, bjam info, and platform info. This required one minor change to actions to keep track of the action object generating the targets. ........ r41175 | nesotto | 2007-11-17 12:22:05 -0800 (Sat, 17 Nov 2007) | 1 line minor update of comments ........ r41176 | nesotto | 2007-11-17 12:22:20 -0800 (Sat, 17 Nov 2007) | 1 line last updates ........ r41177 | nesotto | 2007-11-17 12:44:29 -0800 (Sat, 17 Nov 2007) | 1 line works after local test with vc8 ........ r41178 | nesotto | 2007-11-17 13:02:22 -0800 (Sat, 17 Nov 2007) | 1 line added missing header ........ r41180 | nesotto | 2007-11-17 13:19:13 -0800 (Sat, 17 Nov 2007) | 1 line iostream macro patch ........ r41181 | nesotto | 2007-11-17 13:21:53 -0800 (Sat, 17 Nov 2007) | 1 line removed some warnings ........ r41182 | grafik | 2007-11-17 13:22:40 -0800 (Sat, 17 Nov 2007) | 1 line Add working dir to build description, move jam version to an attribute. ........ r41183 | nesotto | 2007-11-17 13:24:16 -0800 (Sat, 17 Nov 2007) | 1 line macro patch ........ r41185 | nesotto | 2007-11-17 13:43:32 -0800 (Sat, 17 Nov 2007) | 1 line minor change to define the value type of the iterators better ........ r41186 | grafik | 2007-11-17 14:09:26 -0800 (Sat, 17 Nov 2007) | 1 line Change "actual" to the more natural "target", and change "target" to "path". Add bjam command and bb version to XML. ........ r41187 | bemandawes | 2007-11-17 14:48:06 -0800 (Sat, 17 Nov 2007) | 1 line Add or correct comment identifying Boost library this header is associated with. ........ r41188 | andreas_huber69 | 2007-11-17 16:08:46 -0800 (Sat, 17 Nov 2007) | 1 line Added markup for statechart failures on msvc-8.0~wm5~stlport5.1 ........ r41192 | grafik | 2007-11-17 22:42:14 -0800 (Sat, 17 Nov 2007) | 1 line Add to XML output the known targets and dependencies to allow creation of the full build dependency graph. Merge from Dave's Bitten branch. ........ r41193 | johnmaddock | 2007-11-18 02:07:14 -0800 (Sun, 18 Nov 2007) | 1 line Ooops: previous commit broke platforms/compilers with no long double support, added workaround as fix. ........ r41194 | igaztanaga | 2007-11-18 02:41:57 -0800 (Sun, 18 Nov 2007) | 1 line Interprocess changes to support systems with filesystem-based shared memory ........ r41195 | igaztanaga | 2007-11-18 02:43:35 -0800 (Sun, 18 Nov 2007) | 1 line Added scapegoat trees and an option to store the hash value in the hook for unordered containers ........ r41196 | igaztanaga | 2007-11-18 02:44:56 -0800 (Sun, 18 Nov 2007) | 1 line Added scapegoat trees and an option to store the hash value in the hook for unordered containers ........ r41197 | igaztanaga | 2007-11-18 02:51:19 -0800 (Sun, 18 Nov 2007) | 1 line Interprocess changes to support systems with filesystem-based shared memory ........ r41198 | igaztanaga | 2007-11-18 02:54:48 -0800 (Sun, 18 Nov 2007) | 1 line Interprocess changes to support systems with filesystem-based shared memory ........ r41199 | johnmaddock | 2007-11-18 04:23:37 -0800 (Sun, 18 Nov 2007) | 1 line Added missing template argument to specialisations. ........ r41200 | johnmaddock | 2007-11-18 04:24:42 -0800 (Sun, 18 Nov 2007) | 1 line Fix IMB xlc error limits, added workarounds where these were missed by the last commit. ........ r41201 | t_schwinger | 2007-11-18 06:06:47 -0800 (Sun, 18 Nov 2007) | 3 lines adds comment to fusion aCC failure markup ........ r41202 | danieljames | 2007-11-18 08:10:12 -0800 (Sun, 18 Nov 2007) | 2 lines Move the instructions for running regression tests to the new site. Fixes #1265. ........ r41210 | danieljames | 2007-11-18 12:18:04 -0800 (Sun, 18 Nov 2007) | 2 lines Move the 'implementation variations' page to the new site. Fixes #1355. ........ r41211 | eric_niebler | 2007-11-18 12:19:55 -0800 (Sun, 18 Nov 2007) | 1 line vc6 doesn't like BOOST_MPL_ASSERT_MSG ........ r41212 | grafik | 2007-11-18 12:24:25 -0800 (Sun, 18 Nov 2007) | 1 line Inspection report fixes. ........ r41213 | grafik | 2007-11-18 12:53:28 -0800 (Sun, 18 Nov 2007) | 1 line Cleanup tools/regression to remove obsolete runner scripts, move existing docs to doc subdir, and clean html docs into valid xhtml. ........ r41214 | grafik | 2007-11-18 13:02:51 -0800 (Sun, 18 Nov 2007) | 1 line Add missing <cstring> include, for std::strchr function. ........ r41215 | grafik | 2007-11-18 13:07:26 -0800 (Sun, 18 Nov 2007) | 1 line Add keyword tags. ........ r41216 | niels_dekker | 2007-11-18 14:11:57 -0800 (Sun, 18 Nov 2007) | 1 line Code refactoring: removed private base classes of value_initialized, as suggested by Fernando Cacciola. ........ r41217 | djowel | 2007-11-18 16:05:43 -0800 (Sun, 18 Nov 2007) | 1 line added link to docs ........ r41218 | johnmaddock | 2007-11-19 02:02:16 -0800 (Mon, 19 Nov 2007) | 1 line Oops: added missing template specialisation argument. ........ r41219 | johnmaddock | 2007-11-19 02:20:36 -0800 (Mon, 19 Nov 2007) | 1 line No user32.lib on WinCE ........ r41220 | joaquin | 2007-11-19 03:08:11 -0800 (Mon, 19 Nov 2007) | 1 line moved some ADL stuff out of a potentially name-hiding scope ........ r41221 | troyer | 2007-11-19 04:15:58 -0800 (Mon, 19 Nov 2007) | 1 line made complex seriaqlization more portable ........ r41222 | anthonyw | 2007-11-19 04:17:31 -0800 (Mon, 19 Nov 2007) | 1 line fixed TSS cleanup on 64-bit Windows ........ r41223 | anthonyw | 2007-11-19 04:29:14 -0800 (Mon, 19 Nov 2007) | 1 line fixed problems with TSS cleanup when using LoadLibrary and when threads finish after thread_specific_ptr instance has been destroyed ........ r41224 | garcia | 2007-11-19 05:28:00 -0800 (Mon, 19 Nov 2007) | 2 lines A bunch of review volunteers. ........ r41225 | garcia | 2007-11-19 06:01:34 -0800 (Mon, 19 Nov 2007) | 2 lines Added boost.range update ........ r41226 | anthonyw | 2007-11-19 06:29:22 -0800 (Mon, 19 Nov 2007) | 1 line added copyright ........ r41227 | aaron_windsor | 2007-11-19 07:28:26 -0800 (Mon, 19 Nov 2007) | 1 line Cleaning up #includes to avoid errors on gcc 4.1 and above. ........ r41234 | igaztanaga | 2007-11-19 08:55:23 -0800 (Mon, 19 Nov 2007) | 1 line Fixed errors detected by gcc-4.3 ........ r41235 | hljin | 2007-11-19 09:26:12 -0800 (Mon, 19 Nov 2007) | 1 line GIL: updated the design guide based on the new changes ........ r41236 | grafik | 2007-11-19 09:44:31 -0800 (Mon, 19 Nov 2007) | 1 line Make quietly actions really quiet by not printing the command output. The output for the quietly actions is still available through "__ACTION_RULE__". ........ r41237 | grafik | 2007-11-19 10:02:43 -0800 (Mon, 19 Nov 2007) | 1 line Add architecture and instruction-set values for HP/PA-RISC. ........ r41238 | igaztanaga | 2007-11-19 10:09:13 -0800 (Mon, 19 Nov 2007) | 1 line Corrected ifdef ........ r41240 | igaztanaga | 2007-11-19 10:32:12 -0800 (Mon, 19 Nov 2007) | 1 line Fixed 64 bit std::size_t specialization error ........ r41241 | hljin | 2007-11-19 10:34:59 -0800 (Mon, 19 Nov 2007) | 1 line GIL: broke the main test into small tests ........ r41242 | bgubenko | 2007-11-19 11:25:21 -0800 (Mon, 19 Nov 2007) | 1 line add OSPLAT=PARISC for HP-UX PA-RISC ........ [SVN r41247]
932 lines
28 KiB
C++
932 lines
28 KiB
C++
#ifndef BOOST_RANGE_DETAIL_MICROSOFT_HPP
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_HPP
|
|
|
|
// Boost.Range MFC/ATL Extension
|
|
//
|
|
// Copyright Shunsuke Sogame 2005-2006.
|
|
// Distributed under the Boost Software License, Version 1.0.
|
|
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
|
|
|
|
|
|
// config
|
|
//
|
|
|
|
|
|
#include <boost/range/iterator.hpp>
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1 1
|
|
|
|
|
|
#if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator range_mutable_iterator
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_range_begin range_begin
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_range_end range_end
|
|
#else
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator range_mutable_iterator
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_range_begin range_begin
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_range_end range_end
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// yet another customization way
|
|
//
|
|
|
|
|
|
#include <boost/iterator/iterator_traits.hpp> // iterator_difference
|
|
#include <boost/mpl/identity.hpp>
|
|
#include <boost/mpl/if.hpp>
|
|
#include <boost/preprocessor/cat.hpp>
|
|
#include <boost/preprocessor/control/iif.hpp>
|
|
#include <boost/preprocessor/comma_if.hpp>
|
|
#include <boost/preprocessor/detail/is_unary.hpp>
|
|
#include <boost/preprocessor/list/for_each.hpp>
|
|
#include <boost/preprocessor/repetition/enum_params.hpp>
|
|
#include <boost/preprocessor/repetition/repeat.hpp>
|
|
#include <boost/preprocessor/seq/for_each_i.hpp>
|
|
#include <boost/preprocessor/seq/size.hpp>
|
|
#include <boost/preprocessor/tuple/eat.hpp>
|
|
#include <boost/range/const_iterator.hpp>
|
|
#include <boost/range/size_type.hpp>
|
|
#include <boost/type_traits/is_const.hpp>
|
|
#include <boost/type_traits/is_same.hpp>
|
|
#include <boost/type_traits/remove_cv.hpp>
|
|
#include <boost/utility/addressof.hpp>
|
|
#include <boost/utility/enable_if.hpp> // disable_if
|
|
|
|
#if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
|
|
#include <boost/range/mutable_iterator.hpp>
|
|
#else
|
|
#include <iterator> // distance
|
|
#include <boost/range/begin.hpp>
|
|
#include <boost/range/end.hpp>
|
|
#include <boost/range/iterator.hpp>
|
|
#endif
|
|
|
|
|
|
namespace boost { namespace range_detail_microsoft {
|
|
|
|
|
|
// customization point
|
|
//
|
|
|
|
template< class Tag >
|
|
struct customization;
|
|
|
|
|
|
template< class T >
|
|
struct customization_tag;
|
|
|
|
|
|
struct using_type_as_tag
|
|
{ };
|
|
|
|
|
|
// Topic:
|
|
// In fact, it is unnecessary for VC++.
|
|
// VC++'s behavior seems conforming, while GCC fails without this.
|
|
template< class Iterator, class T >
|
|
struct mutable_ :
|
|
disable_if< is_const<T>, Iterator >
|
|
{ };
|
|
|
|
|
|
// helpers
|
|
//
|
|
|
|
template< class Tag, class T >
|
|
struct customization_tag_of
|
|
{
|
|
typedef typename mpl::if_< is_same<using_type_as_tag, Tag>,
|
|
T,
|
|
Tag
|
|
>::type type;
|
|
};
|
|
|
|
|
|
template< class T >
|
|
struct customization_of
|
|
{
|
|
typedef typename remove_cv<T>::type bare_t;
|
|
typedef typename customization_tag<bare_t>::type tag_t;
|
|
typedef customization<tag_t> type;
|
|
};
|
|
|
|
|
|
template< class T >
|
|
struct mutable_iterator_of
|
|
{
|
|
typedef typename remove_cv<T>::type bare_t;
|
|
typedef typename customization_of<bare_t>::type cust_t;
|
|
typedef typename cust_t::template meta<bare_t>::mutable_iterator type;
|
|
};
|
|
|
|
|
|
template< class T >
|
|
struct const_iterator_of
|
|
{
|
|
typedef typename remove_cv<T>::type bare_t;
|
|
typedef typename customization_of<bare_t>::type cust_t;
|
|
typedef typename cust_t::template meta<bare_t>::const_iterator type;
|
|
};
|
|
|
|
|
|
template< class T >
|
|
struct size_type_of
|
|
{
|
|
typedef typename range_detail_microsoft::mutable_iterator_of<T>::type miter_t;
|
|
typedef typename iterator_difference<miter_t>::type type;
|
|
};
|
|
|
|
|
|
template< class T > inline
|
|
typename mutable_iterator_of<T>::type
|
|
begin_of(T& x)
|
|
{
|
|
typedef typename customization_of<T>::type cust_t;
|
|
return cust_t().template begin<typename mutable_iterator_of<T>::type>(x);
|
|
}
|
|
|
|
|
|
template< class T > inline
|
|
typename const_iterator_of<T>::type
|
|
begin_of(T const& x)
|
|
{
|
|
typedef typename customization_of<T>::type cust_t;
|
|
return cust_t().template begin<typename const_iterator_of<T>::type>(x);
|
|
}
|
|
|
|
|
|
template< class T > inline
|
|
typename mutable_iterator_of<T>::type
|
|
end_of(T& x)
|
|
{
|
|
typedef typename customization_of<T>::type cust_t;
|
|
return cust_t().template end<typename mutable_iterator_of<T>::type>(x);
|
|
}
|
|
|
|
|
|
template< class T > inline
|
|
typename const_iterator_of<T>::type
|
|
end_of(T const& x)
|
|
{
|
|
typedef typename customization_of<T>::type cust_t;
|
|
return cust_t().template end<typename const_iterator_of<T>::type>(x);
|
|
}
|
|
|
|
|
|
#if defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
|
|
|
|
template< class T > inline
|
|
typename size_type_of<T>::type
|
|
size_of(T const& x)
|
|
{
|
|
return std::distance(boost::begin(x), boost::end(x));
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
template< class Range >
|
|
struct compatible_mutable_iterator :
|
|
BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator<Range>
|
|
{ };
|
|
|
|
|
|
} } // namespace boost::range_detail_microsoft
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open(NamespaceList) \
|
|
BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open_op, ~, NamespaceList) \
|
|
/**/
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open_op(r, data, elem) \
|
|
namespace elem { \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close(NamespaceList) \
|
|
BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close_op, ~, NamespaceList) \
|
|
/**/
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close_op(r, data, elem) \
|
|
} \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_expand_op(r, data, elem) \
|
|
:: elem \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(Tag, NamespaceList, Name) \
|
|
namespace boost { namespace range_detail_microsoft { \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_tag(Tag, BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
|
|
} } \
|
|
\
|
|
namespace boost { \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_mutable_iterator(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_const_iterator(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size_type(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
|
|
} \
|
|
\
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open(NamespaceList) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin_const(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end_const(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name)) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close(NamespaceList) \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_fullname(NamespaceList, Name) \
|
|
BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_expand_op, ~, NamespaceList) :: Name \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_tag(Tag, Fullname) \
|
|
template< > \
|
|
struct customization_tag< Fullname > : \
|
|
customization_tag_of< Tag, Fullname > \
|
|
{ }; \
|
|
/**/
|
|
|
|
|
|
// metafunctions
|
|
//
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_mutable_iterator(Fullname) \
|
|
template< > \
|
|
struct BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator< Fullname > : \
|
|
range_detail_microsoft::mutable_iterator_of< Fullname > \
|
|
{ }; \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_const_iterator(Fullname) \
|
|
template< > \
|
|
struct range_const_iterator< Fullname > : \
|
|
range_detail_microsoft::const_iterator_of< Fullname > \
|
|
{ }; \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size_type(Fullname) \
|
|
template< > \
|
|
struct range_size< Fullname > : \
|
|
range_detail_microsoft::size_type_of< Fullname > \
|
|
{ }; \
|
|
/**/
|
|
|
|
|
|
// functions
|
|
//
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin(Fullname) \
|
|
inline \
|
|
boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname& x) \
|
|
{ \
|
|
return boost::range_detail_microsoft::begin_of(x); \
|
|
} \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_begin_const(Fullname) \
|
|
inline \
|
|
boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname const& x) \
|
|
{ \
|
|
return boost::range_detail_microsoft::begin_of(x); \
|
|
} \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end(Fullname) \
|
|
inline \
|
|
boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname& x) \
|
|
{ \
|
|
return boost::range_detail_microsoft::end_of(x); \
|
|
} \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_end_const(Fullname) \
|
|
inline \
|
|
boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname const& x) \
|
|
{ \
|
|
return boost::range_detail_microsoft::end_of(x); \
|
|
} \
|
|
/**/
|
|
|
|
|
|
#if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size(Fullname) \
|
|
/**/
|
|
|
|
#else
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE_size(Fullname) \
|
|
inline \
|
|
boost::range_detail_microsoft::size_type_of< Fullname >::type \
|
|
boost_range_size(Fullname const& x) \
|
|
{ \
|
|
return boost::range_detail_microsoft::size_of(x); \
|
|
} \
|
|
/**/
|
|
|
|
#endif
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(Tag, NamespaceList, Name, ParamSeqOrCount) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_impl( \
|
|
Tag, NamespaceList, Name, \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq(ParamSeqOrCount) \
|
|
) \
|
|
/**/
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq(ParamSeqOrCount) \
|
|
BOOST_PP_IIF(BOOST_PP_IS_UNARY(ParamSeqOrCount), \
|
|
ParamSeqOrCount BOOST_PP_TUPLE_EAT(3), \
|
|
BOOST_PP_REPEAT \
|
|
)(ParamSeqOrCount, BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq_op, ~) \
|
|
/**/
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_to_param_seq_op(z, n, _) \
|
|
(class) \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_impl(Tag, NamespaceList, Name, ParamSeq) \
|
|
namespace boost { namespace range_detail_microsoft { \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_tag( \
|
|
Tag, \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
|
|
) \
|
|
} } \
|
|
\
|
|
namespace boost { \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_mutable_iterator( \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
|
|
) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_const_iterator( \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
|
|
) \
|
|
\
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size_type( \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
|
|
) \
|
|
} \
|
|
\
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_open(NamespaceList) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin( \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
|
|
) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin_const( \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
|
|
) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end( \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
|
|
) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end_const( \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
|
|
) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size( \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq), \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
|
|
) \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_close(NamespaceList) \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params(ParamSeq) \
|
|
BOOST_PP_SEQ_FOR_EACH_I(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params_op, ~, ParamSeq) \
|
|
/**/
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_params_op(r, data, i, elem) \
|
|
BOOST_PP_COMMA_IF(i) elem BOOST_PP_CAT(T, i) \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_fullname(NamespaceList, Name, ParamSeq) \
|
|
BOOST_PP_LIST_FOR_EACH(BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_namespace_expand_op, ~, NamespaceList) \
|
|
:: Name < BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(ParamSeq), T) > \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_tag(Tag, Params, Fullname) \
|
|
template< Params > \
|
|
struct customization_tag< Fullname > : \
|
|
customization_tag_of< Tag, Fullname > \
|
|
{ }; \
|
|
/**/
|
|
|
|
|
|
// metafunctions
|
|
//
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_mutable_iterator(Params, Fullname) \
|
|
template< Params > \
|
|
struct BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator< Fullname > : \
|
|
range_detail_microsoft::mutable_iterator_of< Fullname > \
|
|
{ }; \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_const_iterator(Params, Fullname) \
|
|
template< Params > \
|
|
struct range_const_iterator< Fullname > : \
|
|
range_detail_microsoft::const_iterator_of< Fullname > \
|
|
{ }; \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size_type(Params, Fullname) \
|
|
template< Params > \
|
|
struct range_size< Fullname > : \
|
|
range_detail_microsoft::size_type_of< Fullname > \
|
|
{ }; \
|
|
/**/
|
|
|
|
|
|
// functions
|
|
//
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin(Params, Fullname) \
|
|
template< Params > inline \
|
|
typename boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname& x) \
|
|
{ \
|
|
return boost::range_detail_microsoft::begin_of(x); \
|
|
} \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_begin_const(Params, Fullname) \
|
|
template< Params > inline \
|
|
typename boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_range_begin(Fullname const& x) \
|
|
{ \
|
|
return boost::range_detail_microsoft::begin_of(x); \
|
|
} \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end(Params, Fullname) \
|
|
template< Params > inline \
|
|
typename boost::range_detail_microsoft::mutable_iterator_of< Fullname >::type \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname& x) \
|
|
{ \
|
|
return boost::range_detail_microsoft::end_of(x); \
|
|
} \
|
|
/**/
|
|
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_end_const(Params, Fullname) \
|
|
template< Params > inline \
|
|
typename boost::range_detail_microsoft::const_iterator_of< Fullname >::type \
|
|
BOOST_RANGE_DETAIL_MICROSOFT_range_end(Fullname const& x) \
|
|
{ \
|
|
return boost::range_detail_microsoft::end_of(x); \
|
|
} \
|
|
/**/
|
|
|
|
|
|
#if !defined(BOOST_RANGE_DETAIL_MICROSOFT_RANGE_VERSION_1)
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size(Params, Fullname) \
|
|
/**/
|
|
|
|
#else
|
|
|
|
#define BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE_size(Params, Fullname) \
|
|
template< Params > inline \
|
|
typename boost::range_detail_microsoft::size_type_of< Fullname >::type \
|
|
boost_range_size(Fullname const& x) \
|
|
{ \
|
|
return boost::range_detail_microsoft::size_of(x); \
|
|
} \
|
|
/**/
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// list_iterator and helpers
|
|
//
|
|
|
|
|
|
#include <boost/assert.hpp>
|
|
#include <boost/iterator/iterator_categories.hpp>
|
|
#include <boost/iterator/iterator_facade.hpp>
|
|
#include <boost/mpl/if.hpp>
|
|
#include <boost/type_traits/is_same.hpp>
|
|
|
|
|
|
// POSITION's header is undocumented, so is NULL.
|
|
//
|
|
struct __POSITION; // incomplete, but used as just a pointer.
|
|
typedef __POSITION *POSITION;
|
|
|
|
|
|
namespace boost { namespace range_detail_microsoft {
|
|
|
|
|
|
template<
|
|
class ListT,
|
|
class Value,
|
|
class Reference,
|
|
class Traversal
|
|
>
|
|
struct list_iterator;
|
|
|
|
|
|
template<
|
|
class ListT,
|
|
class Value,
|
|
class Reference,
|
|
class Traversal
|
|
>
|
|
struct list_iterator_super
|
|
{
|
|
typedef typename mpl::if_< is_same<use_default, Reference>,
|
|
Value&,
|
|
Reference
|
|
>::type ref_t;
|
|
|
|
typedef typename mpl::if_< is_same<use_default, Traversal>,
|
|
bidirectional_traversal_tag,
|
|
Traversal
|
|
>::type trv_t;
|
|
|
|
typedef iterator_facade<
|
|
list_iterator<ListT, Value, Reference, Traversal>,
|
|
Value,
|
|
trv_t,
|
|
ref_t
|
|
> type;
|
|
};
|
|
|
|
|
|
template<
|
|
class ListT,
|
|
class Value,
|
|
class Reference = use_default,
|
|
class Traversal = use_default
|
|
>
|
|
struct list_iterator :
|
|
list_iterator_super<ListT, Value, Reference, Traversal>::type
|
|
{
|
|
private:
|
|
typedef list_iterator self_t;
|
|
typedef typename list_iterator_super<ListT, Value, Reference, Traversal>::type super_t;
|
|
typedef typename super_t::reference ref_t;
|
|
|
|
public:
|
|
explicit list_iterator()
|
|
{ }
|
|
|
|
explicit list_iterator(ListT& lst, POSITION pos) :
|
|
m_plst(boost::addressof(lst)), m_pos(pos)
|
|
{ }
|
|
|
|
template< class, class, class, class > friend struct list_iterator;
|
|
template< class ListT_, class Value_, class Reference_, class Traversal_>
|
|
list_iterator(list_iterator<ListT_, Value_, Reference_, Traversal_> const& other) :
|
|
m_plst(other.m_plst), m_pos(other.m_pos)
|
|
{ }
|
|
|
|
private:
|
|
ListT *m_plst;
|
|
POSITION m_pos;
|
|
|
|
friend class iterator_core_access;
|
|
ref_t dereference() const
|
|
{
|
|
BOOST_ASSERT(m_pos != 0 && "out of range");
|
|
return m_plst->GetAt(m_pos);
|
|
}
|
|
|
|
// A B C D x
|
|
// Head Tail NULL(0)
|
|
//
|
|
void increment()
|
|
{
|
|
BOOST_ASSERT(m_pos != 0 && "out of range");
|
|
m_plst->GetNext(m_pos);
|
|
}
|
|
|
|
void decrement()
|
|
{
|
|
if (m_pos == 0) {
|
|
m_pos = m_plst->GetTailPosition();
|
|
return;
|
|
}
|
|
|
|
m_plst->GetPrev(m_pos);
|
|
}
|
|
|
|
bool equal(self_t const& other) const
|
|
{
|
|
BOOST_ASSERT(m_plst == other.m_plst && "iterators incompatible");
|
|
return m_pos == other.m_pos;
|
|
}
|
|
};
|
|
|
|
|
|
// customization helpers
|
|
//
|
|
|
|
struct array_functions
|
|
{
|
|
template< class Iterator, class X >
|
|
Iterator begin(X& x)
|
|
{
|
|
return x.GetData();
|
|
}
|
|
|
|
template< class Iterator, class X >
|
|
Iterator end(X& x)
|
|
{
|
|
return begin<Iterator>(x) + x.GetSize();
|
|
}
|
|
};
|
|
|
|
|
|
struct list_functions
|
|
{
|
|
template< class Iterator, class X >
|
|
Iterator begin(X& x)
|
|
{
|
|
return Iterator(x, x.GetHeadPosition());
|
|
}
|
|
|
|
template< class Iterator, class X >
|
|
Iterator end(X& x)
|
|
{
|
|
return Iterator(x, POSITION(0));
|
|
}
|
|
};
|
|
|
|
|
|
} } // namespace boost::range_detail_microsoft
|
|
|
|
|
|
|
|
|
|
// test
|
|
//
|
|
|
|
|
|
#if defined(BOOST_RANGE_DETAIL_MICROSOFT_TEST)
|
|
|
|
|
|
#include <algorithm>
|
|
#include <iterator>
|
|
#include <vector>
|
|
#include <boost/concept_check.hpp>
|
|
#include <boost/next_prior.hpp>
|
|
#include <boost/range/begin.hpp>
|
|
#include <boost/range/concepts.hpp>
|
|
#include <boost/range/const_iterator.hpp>
|
|
#include <boost/range/difference_type.hpp>
|
|
#include <boost/range/distance.hpp>
|
|
#include <boost/range/empty.hpp>
|
|
#include <boost/range/iterator_range.hpp>
|
|
#include <boost/range/mutable_iterator.hpp>
|
|
#include <boost/range/rbegin.hpp>
|
|
#include <boost/range/rend.hpp>
|
|
#include <boost/range/value_type.hpp>
|
|
#include <boost/type_traits/is_same.hpp>
|
|
|
|
|
|
namespace boost { namespace range_detail_microsoft {
|
|
|
|
|
|
template< class Range1, class Range2 >
|
|
bool test_equals(Range1 const& rng1, Range2 const& rng2)
|
|
{
|
|
return
|
|
boost::distance(rng1) == boost::distance(rng2) &&
|
|
std::equal(boost::begin(rng1), boost::end(rng1), boost::begin(rng2))
|
|
;
|
|
}
|
|
|
|
|
|
template< class AssocContainer, class PairT >
|
|
bool test_find_key_and_mapped(AssocContainer const& ac, PairT const& pa)
|
|
{
|
|
typedef typename boost::range_const_iterator<AssocContainer>::type iter_t;
|
|
for (iter_t it = boost::const_begin(ac), last = boost::const_end(ac); it != last; ++it) {
|
|
if (it->first == pa.first && it->second == pa.second)
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
// test functions
|
|
//
|
|
|
|
template< class Range >
|
|
bool test_emptiness(Range& )
|
|
{
|
|
bool result = true;
|
|
|
|
Range emptyRng;
|
|
result = result && boost::empty(emptyRng);
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
template< class Range >
|
|
bool test_trivial(Range& rng)
|
|
{
|
|
bool result = true;
|
|
|
|
// convertibility check
|
|
typedef typename range_const_iterator<Range>::type citer_t;
|
|
citer_t cit = boost::begin(rng);
|
|
(void)cit; // unused
|
|
|
|
// mutability check
|
|
typedef typename range_value<Range>::type val_t;
|
|
val_t v = *boost::begin(rng);
|
|
*boost::begin(rng) = v;
|
|
result = result && *boost::begin(rng) == v;
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
template< class Range >
|
|
bool test_forward(Range& rng)
|
|
{
|
|
boost::function_requires< ForwardRangeConcept<Range> >();
|
|
|
|
bool result = (test_trivial)(rng);
|
|
|
|
typedef typename range_value<Range>::type val_t;
|
|
|
|
std::vector<val_t> saved;
|
|
std::copy(boost::begin(rng), boost::end(rng), std::back_inserter(saved));
|
|
std::rotate(boost::begin(saved), boost::next(boost::begin(saved)), boost::end(saved));
|
|
|
|
std::rotate(boost::begin(rng), boost::next(boost::begin(rng)), boost::end(rng));
|
|
|
|
return result && (test_equals)(saved, rng);
|
|
};
|
|
|
|
|
|
template< class Range >
|
|
bool test_bidirectional(Range& rng)
|
|
{
|
|
boost::function_requires< BidirectionalRangeConcept<Range> >();
|
|
|
|
bool result = (test_forward)(rng);
|
|
|
|
typedef typename range_value<Range>::type val_t;
|
|
|
|
std::vector<val_t> saved;
|
|
std::copy(boost::begin(rng), boost::end(rng), std::back_inserter(saved));
|
|
|
|
result = result && (test_equals)(
|
|
boost::make_iterator_range(boost::rbegin(saved), boost::rend(saved)),
|
|
boost::make_iterator_range(boost::rbegin(rng), boost::rend(rng))
|
|
);
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
template< class Range >
|
|
bool test_random_access(Range& rng)
|
|
{
|
|
boost::function_requires< RandomAccessRangeConcept<Range> >();
|
|
|
|
bool result = (test_bidirectional)(rng);
|
|
|
|
typedef typename range_value<Range>::type val_t;
|
|
|
|
std::vector<val_t> saved;
|
|
std::copy(boost::begin(rng), boost::end(rng), std::back_inserter(saved));
|
|
std::sort(boost::begin(saved), boost::end(saved));
|
|
|
|
std::random_shuffle(boost::begin(rng), boost::end(rng));
|
|
std::sort(boost::begin(rng), boost::end(rng));
|
|
result = result && (test_equals)(rng, saved);
|
|
|
|
std::random_shuffle(boost::begin(rng), boost::end(rng));
|
|
std::stable_sort(boost::begin(rng), boost::end(rng));
|
|
result = result && (test_equals)(rng, saved);
|
|
|
|
std::random_shuffle(boost::begin(rng), boost::end(rng));
|
|
std::partial_sort(boost::begin(rng), boost::end(rng), boost::end(rng));
|
|
result = result && (test_equals)(rng, saved);
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
// initializer
|
|
//
|
|
|
|
template< class ArrayT, class SampleRange >
|
|
bool test_init_array(ArrayT& arr, SampleRange const& sample)
|
|
{
|
|
typedef typename range_const_iterator<SampleRange>::type iter_t;
|
|
typedef typename range_value<SampleRange>::type val_t;
|
|
|
|
for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
|
|
val_t v = *it; // works around ATL3 CSimpleArray
|
|
arr.Add(v);
|
|
}
|
|
|
|
return (test_equals)(arr, sample);
|
|
}
|
|
|
|
|
|
template< class ListT, class SampleRange >
|
|
bool test_init_list(ListT& lst, SampleRange const& sample)
|
|
{
|
|
typedef typename range_const_iterator<SampleRange>::type iter_t;
|
|
|
|
for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
|
|
lst.AddTail(*it);
|
|
}
|
|
|
|
return (test_equals)(lst, sample);
|
|
}
|
|
|
|
|
|
template< class StringT, class SampleRange >
|
|
bool test_init_string(StringT& str, SampleRange const& sample)
|
|
{
|
|
typedef typename range_const_iterator<SampleRange>::type iter_t;
|
|
typedef typename range_value<SampleRange>::type val_t;
|
|
|
|
for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
|
|
str += *it;
|
|
}
|
|
|
|
return (test_equals)(str, sample);
|
|
}
|
|
|
|
|
|
template< class MapT, class SampleMap >
|
|
bool test_init_map(MapT& map, SampleMap const& sample)
|
|
{
|
|
typedef typename range_const_iterator<SampleMap>::type iter_t;
|
|
|
|
for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) {
|
|
map.SetAt(it->first, it->second);
|
|
}
|
|
|
|
return boost::distance(map) == boost::distance(sample);
|
|
}
|
|
|
|
|
|
// metafunction test
|
|
//
|
|
|
|
template< class Range, class Iter >
|
|
struct test_mutable_iter :
|
|
boost::is_same< typename boost::BOOST_RANGE_DETAIL_MICROSOFT_range_mutable_iterator<Range>::type, Iter >
|
|
{ };
|
|
|
|
|
|
template< class Range, class Iter >
|
|
struct test_const_iter :
|
|
boost::is_same< typename boost::range_const_iterator<Range>::type, Iter >
|
|
{ };
|
|
|
|
|
|
} } // namespace boost::range_detail_microsoft
|
|
|
|
|
|
#endif // defined(BOOST_RANGE_DETAIL_MICROSOFT_TEST)
|
|
|
|
|
|
|
|
#endif
|