⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 initializer.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
字号:
//-----------------------------------------------------------------------------// boost variant/detail/initializer.hpp header file// See http://www.boost.org for updates, documentation, and revision history.//-----------------------------------------------------------------------------//// Copyright (c) 2002-2003// Eric Friedman, Itay Maman//// 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)#ifndef BOOST_VARIANT_DETAIL_INITIALIZER_HPP#define BOOST_VARIANT_DETAIL_INITIALIZER_HPP#include <new> // for placement new#include "boost/config.hpp"#include "boost/call_traits.hpp"#include "boost/detail/reference_content.hpp"#include "boost/variant/recursive_wrapper_fwd.hpp"#if !defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)#   include "boost/mpl/aux_/value_wknd.hpp"#   include "boost/mpl/int.hpp"#   include "boost/mpl/iter_fold.hpp"#   include "boost/mpl/next.hpp"#   include "boost/mpl/deref.hpp"#   include "boost/mpl/pair.hpp"#   include "boost/mpl/protect.hpp"#else#   include "boost/variant/variant_fwd.hpp"#   include "boost/preprocessor/cat.hpp"#   include "boost/preprocessor/enum.hpp"#   include "boost/preprocessor/repeat.hpp"#endifnamespace boost {namespace detail { namespace variant {///////////////////////////////////////////////////////////////////////////////// (detail) support to simulate standard overload resolution rules//// The below initializers allows variant to follow standard overload// resolution rules over the specified set of bounded types.//// On compilers where using declarations in class templates can correctly// avoid name hiding, use an optimal solution based on the variant's typelist.//// Otherwise, use a preprocessor workaround based on knowledge of the fixed// size of the variant's psuedo-variadic template parameter list.//#if !defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)// (detail) quoted metafunction make_initializer_node//// Exposes a pair whose first type is a node in the initializer hierarchy.//struct make_initializer_node{    template <typename BaseIndexPair, typename Iterator>    struct apply    {    private: // helpers, for metafunction result (below)        typedef typename BaseIndexPair::first            base;        typedef typename BaseIndexPair::second            index;        class initializer_node            : public base        {        private: // helpers, for static functions (below)            typedef typename mpl::deref<Iterator>::type                recursive_enabled_T;            typedef typename unwrap_recursive<recursive_enabled_T>::type                public_T;            typedef typename call_traits<public_T>::param_type                param_T;        public: // static functions            using base::initialize;            static int initialize(void* dest, param_T operand)            {                typedef typename boost::detail::make_reference_content<                      recursive_enabled_T                    >::type internal_T;                new(dest) internal_T(operand);                return BOOST_MPL_AUX_VALUE_WKND(index)::value; // which            }        };        friend class initializer_node;    public: // metafunction result        typedef mpl::pair<              initializer_node            , typename mpl::next< index >::type            > type;    };};// (detail) class initializer_root//// Every level of the initializer hierarchy must expose the name// "initialize," so initializer_root provides a dummy function://class initializer_root{public: // static functions    static void initialize();};#else // defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)#   if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)     #define BOOST_VARIANT_AUX_PP_INITIALIZER_TEMPLATE_PARAMS \          BOOST_VARIANT_ENUM_PARAMS(typename recursive_enabled_T) \    /**/    #define BOOST_VARIANT_AUX_PP_INITIALIZER_DEFINE_PARAM_T(N) \        typedef typename unwrap_recursive< \              BOOST_PP_CAT(recursive_enabled_T,N) \            >::type BOOST_PP_CAT(public_T,N); \        typedef typename call_traits< \              BOOST_PP_CAT(public_T,N) \            >::param_type BOOST_PP_CAT(param_T,N); \    /**/#   else // MSVC7 and below    #define BOOST_VARIANT_AUX_PP_INITIALIZER_TEMPLATE_PARAMS \          BOOST_VARIANT_ENUM_PARAMS(typename recursive_enabled_T) \        , BOOST_VARIANT_ENUM_PARAMS(typename param_T) \    /**/    #define BOOST_VARIANT_AUX_PP_INITIALIZER_DEFINE_PARAM_T(N) \    /**/#   endif // MSVC7 and below workaroundtemplate < BOOST_VARIANT_AUX_PP_INITIALIZER_TEMPLATE_PARAMS >struct preprocessor_list_initializer{public: // static functions    #define BOOST_VARIANT_AUX_PP_INITIALIZE_FUNCTION(z,N,_) \        BOOST_VARIANT_AUX_PP_INITIALIZER_DEFINE_PARAM_T(N) \        static int initialize( \              void* dest \            , BOOST_PP_CAT(param_T,N) operand \            ) \        { \            typedef typename boost::detail::make_reference_content< \                  BOOST_PP_CAT(recursive_enabled_T,N) \                >::type internal_T; \            \            new(dest) internal_T(operand); \            return (N); /*which*/ \        } \        /**/    BOOST_PP_REPEAT(          BOOST_VARIANT_LIMIT_TYPES        , BOOST_VARIANT_AUX_PP_INITIALIZE_FUNCTION        , _        )    #undef BOOST_VARIANT_AUX_PP_INITIALIZE_FUNCTION};#   if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)#if !defined(BOOST_VARIANT_AUX_ECHO)#   define BOOST_VARIANT_AUX_ECHO(z,N,token) token#endiftemplate <>struct preprocessor_list_initializer<      BOOST_PP_ENUM(BOOST_VARIANT_LIMIT_TYPES, BOOST_VARIANT_AUX_ECHO, int)    , BOOST_PP_ENUM(BOOST_VARIANT_LIMIT_TYPES, BOOST_VARIANT_AUX_ECHO, const int)    >{};#   endif // BOOST_MPL_CFG_MSVC_60_ETI_BUG workaround#endif // BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE workaround}} // namespace detail::variant} // namespace boost///////////////////////////////////////////////////////////////////////////////// macro BOOST_VARIANT_AUX_INITIALIZER_T//// Given both the variant's typelist and a basename for forming the list of// bounded types (i.e., T becomes T1, T2, etc.), exposes the initializer// most appropriate to the current compiler.//#if !defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)#define BOOST_VARIANT_AUX_INITIALIZER_T( mpl_seq, typename_base ) \    ::boost::mpl::iter_fold< \          mpl_seq \        , ::boost::mpl::pair< \              ::boost::detail::variant::initializer_root \            , ::boost::mpl::int_<0> \            > \        , ::boost::mpl::protect< \              ::boost::detail::variant::make_initializer_node \            > \        >::type::first \    /**/#else // defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)#   if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)    #define BOOST_VARIANT_AUX_PP_INITIALIZER_TEMPLATE_ARGS(typename_base) \          BOOST_VARIANT_ENUM_PARAMS(typename_base) \        /**/#   else // MSVC7 and below    #define BOOST_VARIANT_AUX_PP_INITIALIZER_ENUM_PARAM_TYPE(z,N,T) \        ::boost::call_traits< \              ::boost::unwrap_recursive<BOOST_PP_CAT(T,N)>::type \            >::param_type \        /**/    #define BOOST_VARIANT_AUX_PP_INITIALIZER_TEMPLATE_ARGS(typename_base) \          BOOST_VARIANT_ENUM_PARAMS(typename_base) \        , BOOST_PP_ENUM( \              BOOST_VARIANT_LIMIT_TYPES \            , BOOST_VARIANT_AUX_PP_INITIALIZER_ENUM_PARAM_TYPE \            , typename_base \            ) \        /**/#   endif // MSVC7 workaround#define BOOST_VARIANT_AUX_INITIALIZER_T( mpl_seq, typename_base ) \    ::boost::detail::variant::preprocessor_list_initializer< \          BOOST_VARIANT_AUX_PP_INITIALIZER_TEMPLATE_ARGS(typename_base) \        > \    /**/#endif // BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE workaround#endif // BOOST_VARIANT_DETAIL_INITIALIZER_HPP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -