sl@0: // sl@0: // Copyright (c) 2000-2002 sl@0: // Joerg Walter, Mathias Koch sl@0: // sl@0: // Permission to use, copy, modify, distribute and sell this software sl@0: // and its documentation for any purpose is hereby granted without fee, sl@0: // provided that the above copyright notice appear in all copies and sl@0: // that both that copyright notice and this permission notice appear sl@0: // in supporting documentation. The authors make no representations sl@0: // about the suitability of this software for any purpose. sl@0: // It is provided "as is" without express or implied warranty. sl@0: // sl@0: // The authors gratefully acknowledge the support of sl@0: // GeNeSys mbH & Co. KG in producing this work. sl@0: // sl@0: sl@0: #ifndef _BOOST_UBLAS_IO_ sl@0: #define _BOOST_UBLAS_IO_ sl@0: sl@0: // Only forward definition required to define stream operations sl@0: #include sl@0: #include sl@0: sl@0: sl@0: namespace boost { namespace numeric { namespace ublas { sl@0: sl@0: template sl@0: // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. sl@0: std::basic_ostream &operator << (std::basic_ostream &os, sl@0: const vector_expression &v) { sl@0: typedef typename VE::size_type size_type; sl@0: size_type size = v ().size (); sl@0: std::basic_ostringstream > s; sl@0: s.flags (os.flags ()); sl@0: s.imbue (os.getloc ()); sl@0: s.precision (os.precision ()); sl@0: s << '[' << size << "]("; sl@0: if (size > 0) sl@0: s << v () (0); sl@0: for (size_type i = 1; i < size; ++ i) sl@0: s << ',' << v () (i); sl@0: s << ')'; sl@0: return os << s.str ().c_str (); sl@0: } sl@0: sl@0: template sl@0: // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. sl@0: std::basic_istream &operator >> (std::basic_istream &is, sl@0: vector &v) { sl@0: typedef typename vector::size_type size_type; sl@0: E ch; sl@0: size_type size; sl@0: if (is >> ch && ch != '[') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (is >> size >> ch && ch != ']') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (! is.fail ()) { sl@0: vector s (size); sl@0: if (is >> ch && ch != '(') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (! is.fail ()) { sl@0: for (size_type i = 0; i < size; i ++) { sl@0: if (is >> s (i) >> ch && ch != ',') { sl@0: is.putback (ch); sl@0: if (i < size - 1) sl@0: is.setstate (std::ios_base::failbit); sl@0: break; sl@0: } sl@0: } sl@0: if (is >> ch && ch != ')') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } sl@0: } sl@0: if (! is.fail ()) sl@0: v.swap (s); sl@0: } sl@0: return is; sl@0: } sl@0: sl@0: template sl@0: // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. sl@0: std::basic_ostream &operator << (std::basic_ostream &os, sl@0: const matrix_expression &m) { sl@0: typedef typename ME::size_type size_type; sl@0: size_type size1 = m ().size1 (); sl@0: size_type size2 = m ().size2 (); sl@0: std::basic_ostringstream > s; sl@0: s.flags (os.flags ()); sl@0: s.imbue (os.getloc ()); sl@0: s.precision (os.precision ()); sl@0: s << '[' << size1 << ',' << size2 << "]("; sl@0: if (size1 > 0) { sl@0: s << '(' ; sl@0: if (size2 > 0) sl@0: s << m () (0, 0); sl@0: for (size_type j = 1; j < size2; ++ j) sl@0: s << ',' << m () (0, j); sl@0: s << ')'; sl@0: } sl@0: for (size_type i = 1; i < size1; ++ i) { sl@0: s << ",(" ; sl@0: if (size2 > 0) sl@0: s << m () (i, 0); sl@0: for (size_type j = 1; j < size2; ++ j) sl@0: s << ',' << m () (i, j); sl@0: s << ')'; sl@0: } sl@0: s << ')'; sl@0: return os << s.str ().c_str (); sl@0: } sl@0: sl@0: template sl@0: // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. sl@0: std::basic_istream &operator >> (std::basic_istream &is, sl@0: matrix &m) { sl@0: typedef typename matrix::size_type size_type; sl@0: E ch; sl@0: size_type size1, size2; sl@0: if (is >> ch && ch != '[') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (is >> size1 >> ch && ch != ',') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (is >> size2 >> ch && ch != ']') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (! is.fail ()) { sl@0: matrix s (size1, size2); sl@0: if (is >> ch && ch != '(') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (! is.fail ()) { sl@0: for (size_type i = 0; i < size1; i ++) { sl@0: if (is >> ch && ch != '(') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: break; sl@0: } sl@0: for (size_type j = 0; j < size2; j ++) { sl@0: if (is >> s (i, j) >> ch && ch != ',') { sl@0: is.putback (ch); sl@0: if (j < size2 - 1) { sl@0: is.setstate (std::ios_base::failbit); sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: if (is >> ch && ch != ')') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: break; sl@0: } sl@0: if (is >> ch && ch != ',') { sl@0: is.putback (ch); sl@0: if (i < size1 - 1) { sl@0: is.setstate (std::ios_base::failbit); sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: if (is >> ch && ch != ')') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } sl@0: } sl@0: if (! is.fail ()) sl@0: m.swap (s); sl@0: } sl@0: return is; sl@0: } sl@0: sl@0: // Special input operator for symmetrix_matrix sl@0: template sl@0: // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. sl@0: std::basic_istream &operator >> (std::basic_istream &is, sl@0: symmetric_matrix &m) { sl@0: typedef typename symmetric_matrix::size_type size_type; sl@0: E ch; sl@0: size_type size1, size2; sl@0: MT value; sl@0: if (is >> ch && ch != '[') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (is >> size1 >> ch && ch != ',') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (is >> size2 >> ch && (size2 != size1 || ch != ']')) { // symmetric matrix must be square sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (! is.fail ()) { sl@0: symmetric_matrix s (size1, size2); sl@0: if (is >> ch && ch != '(') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } else if (! is.fail ()) { sl@0: for (size_type i = 0; i < size1; i ++) { sl@0: if (is >> ch && ch != '(') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: break; sl@0: } sl@0: for (size_type j = 0; j < size2; j ++) { sl@0: if (is >> value >> ch && ch != ',') { sl@0: is.putback (ch); sl@0: if (j < size2 - 1) { sl@0: is.setstate (std::ios_base::failbit); sl@0: break; sl@0: } sl@0: } sl@0: if (i <= j) { sl@0: // this is the first time we read this element - set the value sl@0: s(i,j) = value; sl@0: } sl@0: else if ( s(i,j) != value ) { sl@0: // matrix is not symmetric sl@0: is.setstate (std::ios_base::failbit); sl@0: break; sl@0: } sl@0: } sl@0: if (is >> ch && ch != ')') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: break; sl@0: } sl@0: if (is >> ch && ch != ',') { sl@0: is.putback (ch); sl@0: if (i < size1 - 1) { sl@0: is.setstate (std::ios_base::failbit); sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: if (is >> ch && ch != ')') { sl@0: is.putback (ch); sl@0: is.setstate (std::ios_base::failbit); sl@0: } sl@0: } sl@0: if (! is.fail ()) sl@0: m.swap (s); sl@0: } sl@0: return is; sl@0: } sl@0: sl@0: sl@0: }}} sl@0: sl@0: #endif