1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
/*=============================================================================
Phoenix V1.2.1
Copyright (c) 2001-2003 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)
==============================================================================*/
#include <vector>
#include <algorithm>
#include <iostream>
#include <cassert>
#define PHOENIX_LIMIT 15
#include <boost/spirit/include/phoenix1_operators.hpp>
#include <boost/spirit/include/phoenix1_primitives.hpp>
#include <boost/spirit/include/phoenix1_composite.hpp>
#include <boost/spirit/include/phoenix1_special_ops.hpp>
#include <boost/spirit/include/phoenix1_statements.hpp>
#include <boost/spirit/include/phoenix1_functions.hpp>
#include <boost/spirit/include/phoenix1_closures.hpp>
//////////////////////////////////
using namespace phoenix;
//////////////////////////////////
int
main()
{
struct my_closure : closure<int, std::string, double> {
member1 num;
member2 message;
member3 real;
};
my_closure clos;
{ // First stack frame
closure_frame<my_closure::self_t> frame(clos);
(clos.num = 123)();
(clos.num += 456)();
(clos.real = clos.num / 56.5)();
(clos.message = "Hello " + std::string("World "))();
{ // Second stack frame
closure_frame<my_closure::self_t> frame(clos);
(clos.num = 987)();
(clos.message = "Abracadabra ")();
(clos.real = clos.num * 1e30)();
{ // Third stack frame
tuple<int, char const*, double> init(-1, "Direct Init ", 3.14);
closure_frame<my_closure::self_t> frame(clos, init);
(std::cout << clos.message << clos.num << ", " << clos.real << '\n')();
}
(std::cout << clos.message << clos.num << ", " << clos.real << '\n')();
}
(std::cout << clos.message << clos.num << ", " << clos.real << '\n')();
}
return 0;
}
|