text: /*=============================================================================
      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)") );
      }
  
      // 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(bool(is >> ti) != 0);
      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();
  }
  
  