1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // 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 we can generate output from
- // a container holding key/value pairs.
- //
- // For more information see here: http://spirit.sourceforge.net/home/?p=400
- #include <boost/config/warning_disable.hpp>
- #include <boost/spirit/include/karma.hpp>
- #include <boost/spirit/include/karma_stream.hpp>
- #include <boost/spirit/include/phoenix.hpp>
- #include <boost/fusion/include/std_pair.hpp>
- #include <iostream>
- #include <map>
- #include <algorithm>
- #include <cstdlib>
- namespace client
- {
- namespace karma = boost::spirit::karma;
- typedef std::pair<std::string, boost::optional<std::string> > pair_type;
- template <typename OutputIterator>
- struct keys_and_values
- : karma::grammar<OutputIterator, std::vector<pair_type>()>
- {
- keys_and_values()
- : keys_and_values::base_type(query)
- {
- query = pair << *('&' << pair);
- pair = karma::string << -('=' << karma::string);
- }
- karma::rule<OutputIterator, std::vector<pair_type>()> query;
- karma::rule<OutputIterator, pair_type()> pair;
- };
- }
- ///////////////////////////////////////////////////////////////////////////////
- int main()
- {
- namespace karma = boost::spirit::karma;
- typedef std::vector<client::pair_type>::value_type value_type;
- typedef std::back_insert_iterator<std::string> sink_type;
- std::vector<client::pair_type> v;
- v.push_back(value_type("key1", boost::optional<std::string>("value1")));
- v.push_back(value_type("key2", boost::optional<std::string>()));
- v.push_back(value_type("key3", boost::optional<std::string>("")));
- std::string generated;
- sink_type sink(generated);
- client::keys_and_values<sink_type> g;
- if (!karma::generate(sink, g, v))
- {
- std::cout << "-------------------------\n";
- std::cout << "Generating failed\n";
- std::cout << "-------------------------\n";
- }
- else
- {
- std::cout << "-------------------------\n";
- std::cout << "Generated: " << generated << "\n";
- std::cout << "-------------------------\n";
- }
- return 0;
- }
|