casts.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 1,472 行 · 第 1/3 页

HPP
1,472
字号
/*=============================================================================    Phoenix V1.2.1    Copyright (c) 2001-2003 Joel de Guzman    Copyright (c) 2001-2003 Hartmut Kaiser    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_CASTS_HPP#define PHOENIX_CASTS_HPP///////////////////////////////////////////////////////////////////////////////#include <boost/spirit/phoenix/actor.hpp>#include <boost/spirit/phoenix/composite.hpp>#include <boost/static_assert.hpp>///////////////////////////////////////////////////////////////////////////////namespace phoenix {///////////////////////////////////////////////////////////////////////////////////  Phoenix predefined maximum construct_ limit. This limit defines the maximum//  number of parameters supported for calles to the set of construct_ template//  functions (lazy object construction, see below). This number defaults to 3.//  The actual maximum is rounded up in multiples of 3. Thus, if this value//  is 4, the actual limit is 6. The ultimate maximum limit in this//  implementation is 15.//  PHOENIX_CONSTRUCT_LIMIT should NOT be greater than PHOENIX_LIMIT!#if !defined(PHOENIX_CONSTRUCT_LIMIT)#define PHOENIX_CONSTRUCT_LIMIT PHOENIX_LIMIT#endif// ensure PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMITBOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT);// ensure PHOENIX_CONSTRUCT_LIMIT <= 15BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= 15);///////////////////////////////////////////////////////////////////////////////////  Lazy C++ casts////      The set of lazy C++ cast template classes and functions provide a way//      of lazily casting certain type to another during parsing.//      The lazy C++ templates are (syntactically) used very much like//      the well known C++ casts:////          A *a = static_cast_<A *>(...actor returning a convertible type...);////      where the given parameter should be an actor, which eval() function//      returns a convertible type./////////////////////////////////////////////////////////////////////////////////template <typename T, typename A>struct static_cast_l {    template <typename TupleT>    struct result { typedef T type; };    static_cast_l(A const& a_)    :   a(a_) {}    template <typename TupleT>    T    eval(TupleT const& args) const    {        return static_cast<T>(a.eval(args));    }    A a;};//////////////////////////////////template <typename T, typename BaseAT>inline actor<static_cast_l<T, BaseAT> >static_cast_(actor<BaseAT> const& a){    typedef static_cast_l<T, BaseAT> cast_t;    return actor<cast_t>(cast_t(a));}//////////////////////////////////template <typename T, typename A>struct dynamic_cast_l {    template <typename TupleT>    struct result { typedef T type; };    dynamic_cast_l(A const& a_)    :   a(a_) {}    template <typename TupleT>    T    eval(TupleT const& args) const    {        return dynamic_cast<T>(a.eval(args));    }    A a;};//////////////////////////////////template <typename T, typename BaseAT>inline actor<dynamic_cast_l<T, BaseAT> >dynamic_cast_(actor<BaseAT> const& a){    typedef dynamic_cast_l<T, BaseAT> cast_t;    return actor<cast_t>(cast_t(a));}//////////////////////////////////template <typename T, typename A>struct reinterpret_cast_l {    template <typename TupleT>    struct result { typedef T type; };    reinterpret_cast_l(A const& a_)    :   a(a_) {}    template <typename TupleT>    T    eval(TupleT const& args) const    {        return reinterpret_cast<T>(a.eval(args));    }    A a;};//////////////////////////////////template <typename T, typename BaseAT>inline actor<reinterpret_cast_l<T, BaseAT> >reinterpret_cast_(actor<BaseAT> const& a){    typedef reinterpret_cast_l<T, BaseAT> cast_t;    return actor<cast_t>(cast_t(a));}//////////////////////////////////template <typename T, typename A>struct const_cast_l {    template <typename TupleT>    struct result { typedef T type; };    const_cast_l(A const& a_)    :   a(a_) {}    template <typename TupleT>    T    eval(TupleT const& args) const    {        return const_cast<T>(a.eval(args));    }    A a;};//////////////////////////////////template <typename T, typename BaseAT>inline actor<const_cast_l<T, BaseAT> >const_cast_(actor<BaseAT> const& a){    typedef const_cast_l<T, BaseAT> cast_t;    return actor<cast_t>(cast_t(a));}///////////////////////////////////////////////////////////////////////////////////  construct_////      Lazy object construction////      The set of construct_<> template classes and functions provide a way//      of lazily constructing certain object from a arbitrary set of//      actors during parsing.//      The construct_ templates are (syntactically) used very much like//      the well known C++ casts:////          A a = construct_<A>(...arbitrary list of actors...);////      where the given parameters are submitted as parameters to the//      contructor of the object of type A. (This certainly implies, that//      type A has a constructor with a fitting set of parameter types//      defined.)////      The maximum number of needed parameters is controlled through the//      preprocessor constant PHOENIX_CONSTRUCT_LIMIT. Note though, that this//      limit should not be greater than PHOENIX_LIMIT./////////////////////////////////////////////////////////////////////////////////template <typename T>struct construct_l_0 {    typedef T result_type;    T operator()() const {        return T();    }};template <typename T>struct construct_l {    template <            typename A        ,   typename B        ,   typename C#if PHOENIX_CONSTRUCT_LIMIT > 3        ,   typename D        ,   typename E        ,   typename F#if PHOENIX_CONSTRUCT_LIMIT > 6        ,   typename G        ,   typename H        ,   typename I#if PHOENIX_CONSTRUCT_LIMIT > 9        ,   typename J        ,   typename K        ,   typename L#if PHOENIX_CONSTRUCT_LIMIT > 12        ,   typename M        ,   typename N        ,   typename O#endif#endif#endif#endif    >    struct result { typedef T type; };    T operator()() const     {        return T();    }    template <typename A>    T operator()(A const& a) const     {        T t(a);         return t;    }    template <typename A, typename B>    T operator()(A const& a, B const& b) const     {        T t(a, b);        return t;    }    template <typename A, typename B, typename C>    T operator()(A const& a, B const& b, C const& c) const     {        T t(a, b, c);        return t;    }#if PHOENIX_CONSTRUCT_LIMIT > 3    template <        typename A, typename B, typename C, typename D    >    T operator()(        A const& a, B const& b, C const& c, D const& d) const    {        T t(a, b, c, d);        return t;    }    template <        typename A, typename B, typename C, typename D, typename E    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e) const    {        T t(a, b, c, d, e);        return t;    }    template <        typename A, typename B, typename C, typename D, typename E,        typename F    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e,        F const& f) const    {        T t(a, b, c, d, e, f);        return t;    }#if PHOENIX_CONSTRUCT_LIMIT > 6    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e,        F const& f, G const& g) const    {        T t(a, b, c, d, e, f, g);        return t;    }    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e,        F const& f, G const& g, H const& h) const    {        T t(a, b, c, d, e, f, g, h);        return t;    }    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e,        F const& f, G const& g, H const& h, I const& i) const    {        T t(a, b, c, d, e, f, g, h, i);        return t;    }#if PHOENIX_CONSTRUCT_LIMIT > 9    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e,        F const& f, G const& g, H const& h, I const& i, J const& j) const    {        T t(a, b, c, d, e, f, g, h, i, j);        return t;    }    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J,        typename K    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e,        F const& f, G const& g, H const& h, I const& i, J const& j,        K const& k) const    {        T t(a, b, c, d, e, f, g, h, i, j, k);        return t;    }    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J,        typename K, typename L    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e,        F const& f, G const& g, H const& h, I const& i, J const& j,        K const& k, L const& l) const    {        T t(a, b, c, d, e, f, g, h, i, j, k, l);        return t;    }#if PHOENIX_CONSTRUCT_LIMIT > 12    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J,        typename K, typename L, typename M    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e,        F const& f, G const& g, H const& h, I const& i, J const& j,        K const& k, L const& l, M const& m) const    {        T t(a, b, c, d, e, f, g, h, i, j, k, l, m);        return t;    }    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J,        typename K, typename L, typename M, typename N    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e,        F const& f, G const& g, H const& h, I const& i, J const& j,        K const& k, L const& l, M const& m, N const& n) const    {        T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);        return t;    }    template <        typename A, typename B, typename C, typename D, typename E,        typename F, typename G, typename H, typename I, typename J,        typename K, typename L, typename M, typename N, typename O    >    T operator()(        A const& a, B const& b, C const& c, D const& d, E const& e,        F const& f, G const& g, H const& h, I const& i, J const& j,        K const& k, L const& l, M const& m, N const& n, O const& o) const    {        T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);        return t;    }#endif#endif#endif#endif};template <typename T>struct construct_1 {    template <            typename A    >    struct result { typedef T type; };    template <typename A>    T operator()(A const& a) const     {        T t(a);        return t;    }};template <typename T>struct construct_2 {    template <            typename A        ,   typename B    >    struct result { typedef T type; };    template <typename A, typename B>    T operator()(A const& a, B const& b) const     {        T t(a, b);        return t;    }};template <typename T>struct construct_3 {    template <            typename A        ,   typename B        ,   typename C    >    struct result { typedef T type; };    template <typename A, typename B, typename C>    T operator()(A const& a, B const& b, C const& c) const     {        T t(a, b, c);        return t;    }};#if PHOENIX_CONSTRUCT_LIMIT > 3template <typename T>struct construct_4 {    template <            typename A        ,   typename B        ,   typename C        ,   typename D    >    struct result { typedef T type; };

⌨️ 快捷键说明

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