microsoft.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 932 行 · 第 1/2 页
HPP
932 行
#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>#endifnamespace 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 > \ { }; \ /**/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?