diff src/ov-range.cc @ 11176:2271261f088a

Address precision issue in ranges saved to HDF5 files
author David Bateman <dbateman@free.fr>
date Tue, 02 Nov 2010 16:27:30 +0100
parents 0de5cc44e690
children fd0a3ac60b0e
line wrap: on
line diff
--- a/src/ov-range.cc	Tue Nov 02 00:47:31 2010 +0100
+++ b/src/ov-range.cc	Tue Nov 02 16:27:30 2010 +0100
@@ -548,8 +548,15 @@
   range_vals[1] = r.inc () != 0 ? r.limit () : r.nelem ();
   range_vals[2] = r.inc ();
 
-  retval = H5Dwrite (data_hid, type_hid, H5S_ALL, H5S_ALL, H5P_DEFAULT,
-                     range_vals) >= 0;
+  if (H5Dwrite (data_hid, type_hid, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+                range_vals) >= 0)
+    {
+      octave_idx_type nel = r.nelem ();
+      retval = hdf5_add_scalar_attr (data_hid, H5T_NATIVE_IDX,
+                                     "OCTAVE_RANGE_NELEM", &nel) >= 0;
+    }
+  else
+    retval = false;
 
   H5Dclose (data_hid);
   H5Tclose (type_hid);
@@ -595,11 +602,18 @@
                rangevals) >= 0)
     {
       retval = true;
-      if (rangevals[2] != 0)
-        range = Range (rangevals[0], rangevals[1], rangevals[2]);
+      octave_idx_type nel;
+      if (hdf5_get_scalar_attr (data_hid, H5T_NATIVE_IDX, 
+                                "OCTAVE_RANGE_NELEM", &nel))
+        range = Range (rangevals[0], rangevals[2], nel);
       else
-        range = Range (rangevals[0], rangevals[2], 
-                       static_cast<octave_idx_type> (rangevals[1]));
+        {
+          if (rangevals[2] != 0)
+            range = Range (rangevals[0], rangevals[1], rangevals[2]);
+          else
+            range = Range (rangevals[0], rangevals[2], 
+                           static_cast<octave_idx_type> (rangevals[1]));
+        }
     }
 
   H5Tclose (range_type);