1 /*=============================================================================
2     Copyright (c) 2002-2010 Hartmut Kaiser
3     Copyright (c) 2002-2010 Joel de Guzman
4 
5     Distributed under the Boost Software License, Version 1.0. (See accompanying
6     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 ///////////////////////////////////////////////////////////////////////////////
9 //
10 //  This sample demonstrates a generator for a comma separated list of numbers.
11 //  No actions. It is based on the example qi/num_lists.cpp for reading in
12 //  some numbers to generate.
13 //
14 ///////////////////////////////////////////////////////////////////////////////
15 
16 #include <boost/config/warning_disable.hpp>
17 #include <boost/spirit/include/qi.hpp>
18 #include <boost/spirit/include/karma.hpp>
19 
20 #include <iostream>
21 #include <string>
22 #include <list>
23 
24 namespace client
25 {
26     namespace qi = boost::spirit::qi;
27     namespace karma = boost::spirit::karma;
28     namespace ascii = boost::spirit::ascii;
29 
30     ///////////////////////////////////////////////////////////////////////////
31     //  Our number list parser, please see the example qi/numlist1.cpp for
32     //  more information
33     ///////////////////////////////////////////////////////////////////////////
34     template <typename Iterator>
parse_numbers(Iterator first,Iterator last,std::list<double> & v)35     bool parse_numbers(Iterator first, Iterator last, std::list<double>& v)
36     {
37         using qi::double_;
38         using qi::phrase_parse;
39         using ascii::space;
40 
41         bool r = phrase_parse(first, last, double_ >> *(',' >> double_), space, v);
42         if (first != last)
43             return false;
44         return r;
45     }
46 
47     ///////////////////////////////////////////////////////////////////////////
48     //  Our number list generator
49     ///////////////////////////////////////////////////////////////////////////
50     //[tutorial_karma_numlist1
51     template <typename OutputIterator>
generate_numbers(OutputIterator & sink,std::list<double> const & v)52     bool generate_numbers(OutputIterator& sink, std::list<double> const& v)
53     {
54         using karma::double_;
55         using karma::generate_delimited;
56         using ascii::space;
57 
58         bool r = generate_delimited(
59             sink,                           // destination: output iterator
60             double_ << *(',' << double_),   // the generator
61             space,                          // the delimiter-generator
62             v                               // the data to output
63         );
64         return r;
65     }
66     //]
67 }
68 
69 ////////////////////////////////////////////////////////////////////////////
70 //  Main program
71 ////////////////////////////////////////////////////////////////////////////
72 int
main()73 main()
74 {
75     std::cout << "/////////////////////////////////////////////////////////\n\n";
76     std::cout << "\t\tA comma separated list generator for Spirit...\n\n";
77     std::cout << "/////////////////////////////////////////////////////////\n\n";
78 
79     std::cout << "Give me a comma separated list of numbers.\n";
80     std::cout << "Type [q or Q] to quit\n\n";
81 
82     std::string str;
83     while (getline(std::cin, str))
84     {
85         if (str.empty() || str[0] == 'q' || str[0] == 'Q')
86             break;
87 
88         std::list<double> v;      // here we put the data to generate
89         if (client::parse_numbers(str.begin(), str.end(), v))
90         {
91             // ok, we got some numbers, now print them back out
92             std::cout << "-------------------------\n";
93 
94             std::string generated;
95             std::back_insert_iterator<std::string> sink(generated);
96             if (!client::generate_numbers(sink, v))
97             {
98                 std::cout << "-------------------------\n";
99                 std::cout << "Generating failed\n";
100                 std::cout << "-------------------------\n";
101             }
102             else
103             {
104                 std::cout << "-------------------------\n";
105                 std::cout << "Generated: " << generated << "\n";
106                 std::cout << "-------------------------\n";
107             }
108         }
109         else
110         {
111             std::cout << "-------------------------\n";
112             std::cout << "Parsing failed\n";
113             std::cout << "-------------------------\n";
114         }
115     }
116 
117     std::cout << "Bye... :-) \n\n";
118     return 0;
119 }
120 
121 
122