diff options
Diffstat (limited to 'src/boost/libs/spirit/test/qi/actions.cpp')
-rw-r--r-- | src/boost/libs/spirit/test/qi/actions.cpp | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/boost/libs/spirit/test/qi/actions.cpp b/src/boost/libs/spirit/test/qi/actions.cpp new file mode 100644 index 00000000..9bd4184d --- /dev/null +++ b/src/boost/libs/spirit/test/qi/actions.cpp @@ -0,0 +1,116 @@ +/*============================================================================= + Copyright (c) 2001-2011 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(); +} + + + + |