summaryrefslogtreecommitdiff
path: root/libs/fusion/test/sequence/io.cpp
blob: d14f2af39b9bd6d03176d688d156acc03098d14d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*=============================================================================
    Copyright (C) 1999-2003 Jaakko Jarvi

    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)
==============================================================================*/
#include <boost/detail/lightweight_test.hpp>
#include <boost/fusion/container/vector/vector.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/fusion/sequence/comparison/equal_to.hpp>
#include <boost/fusion/sequence/io/out.hpp>
#include <boost/fusion/sequence/io/in.hpp>

#include <fstream>
#include <iterator>
#include <algorithm>
#include <string>

#if defined BOOST_NO_STRINGSTREAM
# include <strstream>
#else
# include <sstream>
#endif

using boost::fusion::vector;
using boost::fusion::make_vector;
using boost::fusion::tuple_close;
using boost::fusion::tuple_open;
using boost::fusion::tuple_delimiter;

#if defined BOOST_NO_STRINGSTREAM
  using std::ostrstream;
  using std::istrstream;
  typedef ostrstream useThisOStringStream;
  typedef istrstream useThisIStringStream;
#else
  using std::ostringstream;
  using std::istringstream;
  typedef ostringstream useThisOStringStream;
  typedef istringstream useThisIStringStream;
#endif

using std::endl;
using std::ofstream;
using std::ifstream;
using std::string;

int
main()
{
    using boost::fusion::tuple_close;
    using boost::fusion::tuple_open;
    using boost::fusion::tuple_delimiter;

    useThisOStringStream os1;

    // Set format [a, b, c] for os1
    os1 << tuple_open('[');
    os1 << tuple_close(']');
    os1 << tuple_delimiter(',');
    os1 << make_vector(1, 2, 3);

    BOOST_TEST (os1.str() == std::string("[1,2,3]") );

    {
        useThisOStringStream os2;
        // Set format (a:b:c) for os2;
        os2 << tuple_open('(');
        os2 << tuple_close(')');
        os2 << tuple_delimiter(':');

        os2 << make_vector("TUPU", "HUPU", "LUPU", 4.5);
        BOOST_TEST (os2.str() == std::string("(TUPU:HUPU:LUPU:4.5)") );
    }

    {
        useThisOStringStream os2;
        // Set format (a:b:c) for os2;
        os2 << tuple_open('(');
        os2 << tuple_close(')');
        os2 << tuple_delimiter(':');
        // overwrite previous setting
        os2 << tuple_open("< ");
        os2 << tuple_close('>');
        os2 << tuple_delimiter(", ");

        os2 << make_vector("TUPU", "HUPU", "LUPU", 4.5);
        BOOST_TEST (os2.str() == std::string("< TUPU, HUPU, LUPU, 4.5>") );
    }

    // The format is still [a, b, c] for os1
    os1 << make_vector(1, 2, 3);
    BOOST_TEST (os1.str() == std::string("[1,2,3][1,2,3]") );

    std::ofstream tmp("temp.tmp");

    tmp << make_vector("One", "Two", 3);
    tmp << tuple_delimiter(':');
    tmp << make_vector(1000, 2000, 3000) << endl;

    tmp.close();

    // When reading tuples from a stream, manipulators must be set correctly:
    ifstream tmp3("temp.tmp");
    vector<string, string, int> j;

    tmp3 >> j;
    BOOST_TEST (tmp3.good() );

    tmp3 >> tuple_delimiter(':');
    vector<int, int, int> i;
    tmp3 >> i;
    BOOST_TEST (tmp3.good() );

    tmp3.close();

    // reading vector<int, int, int> in format (a b c);
    useThisIStringStream is("(100 200 300)");

    vector<int, int, int> ti;
    BOOST_TEST(!!(is >> ti));
    BOOST_TEST(ti == make_vector(100, 200, 300));

    // Note that strings are problematic:
    // writing a tuple on a stream and reading it back doesn't work in
    // general. If this is wanted, some kind of a parseable string class
    // should be used.

    return boost::report_errors();
}