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