diff liboctave/data-conv.cc @ 7789:82be108cc558

First attempt at single precision tyeps * * * corrections to qrupdate single precision routines * * * prefer demotion to single over promotion to double * * * Add single precision support to log2 function * * * Trivial PROJECT file update * * * Cache optimized hermitian/transpose methods * * * Add tests for tranpose/hermitian and ChangeLog entry for new transpose code
author David Bateman <dbateman@free.fr>
date Sun, 27 Apr 2008 22:34:17 +0200
parents a1dbe9d80eee
children 139f47cf17ab
line wrap: on
line diff
--- a/liboctave/data-conv.cc
+++ b/liboctave/data-conv.cc
@@ -1059,6 +1059,57 @@
 }
 
 void
+read_floats (std::istream& is, float *data, save_type type, int len,
+	      bool swap, oct_mach_info::float_format fmt)
+{
+  switch (type)
+    {
+    case LS_U_CHAR:
+      LS_DO_READ (uint8_t, swap, data, 1, len, is);
+      break;
+
+    case LS_U_SHORT:
+      LS_DO_READ (uint16_t, swap, data, 2, len, is);
+      break;
+
+    case LS_U_INT:
+      LS_DO_READ (uint32_t, swap, data, 4, len, is);
+      break;
+
+    case LS_CHAR:
+      LS_DO_READ (int8_t, swap, data, 1, len, is);
+      break;
+
+    case LS_SHORT:
+      LS_DO_READ (int16_t, swap, data, 2, len, is);
+      break;
+
+    case LS_INT:
+      LS_DO_READ (int32_t, swap, data, 4, len, is);
+      break;
+
+    case LS_FLOAT: // No conversion necessary.
+      is.read (reinterpret_cast<char *> (data), 4 * len);
+      do_float_format_conversion (data, len, fmt);
+      break;
+
+    case LS_DOUBLE:
+      {
+	OCTAVE_LOCAL_BUFFER (double, ptr, len);
+	is.read (reinterpret_cast<char *> (ptr), 8 * len);
+	do_double_format_conversion (ptr, len, fmt);
+	for (int i = 0; i < len; i++)
+	  data[i] = ptr[i];
+      }
+      break;
+
+    default:
+      is.clear (std::ios::failbit|is.rdstate ());
+      break;
+    }
+}
+
+void
 write_doubles (std::ostream& os, const double *data, save_type type, int len)
 {
   switch (type)
@@ -1106,6 +1157,54 @@
     }
 }
 
+void
+write_floats (std::ostream& os, const float *data, save_type type, int len)
+{
+  switch (type)
+    {
+    case LS_U_CHAR:
+      LS_DO_WRITE (uint8_t, data, 1, len, os);
+      break;
+
+    case LS_U_SHORT:
+      LS_DO_WRITE (uint16_t, data, 2, len, os);
+      break;
+
+    case LS_U_INT:
+      LS_DO_WRITE (uint32_t, data, 4, len, os);
+      break;
+
+    case LS_CHAR:
+      LS_DO_WRITE (int8_t, data, 1, len, os);
+      break;
+
+    case LS_SHORT:
+      LS_DO_WRITE (int16_t, data, 2, len, os);
+      break;
+
+    case LS_INT:
+      LS_DO_WRITE (int32_t, data, 4, len, os);
+      break;
+
+    case LS_FLOAT: // No conversion necessary.
+      {
+	char tmp_type = static_cast<char> (type);
+	os.write (&tmp_type, 1);
+	os.write (reinterpret_cast <const char *> (data), 4 * len);
+      }
+      break;
+
+    case LS_DOUBLE:
+      LS_DO_WRITE (double, data, 8, len, os);
+      break;
+
+    default:
+      (*current_liboctave_error_handler)
+	("unrecognized data format requested");
+      break;
+    }
+}
+
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***