// Copyright (c) 2001-2012 Hartmut Kaiser // Copyright (c) 2012 Benjamin Schindler // // 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 #include #include #include #include namespace generator { struct Enum { std::string enumName; std::vector enumEntries; }; typedef boost::variant VariantType; namespace karma = boost::spirit::karma; // Our grammar definition template struct SettingsHeaderGenerator: karma::grammar { SettingsHeaderGenerator() : SettingsHeaderGenerator::base_type(baseRule) { using karma::lit; using karma::string; enumRule = lit("enum ") << string << lit("\n{\n") << string % ",\n" << "}"; declarationRule = lit("class ") << string << ';'; baseRule = (declarationRule | enumRule) << lit("\n"); baseRule.name("base"); enumRule.name("enum"); declarationRule.name("declaration"); } karma::rule declarationRule; karma::rule enumRule; karma::rule baseRule; }; template bool generate_header(OutputIterator& sink, VariantType& data) { SettingsHeaderGenerator generator; return karma::generate(sink, generator, data); } } BOOST_FUSION_ADAPT_STRUCT(generator::Enum, (std::string, enumName) (std::vector, enumEntries) ) int main() { generator::VariantType variant = "bla"; std::string generated; std::back_insert_iterator sink(generated); BOOST_TEST(generator::generate_header(sink, variant)); BOOST_TEST(generated == "class bla;\n"); return boost::report_errors(); }