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