primitives.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 249 行

HPP
249
字号
/*=============================================================================    Phoenix V1.2.1    Copyright (c) 2001-2002 Joel de Guzman    Use, modification and distribution is subject to 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_PRIMITIVES_HPP#define PHOENIX_PRIMITIVES_HPP///////////////////////////////////////////////////////////////////////////////#include <boost/spirit/phoenix/actor.hpp>///////////////////////////////////////////////////////////////////////////////namespace phoenix {///////////////////////////////////////////////////////////////////////////////////  argument class////      Lazy arguments////      An actor base class that extracts and returns the Nth argument//      from the argument list passed in the 'args' tuple in the eval//      member function (see actor.hpp). There are some predefined//      argument constants that can be used as actors (arg1..argN).////      The argument actor is a place-holder for the actual arguments//      passed by the client. For example, wherever arg1 is seen placed//      in a lazy function (see functions.hpp) or lazy operator (see//      operators.hpp), this will be replaced by the actual first//      argument in the actual function evaluation. Argument actors are//      essentially lazy arguments. A lazy argument is a full actor in//      its own right and can be evaluated through the actor's operator().////      Example:////          char        c = 'A';//          int         i = 123;//          const char* s = "Hello World";////          cout << arg1(c) << ' ';//          cout << arg1(i, s) << ' ';//          cout << arg2(i, s) << ' ';////       will print out "A 123 Hello World"/////////////////////////////////////////////////////////////////////////////////template <int N>struct argument {    template <typename TupleT>    struct result { typedef typename tuple_element<N, TupleT>::type type; };    template <typename TupleT>    typename tuple_element<N, TupleT>::type    eval(TupleT const& args) const    {        return args[tuple_index<N>()];    }};//////////////////////////////////actor<argument<0> > const arg1 = argument<0>();actor<argument<1> > const arg2 = argument<1>();actor<argument<2> > const arg3 = argument<2>();#if PHOENIX_LIMIT > 3actor<argument<3> > const arg4 = argument<3>();actor<argument<4> > const arg5 = argument<4>();actor<argument<5> > const arg6 = argument<5>();#if PHOENIX_LIMIT > 6actor<argument<6> > const arg7 = argument<6>();actor<argument<7> > const arg8 = argument<7>();actor<argument<8> > const arg9 = argument<8>();#if PHOENIX_LIMIT > 9actor<argument<9> > const arg10 = argument<9>();actor<argument<10> > const arg11 = argument<10>();actor<argument<11> > const arg12 = argument<11>();#if PHOENIX_LIMIT > 12actor<argument<12> > const arg13 = argument<12>();actor<argument<13> > const arg14 = argument<13>();actor<argument<14> > const arg15 = argument<14>();#endif#endif#endif#endif///////////////////////////////////////////////////////////////////////////////////  value class////      Lazy values////      A bound actual parameter is kept in a value class for deferred//      access later when needed. A value object is immutable. Value//      objects are typically created through the val(x) free function//      which returns a value<T> with T deduced from the type of x. x is//      held in the value<T> object by value.////      Lazy values are actors. As such, lazy values can be evaluated//      through the actor's operator(). Such invocation gives the value's//      identity. Example:////          cout << val(3)() << val("Hello World")();////      prints out "3 Hello World"/////////////////////////////////////////////////////////////////////////////////template <typename T>struct value {    typedef typename boost::remove_reference<T>::type plain_t;    template <typename TupleT>    struct result { typedef plain_t const type; };    value(plain_t val_)    :   val(val_) {}    template <typename TupleT>    plain_t const    eval(TupleT const& /*args*/) const    {        return val;    }    plain_t val;};//////////////////////////////////template <typename T>inline actor<value<T> > constval(T v){    return value<T>(v);}//////////////////////////////////template <typename BaseT>voidval(actor<BaseT> const& v);     //  This is undefined and not allowed.///////////////////////////////////////////////////////////////////////////////  Arbitrary types T are typically converted to a actor<value<T> >//  (see as_actor<T> in actor.hpp). A specialization is also provided//  for arrays. T[N] arrays are converted to actor<value<T const*> >./////////////////////////////////////////////////////////////////////////////template <typename T>struct as_actor {    typedef actor<value<T> > type;    static type convert(T const& x)    { return value<T>(x); }};//////////////////////////////////template <typename T, int N>struct as_actor<T[N]> {    typedef actor<value<T const*> > type;    static type convert(T const x[N])    { return value<T const*>(x); }};///////////////////////////////////////////////////////////////////////////////////  variable class////      Lazy variables////      A bound actual parameter may also be held by non-const reference//      in a variable class for deferred access later when needed. A//      variable object is mutable, i.e. its referenced variable can be//      modified. Variable objects are typically created through the//      var(x) free function which returns a variable<T> with T deduced//      from the type of x. x is held in the value<T> object by//      reference.////      Lazy variables are actors. As such, lazy variables can be//      evaluated through the actor's operator(). Such invocation gives//      the variables's identity. Example:////          int i = 3;//          char const* s = "Hello World";//          cout << var(i)() << var(s)();////      prints out "3 Hello World"////      Another free function const_(x) may also be used. const_(x) creates//      a variable<T const&> object using a constant reference./////////////////////////////////////////////////////////////////////////////////template <typename T>struct variable {    template <typename TupleT>    struct result { typedef T& type; };    variable(T& var_)    :   var(var_) {}    template <typename TupleT>    T&    eval(TupleT const& /*args*/) const    {        return var;    }    T& var;};//////////////////////////////////template <typename T>inline actor<variable<T> > constvar(T& v){    return variable<T>(v);}//////////////////////////////////template <typename T>inline actor<variable<T const> > constconst_(T const& v){    return variable<T const>(v);}//////////////////////////////////template <typename BaseT>voidvar(actor<BaseT> const& v);     //  This is undefined and not allowed.//////////////////////////////////template <typename BaseT>voidconst_(actor<BaseT> const& v);  //  This is undefined and not allowed.///////////////////////////////////////////////////////////////////////////////}   //  namespace phoenix#endif

⌨️ 快捷键说明

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