123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- #ifndef PHOENIX_CLOSURES_HPP
- #define PHOENIX_CLOSURES_HPP
- #include "boost/lambda/core.hpp"
- namespace boost {
- namespace lambda {
- template <typename ClosureT>
- class closure_frame : public ClosureT::tuple_t {
- public:
- closure_frame(ClosureT& clos)
- : ClosureT::tuple_t(), save(clos.frame), frame(clos.frame)
- { clos.frame = this; }
- template <typename TupleT>
- closure_frame(ClosureT& clos, TupleT const& init)
- : ClosureT::tuple_t(init), save(clos.frame), frame(clos.frame)
- { clos.frame = this; }
- ~closure_frame()
- { frame = save; }
- private:
- closure_frame(closure_frame const&);
- closure_frame& operator=(closure_frame const&);
- closure_frame* save;
- closure_frame*& frame;
- };
- template <int N, typename ClosureT>
- class closure_member {
- public:
- typedef typename ClosureT::tuple_t tuple_t;
- closure_member()
- : frame(ClosureT::closure_frame_ref()) {}
- template <typename TupleT>
- struct sig {
- typedef typename detail::tuple_element_as_reference<
- N, typename ClosureT::tuple_t
- >::type type;
- };
- template <class Ret, class A, class B, class C>
- // typename detail::tuple_element_as_reference
-
- Ret
- call(A&, B&, C&) const
- {
- assert(frame);
- return boost::tuples::get<N>(*frame);
- }
- private:
- typename ClosureT::closure_frame_t*& frame;
- };
- template <
- typename T0 = null_type,
- typename T1 = null_type,
- typename T2 = null_type,
- typename T3 = null_type,
- typename T4 = null_type
- >
- class closure {
- public:
- typedef tuple<T0, T1, T2, T3, T4> tuple_t;
- typedef closure<T0, T1, T2, T3, T4> self_t;
- typedef closure_frame<self_t> closure_frame_t;
- closure()
- : frame(0) { closure_frame_ref(&frame); }
- closure_frame_t& context() { assert(frame); return frame; }
- closure_frame_t const& context() const { assert(frame); return frame; }
- typedef lambda_functor<closure_member<0, self_t> > member1;
- typedef lambda_functor<closure_member<1, self_t> > member2;
- typedef lambda_functor<closure_member<2, self_t> > member3;
- typedef lambda_functor<closure_member<3, self_t> > member4;
- typedef lambda_functor<closure_member<4, self_t> > member5;
- private:
- closure(closure const&);
- closure& operator=(closure const&);
- template <int N, typename ClosureT>
- friend class closure_member;
- template <typename ClosureT>
- friend class closure_frame;
- static closure_frame_t*&
- closure_frame_ref(closure_frame_t** frame_ = 0)
- {
- static closure_frame_t** frame = 0;
- if (frame_ != 0)
- frame = frame_;
- return *frame;
- }
- closure_frame_t* frame;
- };
- }}
-
- #endif
|