Mercurial > hg > octave-thorsten
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 */ |