📄 control_structures_impl.hpp
字号:
// 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 + -