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 + -
显示快捷键?