libs/spirit/example/karma/actions.cpp
/*=============================================================================
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/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;
}