Ticket #8529: stream_generator.cpp

File stream_generator.cpp, 3.3 KB (added by cppljevans, 9 years ago)

causes call of generate function whose comments don't mention that possibility

Line 
1//Purpose:
2// Demonstrate that a stream generator causes call to
3/*
4 // this is a special overload to detect if the output iterator has been
5 // generated by a format_manip object.
6 template <
7 typename T, typename Traits, typename Properties, typename Context
8 , typename Delimiter, typename Attribute
9 >
10 static bool generate(
11 karma::detail::output_iterator<
12 karma::ostream_iterator<T, Char, Traits>, Properties
13 >& sink, Context& context, Delimiter const& d
14 , Attribute const& attr)
15 {
16
17 */
18 // in boost/spirit/home/karma/stream/stream.hpp.
19 //
20//#include <boost/utility/demangled_type_name.hpp>
21#include <boost/spirit/include/karma.hpp>
22
23#include <sstream>
24namespace client
25{
26 ///////////////////////////////////////////////////////////////////////////
27 // Use stream generator and list operator to
28 // generator a Attribute.
29 ///////////////////////////////////////////////////////////////////////////
30 template <typename OutputIterator, typename Attribute>
31 bool generate_by_stream(OutputIterator& sink, Attribute const& v)
32 {
33 using boost::spirit::karma::stream;
34 using boost::spirit::karma::generate;
35
36 bool r = generate(
37 sink, // destination: output iterator
38 stream, // the generator. Should just use operator<< on v.
39 v // the attribute to output
40 );
41 return r;
42 }
43
44}
45
46////////////////////////////////////////////////////////////////////////////
47// Following(till Main program), is just to allow breakpoint to be
48// set in operator<< to allow using debugger to see how
49// karma implements the stream generator.
50////////////////////////////////////////////////////////////////////////////
51struct wrap_uns
52{
53 unsigned my_val;
54 wrap_uns(unsigned a_val)
55 : my_val(a_val)
56 {}
57};
58
59namespace std
60{
61 //MAINTENANCE_NOTE:2013-04-09.Larry Evans:
62 // Must put following operator<< in std for
63 // ADL, as explained here:
64 //
65 // http://boost.2283326.n4.nabble.com/karma-stream-generator-works-on-int-but-not-on-vector-lt-int-gt-tc4645053.html#a4645055
66 //
67 std::ostream&
68 operator<< (std::ostream& os, wrap_uns const& z)
69 {
70 os<<"wrap_uns("<<z.my_val<<")";
71 return os;
72 }
73}//exit namespace std
74
75////////////////////////////////////////////////////////////////////////////
76// Main program
77////////////////////////////////////////////////////////////////////////////
78int
79main()
80{
81 std::ostringstream ostream_sink;
82 boost::spirit::karma::ostream_iterator
83 < std::ostream::char_type
84 >
85 sink_iter(ostream_sink);
86 wrap_uns attr(999);
87 ostream_sink<<"***{generation.\n";
88 bool const ok_gen=client::generate_by_stream(sink_iter, attr);
89 ostream_sink<<"\n***}generation.\n";
90 ostream_sink.flush();
91 std::string generated=ostream_sink.str();
92 if(!ok_gen)
93 {
94 std::cout << "-------------------------\n";
95 std::cout << "Generating failed\n";
96 std::cout << "-------------------------\n";
97 }
98 else
99 {
100 std::cout << "-------------------------\n";
101 std::cout << "Generated:\n" << generated << "\n";
102 std::cout << "-------------------------\n";
103 }
104
105 return 0;
106}