comparison src/ov-range.cc @ 4687:e95c86d48732

[project @ 2004-01-06 21:53:34 by jwe]
author jwe
date Tue, 06 Jan 2004 21:53:34 +0000
parents d44675070f1a
children d2038299c683
comparison
equal deleted inserted replaced
4686:c7ae43dfdea4 4687:e95c86d48732
39 #include "ov-range.h" 39 #include "ov-range.h"
40 #include "ov-re-mat.h" 40 #include "ov-re-mat.h"
41 #include "ov-scalar.h" 41 #include "ov-scalar.h"
42 #include "pr-output.h" 42 #include "pr-output.h"
43 43
44 #include "byte-swap.h"
45 #include "ls-hdf5.h"
46 #include "ls-utils.h"
47
44 DEFINE_OCTAVE_ALLOCATOR (octave_range); 48 DEFINE_OCTAVE_ALLOCATOR (octave_range);
45 49
46 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_range, "range", "double"); 50 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_range, "range", "double");
47 51
48 static octave_value * 52 static octave_value *
248 } 252 }
249 253
250 return retval; 254 return retval;
251 } 255 }
252 256
257 // Skip white space and comments on stream IS.
258
259 static void
260 skip_comments (std::istream& is)
261 {
262 char c = '\0';
263 while (is.get (c))
264 {
265 if (c == ' ' || c == '\t' || c == '\n')
266 ; // Skip whitespace on way to beginning of next line.
267 else
268 break;
269 }
270
271 for (;;)
272 {
273 if (is && (c == '%' || c == '#'))
274 while (is.get (c) && c != '\n')
275 ; // Skip to beginning of next line, ignoring everything.
276 else
277 break;
278 }
279 }
280
281 bool
282 octave_range::save_ascii (std::ostream& os, bool& /* infnan_warned */,
283 bool /* strip_nan_and_inf */)
284 {
285 Range r = range_value ();
286 double base = r.base ();
287 double limit = r.limit ();
288 double inc = r.inc ();
289
290 os << "# base, limit, increment\n";
291 octave_write_double (os, base);
292 os << " ";
293 octave_write_double (os, limit);
294 os << " ";
295 octave_write_double (os, inc);
296 os << "\n";
297
298 return true;
299 }
300
301 bool
302 octave_range::load_ascii (std::istream& is)
303 {
304 // # base, limit, range comment added by save ().
305 skip_comments (is);
306
307 is >> range;
308
309 if (!is)
310 {
311 error ("load: failed to load range constant");
312 return false;
313 }
314
315 return true;
316 }
317
318 bool
319 octave_range::save_binary (std::ostream& os, bool& /* save_as_floats */)
320 {
321 char tmp = (char) LS_DOUBLE;
322 os.write (X_CAST (char *, &tmp), 1);
323 Range r = range_value ();
324 double bas = r.base ();
325 double lim = r.limit ();
326 double inc = r.inc ();
327 os.write (X_CAST (char *, &bas), 8);
328 os.write (X_CAST (char *, &lim), 8);
329 os.write (X_CAST (char *, &inc), 8);
330
331 return true;
332 }
333
334 bool
335 octave_range::load_binary (std::istream& is, bool swap,
336 oct_mach_info::float_format /* fmt */)
337 {
338 char tmp;
339 if (! is.read (X_CAST (char *, &tmp), 1))
340 return false;
341 double bas, lim, inc;
342 if (! is.read (X_CAST (char *, &bas), 8))
343 return false;
344 if (swap)
345 swap_8_bytes (X_CAST (char *, &bas));
346 if (! is.read (X_CAST (char *, &lim), 8))
347 return false;
348 if (swap)
349 swap_8_bytes (X_CAST (char *, &lim));
350 if (! is.read (X_CAST (char *, &inc), 8))
351 return false;
352 if (swap)
353 swap_8_bytes (X_CAST (char *, &inc));
354 Range r (bas, lim, inc);
355 range = r;
356 return true;
357 }
358
359 #if defined (HAVE_HDF5)
360 // The following subroutines creates an HDF5 representation of the way
361 // we will store Octave range types (triplets of floating-point numbers).
362 // NUM_TYPE is the HDF5 numeric type to use for storage (e.g.
363 // H5T_NATIVE_DOUBLE to save as 'double'). Note that any necessary
364 // conversions are handled automatically by HDF5.
365
366 static hid_t
367 hdf5_make_range_type (hid_t num_type)
368 {
369 hid_t type_id = H5Tcreate (H5T_COMPOUND, sizeof (double) * 3);
370
371 H5Tinsert (type_id, "base", 0 * sizeof (double), num_type);
372 H5Tinsert (type_id, "limit", 1 * sizeof (double), num_type);
373 H5Tinsert (type_id, "increment", 2 * sizeof (double), num_type);
374
375 return type_id;
376 }
377
378 bool
379 octave_range::save_hdf5 (hid_t loc_id, const char *name,
380 bool /* save_as_floats */)
381 {
382 hsize_t dims[3];
383 hid_t space_hid = -1, type_hid = -1, data_hid = -1;
384 bool retval = true;
385
386 space_hid = H5Screate_simple (0, dims, (hsize_t*) 0);
387 if (space_hid < 0) return false;
388
389 type_hid = hdf5_make_range_type (H5T_NATIVE_DOUBLE);
390 if (type_hid < 0)
391 {
392 H5Sclose (space_hid);
393 return false;
394 }
395
396 data_hid = H5Dcreate (loc_id, name, type_hid, space_hid, H5P_DEFAULT);
397 if (data_hid < 0)
398 {
399 H5Sclose (space_hid);
400 H5Tclose (type_hid);
401 return false;
402 }
403
404 Range r = range_value ();
405 double range_vals[3];
406 range_vals[0] = r.base ();
407 range_vals[1] = r.limit ();
408 range_vals[2] = r.inc ();
409
410 retval = H5Dwrite (data_hid, type_hid, H5S_ALL, H5S_ALL, H5P_DEFAULT,
411 (void*) range_vals) >= 0;
412
413 H5Dclose (data_hid);
414 H5Tclose (type_hid);
415 H5Sclose (space_hid);
416 return retval;
417 }
418
419 bool
420 octave_range::load_hdf5 (hid_t loc_id, const char *name,
421 bool /* have_h5giterate_bug */)
422 {
423 bool retval = false;
424 hid_t data_hid = H5Dopen (loc_id, name);
425 hid_t type_hid = H5Dget_type (data_hid);
426
427 hid_t range_type = hdf5_make_range_type (H5T_NATIVE_DOUBLE);
428
429 if (! hdf5_types_compatible (type_hid, range_type))
430 {
431 H5Tclose(range_type);
432 H5Dclose (data_hid);
433 return false;
434 }
435
436 hid_t space_hid = H5Dget_space (data_hid);
437 hsize_t rank = H5Sget_simple_extent_ndims (space_hid);
438
439 if (rank != 0)
440 {
441 H5Tclose(range_type);
442 H5Sclose (space_hid);
443 H5Dclose (data_hid);
444 return false;
445 }
446
447 double rangevals[3];
448 if (H5Dread (data_hid, range_type, H5S_ALL, H5S_ALL, H5P_DEFAULT,
449 (void *) rangevals) >= 0)
450 {
451 retval = true;
452 Range r (rangevals[0], rangevals[1], rangevals[2]);
453 range = r;
454 }
455
456 H5Tclose(range_type);
457 H5Sclose (space_hid);
458 H5Dclose (data_hid);
459 return retval;
460
461 }
462 #endif
463
253 /* 464 /*
254 ;;; Local Variables: *** 465 ;;; Local Variables: ***
255 ;;; mode: C++ *** 466 ;;; mode: C++ ***
256 ;;; End: *** 467 ;;; End: ***
257 */ 468 */