123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- /*=============================================================================
- 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();
- }
|