123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- // Copyright (c) 2001-2010 Hartmut Kaiser
- //
- // 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)
- // The main purpose of this example is to show how a single fusion sequence
- // can be used to generate output of the elements in different sequences
- #include <boost/config/warning_disable.hpp>
- #include <boost/spirit/include/karma.hpp>
- #include <boost/fusion/include/struct.hpp>
- #include <boost/fusion/include/nview.hpp>
- #include <boost/assign/std/vector.hpp>
- namespace fusion = boost::fusion;
- namespace karma = boost::spirit::karma;
- ///////////////////////////////////////////////////////////////////////////////
- namespace client
- {
- // Our employee struct
- struct employee
- {
- std::string surname;
- std::string forename;
- int age;
- double salary;
- std::string department;
- };
- // define iterator type
- typedef std::back_insert_iterator<std::string> iterator_type;
- // This is the output routine taking a format description and the data to
- // print
- template <typename Generator, typename Sequence>
- void generate(Generator const& g, Sequence const& s)
- {
- std::string generated;
- iterator_type sink(generated);
- karma::generate(sink, g, s);
- std::cout << generated << std::endl;
- }
- }
- // We need to tell fusion about our employee struct to make it a first-class
- // fusion citizen. This has to be in global scope. Note that we don't need to
- // list the members of our struct in the same sequence a they are defined
- BOOST_FUSION_ADAPT_STRUCT(
- client::employee,
- (int, age)
- (std::string, surname)
- (std::string, forename)
- (std::string, department)
- (double, salary)
- )
- ///////////////////////////////////////////////////////////////////////////////
- int main()
- {
- std::string str;
- // some employees
- client::employee john = { "John", "Smith", 25, 2000.50, "Sales" };
- client::employee mary = { "Mary", "Higgins", 23, 2200.36, "Marketing" };
- client::employee tom = { "Tom", "Taylor", 48, 3200.00, "Boss" };
- // print data about employees in different formats
- {
- // print forename and age
- client::generate(
- karma::string << ", " << karma::int_,
- fusion::as_nview<2, 0>(john));
- // print surname, forename, and salary
- client::generate(
- karma::string << ' ' << karma::string << ": " << karma::double_,
- fusion::as_nview<1, 2, 4>(mary));
- // print forename, age, and department
- client::generate(
- karma::string << ": " << karma::int_ << " (" << karma::string << ')',
- fusion::as_nview<2, 0, 3>(tom));
- }
- // now make a list of all employees and print them all
- std::vector<client::employee> employees;
- {
- using namespace boost::assign;
- employees += john, mary, tom;
- }
- // print surname, forename, and salary for all employees
- {
- typedef
- fusion::result_of::as_nview<client::employee const, 1, 2, 4>::type
- names_and_salary;
- karma::rule<client::iterator_type, names_and_salary()> r =
- karma::string << ' ' << karma::string << ": " << karma::double_;
- client::generate(r % karma::eol, employees);
- }
- return 0;
- }
|