87 lines
2.2 KiB
C++
87 lines
2.2 KiB
C++
/*=============================================================================
|
|
Copyright (c) 2013 Carl Barron
|
|
Copyright (c) 2015 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/detail/lightweight_test.hpp>
|
|
#include <boost/spirit/home/x3.hpp>
|
|
#include <boost/fusion/include/at.hpp>
|
|
#include <boost/fusion/include/vector.hpp>
|
|
#include <boost/fusion/include/adapt_struct.hpp>
|
|
#include <boost/mpl/int.hpp>
|
|
#include <boost/optional.hpp>
|
|
|
|
#include <iostream>
|
|
#include <numeric>
|
|
#include <vector>
|
|
#include "test.hpp"
|
|
|
|
struct roman
|
|
{
|
|
boost::optional<int> a;
|
|
boost::optional<int> b;
|
|
boost::optional<int> c;
|
|
};
|
|
|
|
BOOST_FUSION_ADAPT_STRUCT(roman,
|
|
a, b, c
|
|
)
|
|
|
|
int eval(roman const & c)
|
|
{
|
|
return c.a.get_value_or(0) + c.b.get_value_or(0) + c.c.get_value_or(0);
|
|
}
|
|
|
|
int
|
|
main()
|
|
{
|
|
using spirit_test::test;
|
|
using spirit_test::test_attr;
|
|
using boost::spirit::x3::symbols;
|
|
|
|
{ // construction from initializer-list
|
|
symbols<int> const ones =
|
|
{
|
|
{"I", 1}, {"II", 2}, {"III", 3}, {"IV", 4},
|
|
{"V", 5}, {"VI", 6}, {"VII", 7}, {"VIII", 8},
|
|
{"IX", 9}
|
|
};
|
|
symbols<int> const tens =
|
|
{
|
|
{"X", 10}, {"XX", 20}, {"XXX", 30}, {"XL", 40},
|
|
{"L", 50}, {"LX", 60}, {"LXX", 70}, {"LXXX", 80},
|
|
{"XC", 90}
|
|
};
|
|
symbols<int> const hundreds
|
|
{
|
|
{"C", 100}, {"CC", 200}, {"CCC", 300}, {"CD", 400},
|
|
{"D", 500}, {"DC", 600}, {"DCC", 700}, {"DCCC", 800},
|
|
{"CM", 900}
|
|
};
|
|
|
|
auto number = -hundreds >> -tens >> -ones;
|
|
|
|
roman r;
|
|
BOOST_TEST((test_attr("CDXLII", number, r)));
|
|
BOOST_TEST(eval(r) == 442);
|
|
}
|
|
|
|
{ // construction from initializer-list without attribute
|
|
symbols<> foo = {"a1", "a2", "a3"};
|
|
|
|
BOOST_TEST((test("a3", foo)));
|
|
}
|
|
|
|
{ // assignment from initializer-list
|
|
symbols<> foo;
|
|
foo = {"a1", "a2", "a3"};
|
|
|
|
BOOST_TEST((test("a3", foo)));
|
|
}
|
|
|
|
return boost::report_errors();
|
|
}
|