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

📄 def_helper.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
字号:
// Copyright David Abrahams 2002.// 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 DEF_HELPER_DWA200287_HPP# define DEF_HELPER_DWA200287_HPP# include <boost/python/args.hpp># include <boost/type_traits/ice.hpp># include <boost/type_traits/same_traits.hpp># include <boost/python/detail/indirect_traits.hpp># include <boost/mpl/not.hpp># include <boost/mpl/and.hpp># include <boost/mpl/or.hpp># include <boost/type_traits/add_reference.hpp># include <boost/mpl/lambda.hpp># include <boost/mpl/apply.hpp># include <boost/tuple/tuple.hpp># include <boost/python/detail/not_specified.hpp># include <boost/python/detail/def_helper_fwd.hpp>namespace boost { namespace python {struct default_call_policies;namespace detail{  // tuple_extract<Tuple,Predicate>::extract(t) returns the first  // element of a Tuple whose type E satisfies the given Predicate  // applied to add_reference<E>. The Predicate must be an MPL  // metafunction class.  template <class Tuple, class Predicate>  struct tuple_extract;  // Implementation class for when the tuple's head type does not  // satisfy the Predicate  template <bool matched>  struct tuple_extract_impl  {      template <class Tuple, class Predicate>      struct apply      {          typedef typename Tuple::head_type result_type;                    static typename Tuple::head_type extract(Tuple const& x)          {              return x.get_head();          }      };  };  // Implementation specialization for when the tuple's head type  // satisfies the predicate  template <>  struct tuple_extract_impl<false>  {      template <class Tuple, class Predicate>      struct apply      {          // recursive application of tuple_extract on the tail of the tuple          typedef tuple_extract<typename Tuple::tail_type, Predicate> next;          typedef typename next::result_type result_type;                    static result_type extract(Tuple const& x)          {              return next::extract(x.get_tail());          }      };  };  // A metafunction which selects a version of tuple_extract_impl to  // use for the implementation of tuple_extract  template <class Tuple, class Predicate>  struct tuple_extract_base_select  {      typedef typename Tuple::head_type head_type;      typedef typename mpl::apply1<Predicate, typename add_reference<head_type>::type>::type match_t;      BOOST_STATIC_CONSTANT(bool, match = match_t::value);      typedef typename tuple_extract_impl<match>::template apply<Tuple,Predicate> type;  };    template <class Tuple, class Predicate>  struct tuple_extract      : tuple_extract_base_select<         Tuple         , typename mpl::lambda<Predicate>::type      >::type  {  };  //  // Specialized extractors for the docstring, keywords, CallPolicies,  // and default implementation of virtual functions  //  template <class Tuple>  struct doc_extract      : tuple_extract<        Tuple        , mpl::not_<           mpl::or_<               indirect_traits::is_reference_to_class<mpl::_1>             , indirect_traits::is_reference_to_member_function_pointer<mpl::_1 >           >        >     >  {  };    template <class Tuple>  struct keyword_extract      : tuple_extract<Tuple, is_reference_to_keywords<mpl::_1 > >  {  };  template <class Tuple>  struct policy_extract      : tuple_extract<          Tuple          , mpl::and_<             mpl::not_<is_same<not_specified const&,mpl::_1> >              , indirect_traits::is_reference_to_class<mpl::_1 >              , mpl::not_<is_reference_to_keywords<mpl::_1 > >          >        >  {  };  template <class Tuple>  struct default_implementation_extract      : tuple_extract<          Tuple          , indirect_traits::is_reference_to_member_function_pointer<mpl::_1 >          >  {  };  //  // A helper class for decoding the optional arguments to def()  // invocations, which can be supplied in any order and are  // discriminated by their type properties. The template parameters  // are expected to be the types of the actual (optional) arguments  // passed to def().  //  template <class T1, class T2, class T3, class T4>  struct def_helper  {      // A tuple type which begins with references to the supplied      // arguments and ends with actual representatives of the default      // types.      typedef boost::tuples::tuple<          T1 const&          , T2 const&          , T3 const&          , T4 const&          , default_call_policies          , keywords<0>          , char const*          , void(not_specified::*)()   // A function pointer type which is never an                                       // appropriate default implementation          > all_t;      // Constructors; these initialize an member of the tuple type      // shown above.      def_helper(T1 const& a1) : m_all(a1,m_nil,m_nil,m_nil) {}      def_helper(T1 const& a1, T2 const& a2) : m_all(a1,a2,m_nil,m_nil) {}      def_helper(T1 const& a1, T2 const& a2, T3 const& a3) : m_all(a1,a2,a3,m_nil) {}      def_helper(T1 const& a1, T2 const& a2, T3 const& a3, T4 const& a4) : m_all(a1,a2,a3,a4) {}   private: // types      typedef typename default_implementation_extract<all_t>::result_type default_implementation_t;         public: // Constants which can be used for static assertions.      // Users must not supply a default implementation for non-class      // methods.      BOOST_STATIC_CONSTANT(          bool, has_default_implementation = (              !is_same<default_implementation_t, void(not_specified::*)()>::value));         public: // Extractor functions which pull the appropriate value out           // of the tuple      char const* doc() const      {          return doc_extract<all_t>::extract(m_all);      }            typename keyword_extract<all_t>::result_type keywords() const      {          return keyword_extract<all_t>::extract(m_all);      }            typename policy_extract<all_t>::result_type policies() const      {          return policy_extract<all_t>::extract(m_all);      }      default_implementation_t default_implementation() const      {          return default_implementation_extract<all_t>::extract(m_all);      }         private: // data members      all_t m_all;       not_specified m_nil; // for filling in not_specified slots  };}}} // namespace boost::python::detail#endif // DEF_HELPER_DWA200287_HPP

⌨️ 快捷键说明

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