summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/fusion/test/sequence/io.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/fusion/test/sequence/io.cpp')
-rw-r--r--src/boost/libs/fusion/test/sequence/io.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/boost/libs/fusion/test/sequence/io.cpp b/src/boost/libs/fusion/test/sequence/io.cpp
new file mode 100644
index 000000000..d14f2af39
--- /dev/null
+++ b/src/boost/libs/fusion/test/sequence/io.cpp
@@ -0,0 +1,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();
+}
+