diff options
Diffstat (limited to 'src/boost/libs/spirit/example/karma/actions.cpp')
-rw-r--r-- | src/boost/libs/spirit/example/karma/actions.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/boost/libs/spirit/example/karma/actions.cpp b/src/boost/libs/spirit/example/karma/actions.cpp new file mode 100644 index 000000000..9899743e4 --- /dev/null +++ b/src/boost/libs/spirit/example/karma/actions.cpp @@ -0,0 +1,133 @@ +/*============================================================================= + Copyright (c) 2001-2010 Hartmut Kaiser + Copyright (c) 2001-2010 Joel de Guzman + + Distributed under 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 <boost/config/warning_disable.hpp> +#include <boost/spirit/include/karma.hpp> +#include <boost/lambda/lambda.hpp> +#include <boost/bind/bind.hpp> + +#include <iostream> +#include <sstream> + +// Presented are various ways to attach semantic actions +// * Using plain function pointer +// * Using simple function object +// * Using boost.bind +// * Using boost.lambda + +using boost::spirit::unused_type; + +//[karma_tutorial_semantic_action_functions +namespace client +{ + namespace karma = boost::spirit::karma; + + // A plain function + void read_function(int& i) + { + i = 42; + } + + // A member function + struct reader + { + void print(int& i) const + { + i = 42; + } + }; + + // A function object + struct read_action + { + void operator()(int& i, unused_type, unused_type) const + { + i = 42; + } + }; +} +//] + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + using boost::spirit::karma::int_; + using boost::spirit::karma::generate; + using client::read_function; + using client::reader; + using client::read_action; + + { // example using plain functions + using namespace boost::spirit; + + std::string generated; + std::back_insert_iterator<std::string> outiter(generated); + + //[karma_tutorial_attach_actions1 + generate(outiter, '{' << int_[&read_function] << '}'); + //] + + std::cout << "Simple function: " << generated << std::endl; + } + + { // example using simple function object + using namespace boost::spirit; + + std::string generated; + std::back_insert_iterator<std::string> outiter(generated); + + //[karma_tutorial_attach_actions2 + generate(outiter, '{' << int_[read_action()] << '}'); + //] + + std::cout << "Simple function object: " << generated << std::endl; + } + + { // example using plain function with boost.bind + using namespace boost::placeholders; + std::string generated; + std::back_insert_iterator<std::string> outiter(generated); + + //[karma_tutorial_attach_actions3 + generate(outiter, '{' << int_[boost::bind(&read_function, _1)] << '}'); + //] + + std::cout << "Simple function with Boost.Bind: " << generated << std::endl; + } + + { // example using member function with boost.bind + using namespace boost::placeholders; + std::string generated; + std::back_insert_iterator<std::string> outiter(generated); + + //[karma_tutorial_attach_actions4 + reader r; + generate(outiter, '{' << int_[boost::bind(&reader::print, &r, _1)] << '}'); + //] + + std::cout << "Member function: " << generated << std::endl; + } + + { // example using boost.lambda + namespace lambda = boost::lambda; + using namespace boost::spirit; + + std::string generated; + std::back_insert_iterator<std::string> outiter(generated); + + //[karma_tutorial_attach_actions5 + std::stringstream strm("42"); + generate(outiter, '{' << int_[strm >> lambda::_1] << '}'); + //] + + std::cout << "Boost.Lambda: " << generated << std::endl; + } + + return 0; +} + |