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

📄 control_structures_impl.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
📖 第 1 页 / 共 2 页
字号:
// Boost Lambda Library -- control_structures_impl.hpp ---------------------// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)// Copyright (C) 2000 Gary Powell (powellg@amazon.com)//// 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)//// For more information, see www.boost.org// --------------------------------------------------------------------------#if !defined(BOOST_LAMBDA_CONTROL_CONSTRUCTS_HPP)#define BOOST_LAMBDA_CONTROL_CONSTRUCTS_HPPnamespace boost { namespace lambda {// -- void return control actions ----------------------class forloop_action {};class forloop_no_body_action {};class ifthen_action {};class ifthenelse_action {};class whileloop_action {};class whileloop_no_body_action {};class dowhileloop_action {};class dowhileloop_no_body_action {};// -- nonvoid return control actions ----------------------class ifthenelsereturn_action {};// For looptemplate <class Arg1, class Arg2, class Arg3, class Arg4>inline const lambda_functor<  lambda_functor_base<    forloop_action,     tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,           lambda_functor<Arg3>, lambda_functor<Arg4> >  > >for_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2,          const lambda_functor<Arg3>& a3, const lambda_functor<Arg4>& a4) {   return       lambda_functor_base<        forloop_action,         tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,               lambda_functor<Arg3>, lambda_functor<Arg4> >      >     ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,             lambda_functor<Arg3>, lambda_functor<Arg4> >(a1, a2, a3, a4)    );}// No body case.template <class Arg1, class Arg2, class Arg3>inline const lambda_functor<  lambda_functor_base<    forloop_no_body_action,     tuple<lambda_functor<Arg1>, lambda_functor<Arg2>, lambda_functor<Arg3> >  > >for_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2,          const lambda_functor<Arg3>& a3) {   return       lambda_functor_base<        forloop_no_body_action,         tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,               lambda_functor<Arg3> >      >       ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,                lambda_functor<Arg3> >(a1, a2, a3) );}// While looptemplate <class Arg1, class Arg2>inline const lambda_functor<  lambda_functor_base<    whileloop_action,     tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >  > >while_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2) {   return       lambda_functor_base<        whileloop_action,         tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >      >       ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >(a1, a2));}// No body case.template <class Arg1>inline const lambda_functor<  lambda_functor_base<    whileloop_no_body_action,     tuple<lambda_functor<Arg1> >  > >while_loop(const lambda_functor<Arg1>& a1) {   return       lambda_functor_base<        whileloop_no_body_action,         tuple<lambda_functor<Arg1> >      >       ( tuple<lambda_functor<Arg1> >(a1) );}// Do While looptemplate <class Arg1, class Arg2>inline const lambda_functor<  lambda_functor_base<    dowhileloop_action,     tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >  > >do_while_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2) {  return       lambda_functor_base<        dowhileloop_action,         tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >      >       ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >(a1, a2));}// No body case.template <class Arg1>inline const lambda_functor<  lambda_functor_base<    dowhileloop_no_body_action,     tuple<lambda_functor<Arg1> >  > >do_while_loop(const lambda_functor<Arg1>& a1) {   return       lambda_functor_base<        dowhileloop_no_body_action,         tuple<lambda_functor<Arg1> >      >       ( tuple<lambda_functor<Arg1> >(a1));}// If Thentemplate <class Arg1, class Arg2>inline const lambda_functor<  lambda_functor_base<    ifthen_action,     tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >  > >if_then(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2) {  return     lambda_functor_base<      ifthen_action,       tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >     >     ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >(a1, a2) );}// If then elsetemplate <class Arg1, class Arg2, class Arg3>inline const lambda_functor<  lambda_functor_base<    ifthenelse_action,     tuple<lambda_functor<Arg1>, lambda_functor<Arg2>, lambda_functor<Arg3> >  > >if_then_else(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2,              const lambda_functor<Arg3>& a3) {  return     lambda_functor_base<      ifthenelse_action,       tuple<lambda_functor<Arg1>, lambda_functor<Arg2>, lambda_functor<Arg3> >    >     (tuple<lambda_functor<Arg1>, lambda_functor<Arg2>, lambda_functor<Arg3> >       (a1, a2, a3) );}// Our version of operator?:()template <class Arg1, class Arg2, class Arg3>inline const   lambda_functor<    lambda_functor_base<      other_action<ifthenelsereturn_action>,       tuple<lambda_functor<Arg1>,          typename const_copy_argument<Arg2>::type,          typename const_copy_argument<Arg3>::type>  > >if_then_else_return(const lambda_functor<Arg1>& a1,                     const Arg2 & a2,                     const Arg3 & a3) {  return       lambda_functor_base<        other_action<ifthenelsereturn_action>,         tuple<lambda_functor<Arg1>,              typename const_copy_argument<Arg2>::type,              typename const_copy_argument<Arg3>::type>      > ( tuple<lambda_functor<Arg1>,              typename const_copy_argument<Arg2>::type,              typename const_copy_argument<Arg3>::type> (a1, a2, a3) );}namespace detail {// return type specialization for conditional expression begins -----------// start reading below and move upwards// PHASE 6:1 // check if A is conbertible to B and B to Atemplate<int Phase, bool AtoB, bool BtoA, bool SameType, class A, class B>struct return_type_2_ifthenelsereturn;// if A can be converted to B and vice versa -> ambiguoustemplate<int Phase, class A, class B>struct return_type_2_ifthenelsereturn<Phase, true, true, false, A, B> {  typedef     detail::return_type_deduction_failure<return_type_2_ifthenelsereturn> type;  // ambiguous type in conditional expression};// if A can be converted to B and vice versa and are of same typetemplate<int Phase, class A, class B>struct return_type_2_ifthenelsereturn<Phase, true, true, true, A, B> {  typedef A type;};// A can be converted to Btemplate<int Phase, class A, class B>struct return_type_2_ifthenelsereturn<Phase, true, false, false, A, B> {  typedef B type;};// B can be converted to Atemplate<int Phase, class A, class B>struct return_type_2_ifthenelsereturn<Phase, false, true, false, A, B> {  typedef A type;};// neither can be converted. Then we drop the potential references, and// try againtemplate<class A, class B>struct return_type_2_ifthenelsereturn<1, false, false, false, A, B> {  // it is safe to add const, since the result will be an rvalue and thus  // const anyway. The const are needed eg. if the types   // are 'const int*' and 'void *'. The remaining type should be 'const void*'  typedef const typename boost::remove_reference<A>::type plainA;   typedef const typename boost::remove_reference<B>::type plainB;   // TODO: Add support for volatile ?  typedef typename       return_type_2_ifthenelsereturn<         2,         boost::is_convertible<plainA,plainB>::value,          boost::is_convertible<plainB,plainA>::value,         boost::is_same<plainA,plainB>::value,         plainA,          plainB>::type type;};// PHASE 6:2template<class A, class B>struct return_type_2_ifthenelsereturn<2, false, false, false, A, B> {

⌨️ 快捷键说明

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