Ticket #4590: boost_iostreams_filtering_ostream.cpp

File boost_iostreams_filtering_ostream.cpp, 2.5 KB (added by t0rt1e@…, 12 years ago)

Test case

Line 
1// Test case for flushing a filtering_ostream based on the
2// back_inserter example in
3// <http://www.boost.org/doc/libs/1_44_0/libs/iostreams/doc/tutorial/container_sink.html>
4// augmented by a transparent output filter simplified from the
5// example given in
6// <http://www.boost.org/doc/libs/1_44_0/libs/iostreams/doc/concepts/output_filter.html>.
7//
8// Flushing a filtering_ostream using the flush() member function
9// stopped working in Boost 1.44. The string the back_inserter writes
10// to stays empty. A valid workaround seems to call strict_sync(), as
11// it leads to the expected result. The member function sync()
12// documented in
13// <http://www.boost.org/doc/libs/1_44_0/libs/iostreams/doc/classes/filtering_stream.html>
14// does not seem to exist.
15//
16
17#include <cassert>
18#include <string>
19#include <boost/iostreams/categories.hpp>
20#include <boost/iostreams/operations.hpp>
21#include <boost/iostreams/device/back_inserter.hpp>
22#include <boost/iostreams/filtering_stream.hpp>
23
24#include <iostream>
25
26namespace io = boost::iostreams;
27
28// Simple output filter forwarding just forwarding the put chars to
29// the sink.
30struct transparent_output_filter {
31 typedef char char_type;
32 typedef io::output_filter_tag category;
33
34 template<typename Sink>
35 bool put(Sink& snk, char c)
36 {
37 return io::put(snk, c);
38 }
39};
40
41int main(int argc, char *argv[])
42{
43 using namespace std;
44
45 string result;
46
47 io::filtering_stream<io::output> out;
48
49 // Transparent filter just forward the characters to the sink. If it
50 // is left out from the filter chain, out.flush() works correctly
51 // and result has the expected value.
52 out.push(transparent_output_filter());
53
54 // Sink appends characters to string result.
55 out.push(io::back_inserter(result));
56
57 // Write test string to filtering_ostream.
58 out << "Hello World!";
59
60 // The flush only works in Boost 1.44 if there's only the sink
61 // device in the chain. Until Boost 1.43 this used to work.
62 out.flush();
63
64 // The documented sync() member function leads to a compile error
65 // "‘class
66 // boost::iostreams::filtering_stream<boost::iostreams::output,
67 // char, std::char_traits<char>, std::allocator<char>,
68 // boost::iostreams::public_>’ has no member named ‘sync’".
69 //out.sync();
70
71 // Calling strict_sync() instead of flush() or sync() results in the
72 // characters to be appended to the result string also in Boost 1.44.
73 //out.strict_sync();
74
75 // Check result.
76 cout << "result = \"" << result << "\"" << endl;
77 assert(result == "Hello World!");
78
79 return 0;
80}