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 + -
显示快捷键?