Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/spirit/home/classic/phoenix/statements.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/spirit/home/classic/phoenix/statements.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,443 @@ +/*============================================================================= + Phoenix V1.2.1 + Copyright (c) 2001-2002 Joel de Guzman + + 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 PHOENIX_STATEMENTS_HPP +#define PHOENIX_STATEMENTS_HPP + +/////////////////////////////////////////////////////////////////////////////// +#include <boost/spirit/home/classic/phoenix/composite.hpp> + +/////////////////////////////////////////////////////////////////////////////// +namespace phoenix { + +/////////////////////////////////////////////////////////////////////////////// +// +// sequential_composite +// +// Two or more actors separated by the comma generates a +// sequential_composite which is a composite actor. Example: +// +// actor, +// actor, +// actor +// +// The actors are evaluated sequentially. The result type of this +// is void. Note that the last actor should not have a trailing +// comma. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename A0, typename A1> +struct sequential_composite { + + typedef sequential_composite<A0, A1> self_t; + + template <typename TupleT> + struct result { typedef void type; }; + + sequential_composite(A0 const& _0, A1 const& _1) + : a0(_0), a1(_1) {} + + template <typename TupleT> + void + eval(TupleT const& args) const + { + a0.eval(args); + a1.eval(args); + } + + A0 a0; A1 a1; // actors +}; + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline actor<sequential_composite<actor<BaseT0>, actor<BaseT1> > > +operator,(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return sequential_composite<actor<BaseT0>, actor<BaseT1> >(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// if_then_else_composite +// +// This composite has two (2) forms: +// +// if_(condition) +// [ +// statement +// ] +// +// and +// +// if_(condition) +// [ +// true_statement +// ] +// .else_ +// [ +// false_statement +// ] +// +// where condition is an actor that evaluates to bool. If condition +// is true, the true_statement (again an actor) is executed +// otherwise, the false_statement (another actor) is executed. The +// result type of this is void. Note the trailing underscore after +// if_ and the the leading dot and the trailing underscore before +// and after .else_. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename CondT, typename ThenT, typename ElseT> +struct if_then_else_composite { + + typedef if_then_else_composite<CondT, ThenT, ElseT> self_t; + + template <typename TupleT> + struct result { + + typedef void type; + }; + + if_then_else_composite( + CondT const& cond_, + ThenT const& then_, + ElseT const& else__) + : cond(cond_), then(then_), else_(else__) {} + + template <typename TupleT> + void eval(TupleT const& args) const + { + if (cond.eval(args)) + then.eval(args); + else + else_.eval(args); + } + + CondT cond; ThenT then; ElseT else_; // actors +}; + +////////////////////////////////// +template <typename CondT, typename ThenT> +struct else_gen { + + else_gen(CondT const& cond_, ThenT const& then_) + : cond(cond_), then(then_) {} + + template <typename ElseT> + actor<if_then_else_composite<CondT, ThenT, + typename as_actor<ElseT>::type> > + operator[](ElseT const& else_) + { + typedef if_then_else_composite<CondT, ThenT, + typename as_actor<ElseT>::type> + result; + + return result(cond, then, as_actor<ElseT>::convert(else_)); + } + + CondT cond; ThenT then; +}; + +////////////////////////////////// +template <typename CondT, typename ThenT> +struct if_then_composite { + + typedef if_then_composite<CondT, ThenT> self_t; + + template <typename TupleT> + struct result { typedef void type; }; + + if_then_composite(CondT const& cond_, ThenT const& then_) + : cond(cond_), then(then_), else_(cond, then) {} + + template <typename TupleT> + void eval(TupleT const& args) const + { + if (cond.eval(args)) + then.eval(args); + } + + CondT cond; ThenT then; // actors + else_gen<CondT, ThenT> else_; +}; + +////////////////////////////////// +template <typename CondT> +struct if_gen { + + if_gen(CondT const& cond_) + : cond(cond_) {} + + template <typename ThenT> + actor<if_then_composite< + typename as_actor<CondT>::type, + typename as_actor<ThenT>::type> > + operator[](ThenT const& then) const + { + typedef if_then_composite< + typename as_actor<CondT>::type, + typename as_actor<ThenT>::type> + result; + + return result( + as_actor<CondT>::convert(cond), + as_actor<ThenT>::convert(then)); + } + + CondT cond; +}; + +////////////////////////////////// +template <typename CondT> +inline if_gen<CondT> +if_(CondT const& cond) +{ + return if_gen<CondT>(cond); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// while_composite +// +// This composite has the form: +// +// while_(condition) +// [ +// statement +// ] +// +// While the condition (an actor) evaluates to true, statement +// (another actor) is executed. The result type of this is void. +// Note the trailing underscore after while_. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename CondT, typename DoT> +struct while_composite { + + typedef while_composite<CondT, DoT> self_t; + + template <typename TupleT> + struct result { typedef void type; }; + + while_composite(CondT const& cond_, DoT const& do__) + : cond(cond_), do_(do__) {} + + template <typename TupleT> + void eval(TupleT const& args) const + { + while (cond.eval(args)) + do_.eval(args); + } + + CondT cond; + DoT do_; +}; + +////////////////////////////////// +template <typename CondT> +struct while_gen { + + while_gen(CondT const& cond_) + : cond(cond_) {} + + template <typename DoT> + actor<while_composite< + typename as_actor<CondT>::type, + typename as_actor<DoT>::type> > + operator[](DoT const& do_) const + { + typedef while_composite< + typename as_actor<CondT>::type, + typename as_actor<DoT>::type> + result; + + return result( + as_actor<CondT>::convert(cond), + as_actor<DoT>::convert(do_)); + } + + CondT cond; +}; + +////////////////////////////////// +template <typename CondT> +inline while_gen<CondT> +while_(CondT const& cond) +{ + return while_gen<CondT>(cond); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// do_composite +// +// This composite has the form: +// +// do_ +// [ +// statement +// ] +// .while_(condition) +// +// While the condition (an actor) evaluates to true, statement +// (another actor) is executed. The statement is executed at least +// once. The result type of this is void. Note the trailing +// underscore after do_ and the the leading dot and the trailing +// underscore before and after .while_. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename DoT, typename CondT> +struct do_composite { + + typedef do_composite<DoT, CondT> self_t; + + template <typename TupleT> + struct result { typedef void type; }; + + do_composite(DoT const& do__, CondT const& cond_) + : do_(do__), cond(cond_) {} + + template <typename TupleT> + void eval(TupleT const& args) const + { + do + do_.eval(args); + while (cond.eval(args)); + } + + DoT do_; + CondT cond; +}; + +//////////////////////////////////// +template <typename DoT> +struct do_gen2 { + + do_gen2(DoT const& do__) + : do_(do__) {} + + template <typename CondT> + actor<do_composite< + typename as_actor<DoT>::type, + typename as_actor<CondT>::type> > + while_(CondT const& cond) const + { + typedef do_composite< + typename as_actor<DoT>::type, + typename as_actor<CondT>::type> + result; + + return result( + as_actor<DoT>::convert(do_), + as_actor<CondT>::convert(cond)); + } + + DoT do_; +}; + +//////////////////////////////////// +struct do_gen { + + template <typename DoT> + do_gen2<DoT> + operator[](DoT const& do_) const + { + return do_gen2<DoT>(do_); + } +}; + +do_gen const do_ = do_gen(); + +/////////////////////////////////////////////////////////////////////////////// +// +// for_composite +// +// This statement has the form: +// +// for_(init, condition, step) +// [ +// statement +// ] +// +// Where init, condition, step and statement are all actors. init +// is executed once before entering the for-loop. The for-loop +// exits once condition evaluates to false. At each loop iteration, +// step and statement is called. The result of this statement is +// void. Note the trailing underscore after for_. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename InitT, typename CondT, typename StepT, typename DoT> +struct for_composite { + + typedef composite<InitT, CondT, StepT, DoT> self_t; + + template <typename TupleT> + struct result { typedef void type; }; + + for_composite( + InitT const& init_, + CondT const& cond_, + StepT const& step_, + DoT const& do__) + : init(init_), cond(cond_), step(step_), do_(do__) {} + + template <typename TupleT> + void + eval(TupleT const& args) const + { + for (init.eval(args); cond.eval(args); step.eval(args)) + do_.eval(args); + } + + InitT init; CondT cond; StepT step; DoT do_; // actors +}; + +////////////////////////////////// +template <typename InitT, typename CondT, typename StepT> +struct for_gen { + + for_gen( + InitT const& init_, + CondT const& cond_, + StepT const& step_) + : init(init_), cond(cond_), step(step_) {} + + template <typename DoT> + actor<for_composite< + typename as_actor<InitT>::type, + typename as_actor<CondT>::type, + typename as_actor<StepT>::type, + typename as_actor<DoT>::type> > + operator[](DoT const& do_) const + { + typedef for_composite< + typename as_actor<InitT>::type, + typename as_actor<CondT>::type, + typename as_actor<StepT>::type, + typename as_actor<DoT>::type> + result; + + return result( + as_actor<InitT>::convert(init), + as_actor<CondT>::convert(cond), + as_actor<StepT>::convert(step), + as_actor<DoT>::convert(do_)); + } + + InitT init; CondT cond; StepT step; +}; + +////////////////////////////////// +template <typename InitT, typename CondT, typename StepT> +inline for_gen<InitT, CondT, StepT> +for_(InitT const& init, CondT const& cond, StepT const& step) +{ + return for_gen<InitT, CondT, StepT>(init, cond, step); +} + +} // namespace phoenix + +#endif