1 // Copyright (c) 2001-2012 Hartmut Kaiser
2 // Copyright (c) 2012 Benjamin Schindler
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7 #include <boost/config/warning_disable.hpp>
8 #include <boost/detail/lightweight_test.hpp>
9
10 #include <boost/spirit/include/karma.hpp>
11 #include <boost/fusion/include/adapt_struct.hpp>
12 #include <set>
13
14 namespace generator
15 {
16 struct Enum
17 {
18 std::string enumName;
19 std::vector<std::string> enumEntries;
20 };
21 typedef boost::variant<std::string, Enum> VariantType;
22
23 namespace karma = boost::spirit::karma;
24
25 // Our grammar definition
26 template<typename Iterator>
27 struct SettingsHeaderGenerator: karma::grammar<Iterator, VariantType()>
28 {
SettingsHeaderGeneratorgenerator::SettingsHeaderGenerator29 SettingsHeaderGenerator() : SettingsHeaderGenerator::base_type(baseRule)
30 {
31 using karma::lit;
32 using karma::string;
33
34 enumRule = lit("enum ") << string << lit("\n{\n") << string % ",\n" << "}";
35 declarationRule = lit("class ") << string << ';';
36 baseRule = (declarationRule | enumRule) << lit("\n");
37
38 baseRule.name("base");
39 enumRule.name("enum");
40 declarationRule.name("declaration");
41 }
42
43 karma::rule<Iterator, std::string()> declarationRule;
44 karma::rule<Iterator, Enum()> enumRule;
45 karma::rule<Iterator, VariantType()> baseRule;
46 };
47
48 template <typename OutputIterator>
generate_header(OutputIterator & sink,VariantType & data)49 bool generate_header(OutputIterator& sink, VariantType& data)
50 {
51 SettingsHeaderGenerator<OutputIterator> generator;
52 return karma::generate(sink, generator, data);
53 }
54 }
55
56 BOOST_FUSION_ADAPT_STRUCT(generator::Enum,
57 (std::string, enumName)
58 (std::vector<std::string>, enumEntries)
59 )
60
main()61 int main()
62 {
63 generator::VariantType variant = "bla";
64 std::string generated;
65 std::back_insert_iterator<std::string> sink(generated);
66 BOOST_TEST(generator::generate_header(sink, variant));
67 BOOST_TEST(generated == "class bla;\n");
68
69 return boost::report_errors();
70 }
71
72