blob: d3b15e164d3990dfb33cf4d646b49b22ce7d4002 [file] [log] [blame]
/*=============================================================================
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)
=============================================================================*/
#if defined(_MSC_VER)
# pragma warning(disable: 4180) // qualifier applied to function type
// has no meaning; ignored
#endif
#include <boost/detail/lightweight_test.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/spirit/include/qi_operator.hpp>
#include <boost/spirit/include/qi_numeric.hpp>
#include <boost/spirit/include/qi_char.hpp>
#include <boost/spirit/include/qi_parse.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/bind.hpp>
#include <cstring>
int x = 0;
void fun1(int const& i)
{
x += i;
}
void fun2(int i)
{
x += i;
}
using boost::spirit::unused_type;
struct fun_action
{
void operator()(int const& i, unused_type, unused_type) const
{
x += i;
}
};
void fail (int, boost::spirit::unused_type, bool& pass)
{
pass = false;
}
struct setnext
{
setnext(char& next) : next(next) {}
void operator()(char c, unused_type, unused_type) const
{
next = c;
}
char& next;
};
int main()
{
namespace qi = boost::spirit::qi;
using boost::spirit::int_;
{
char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
qi::parse(s1, e1, '{' >> int_[&fun1] >> '}');
}
{
char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
qi::parse(s1, e1, '{' >> int_[&fun2] >> '}');
}
#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
{
char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
qi::parse(s1, e1, '{' >> int_[fun2] >> '}');
}
#else
x += 42; // compensate for missing test case
#endif
{
char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
qi::parse(s1, e1, '{' >> int_[fun_action()] >> '}');
}
{
char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
qi::parse(s1, e1, '{' >> int_[boost::bind(&fun1, _1)] >> '}');
}
{
namespace lambda = boost::lambda;
char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
qi::parse(s1, e1, '{' >> int_[lambda::var(x) += lambda::_1] >> '}');
}
BOOST_TEST(x == (42*6));
{
std::string input("1234 6543");
char next = '\0';
BOOST_TEST(qi::phrase_parse(input.begin(), input.end(),
qi::int_[fail] | qi::digit[setnext(next)] , qi::space));
BOOST_TEST(next == '1');
}
return boost::report_errors();
}