Mercurial > octave-libgccjit
annotate src/ov-range.cc @ 8946:e7e928088e90
fix CRLF issues with text-mode reading in windows when loading ascii data
author | Benjamin Lindner <lindnerb@users.sourceforge.net> |
---|---|
date | Tue, 10 Mar 2009 01:01:50 -0400 |
parents | eb63fbe60fab |
children | 967a692ddfe2 |
rev | line source |
---|---|
2376 | 1 /* |
2 | |
7017 | 3 Copyright (C) 1996, 1997, 1998, 2000, 2002, 2003, 2004, 2005, 2006, |
8920 | 4 2007, 2008 John W. Eaton |
2376 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
2376 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
2376 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
27 | |
3503 | 28 #include <iostream> |
2901 | 29 |
2376 | 30 #include "lo-ieee.h" |
31 #include "lo-utils.h" | |
32 | |
33 #include "gripes.h" | |
34 #include "ops.h" | |
3933 | 35 #include "oct-obj.h" |
2376 | 36 #include "ov-range.h" |
37 #include "ov-re-mat.h" | |
2410 | 38 #include "ov-scalar.h" |
2376 | 39 #include "pr-output.h" |
40 | |
4687 | 41 #include "byte-swap.h" |
8946
e7e928088e90
fix CRLF issues with text-mode reading in windows when loading ascii data
Benjamin Lindner <lindnerb@users.sourceforge.net>
parents:
8920
diff
changeset
|
42 #include "ls-ascii-helper.h" |
4687 | 43 #include "ls-hdf5.h" |
44 #include "ls-utils.h" | |
45 | |
3219 | 46 DEFINE_OCTAVE_ALLOCATOR (octave_range); |
2376 | 47 |
4612 | 48 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_range, "range", "double"); |
2376 | 49 |
5759 | 50 static octave_base_value * |
51 default_numeric_conversion_function (const octave_base_value& a) | |
2376 | 52 { |
53 CAST_CONV_ARG (const octave_range&); | |
54 | |
55 return new octave_matrix (v.matrix_value ()); | |
56 } | |
57 | |
8345
c777f3ce02d8
smarter conversion lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
58 octave_base_value::type_conv_info |
2376 | 59 octave_range::numeric_conversion_function (void) const |
60 { | |
8345
c777f3ce02d8
smarter conversion lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
61 return octave_base_value::type_conv_info (default_numeric_conversion_function, |
c777f3ce02d8
smarter conversion lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
62 octave_matrix::static_type_id ()); |
2376 | 63 } |
64 | |
5759 | 65 octave_base_value * |
2410 | 66 octave_range::try_narrowing_conversion (void) |
67 { | |
5759 | 68 octave_base_value *retval = 0; |
2410 | 69 |
70 switch (range.nelem ()) | |
71 { | |
72 case 1: | |
73 retval = new octave_scalar (range.base ()); | |
74 break; | |
75 | |
76 case 0: | |
4417 | 77 retval = new octave_matrix (Matrix (1, 0)); |
2410 | 78 break; |
79 | |
80 default: | |
81 break; | |
82 } | |
83 | |
84 return retval; | |
85 } | |
86 | |
2436 | 87 octave_value |
4247 | 88 octave_range::subsref (const std::string& type, |
4219 | 89 const std::list<octave_value_list>& idx) |
3933 | 90 { |
91 octave_value retval; | |
92 | |
93 switch (type[0]) | |
94 { | |
95 case '(': | |
96 retval = do_index_op (idx.front ()); | |
97 break; | |
98 | |
99 case '{': | |
100 case '.': | |
101 { | |
102 std::string nm = type_name (); | |
103 error ("%s cannot be indexed with %c", nm.c_str (), type[0]); | |
104 } | |
105 break; | |
106 | |
107 default: | |
108 panic_impossible (); | |
109 } | |
110 | |
111 return retval.next_subsref (type, idx); | |
112 } | |
113 | |
114 octave_value | |
5885 | 115 octave_range::do_index_op (const octave_value_list& idx, bool resize_ok) |
2436 | 116 { |
5775 | 117 // FIXME -- this doesn't solve the problem of |
2436 | 118 // |
119 // a = 1:5; a(1, 1, 1) | |
120 // | |
121 // and similar constructions. Hmm... | |
122 | |
5775 | 123 // FIXME -- using this constructor avoids possibly narrowing |
2436 | 124 // the range to a scalar value. Need a better solution to this |
125 // problem. | |
126 | |
127 octave_value tmp (new octave_matrix (range.matrix_value ())); | |
128 | |
3933 | 129 return tmp.do_index_op (idx, resize_ok); |
2436 | 130 } |
131 | |
2376 | 132 double |
133 octave_range::double_value (bool) const | |
134 { | |
4102 | 135 double retval = lo_ieee_nan_value (); |
2376 | 136 |
5275 | 137 octave_idx_type nel = range.nelem (); |
2376 | 138 |
4455 | 139 if (nel > 0) |
140 { | |
5781 | 141 gripe_implicit_conversion ("Octave:array-as-scalar", |
142 "range", "real scalar"); | |
4455 | 143 |
144 retval = range.base (); | |
145 } | |
2376 | 146 else |
147 gripe_invalid_conversion ("range", "real scalar"); | |
148 | |
149 return retval; | |
150 } | |
151 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
152 float |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
153 octave_range::float_value (bool) const |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
154 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
155 float retval = lo_ieee_float_nan_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
156 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
157 octave_idx_type nel = range.nelem (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
158 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
159 if (nel > 0) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
160 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
161 gripe_implicit_conversion ("Octave:array-as-scalar", |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
162 "range", "real scalar"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
163 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
164 retval = range.base (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
165 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
166 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
167 gripe_invalid_conversion ("range", "real scalar"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
168 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
169 return retval; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
170 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
171 |
2376 | 172 octave_value |
4017 | 173 octave_range::all (int dim) const |
2376 | 174 { |
5775 | 175 // FIXME -- this is a potential waste of memory. |
2436 | 176 |
177 Matrix m = range.matrix_value (); | |
178 | |
4017 | 179 return m.all (dim); |
2376 | 180 } |
181 | |
182 octave_value | |
4017 | 183 octave_range::any (int dim) const |
2376 | 184 { |
5775 | 185 // FIXME -- this is a potential waste of memory. |
4017 | 186 |
187 Matrix m = range.matrix_value (); | |
188 | |
189 return m.any (dim); | |
2376 | 190 } |
191 | |
8366
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
192 octave_value |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
193 octave_range::diag (octave_idx_type k) const |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
194 { |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
195 return (k == 0 |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
196 ? octave_value (DiagMatrix (DiagArray2<double> (range.matrix_value ()))) |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
197 : octave_value (range.diag (k))); |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
198 } |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
199 |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
200 |
2376 | 201 bool |
202 octave_range::is_true (void) const | |
203 { | |
204 bool retval = false; | |
2436 | 205 |
4478 | 206 if (range.nelem () != 0) |
2436 | 207 { |
5775 | 208 // FIXME -- this is a potential waste of memory. |
2436 | 209 |
210 Matrix m ((range.matrix_value () . all ()) . all ()); | |
211 | |
212 retval = (m.rows () == 1 && m.columns () == 1 && m (0, 0) != 0.0); | |
213 } | |
214 | |
2376 | 215 return retval; |
216 } | |
217 | |
218 Complex | |
219 octave_range::complex_value (bool) const | |
220 { | |
4102 | 221 double tmp = lo_ieee_nan_value (); |
222 | |
223 Complex retval (tmp, tmp); | |
2376 | 224 |
5275 | 225 octave_idx_type nel = range.nelem (); |
2376 | 226 |
4455 | 227 if (nel > 0) |
228 { | |
5781 | 229 gripe_implicit_conversion ("Octave:array-as-scalar", |
230 "range", "complex scalar"); | |
4455 | 231 |
232 retval = range.base (); | |
233 } | |
2376 | 234 else |
235 gripe_invalid_conversion ("range", "complex scalar"); | |
236 | |
237 return retval; | |
238 } | |
239 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
240 FloatComplex |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
241 octave_range::float_complex_value (bool) const |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
242 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
243 float tmp = lo_ieee_float_nan_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
244 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
245 FloatComplex retval (tmp, tmp); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
246 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
247 octave_idx_type nel = range.nelem (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
248 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
249 if (nel > 0) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
250 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
251 gripe_implicit_conversion ("Octave:array-as-scalar", |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
252 "range", "complex scalar"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
253 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
254 retval = range.base (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
255 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
256 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
257 gripe_invalid_conversion ("range", "complex scalar"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
258 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
259 return retval; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
260 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
261 |
5731 | 262 octave_value |
263 octave_range::resize (const dim_vector& dv, bool fill) const | |
264 { | |
265 NDArray retval = array_value (); | |
266 if (fill) | |
267 retval.resize (dv, NDArray::resize_fill_value()); | |
268 else | |
269 retval.resize (dv); | |
270 return retval; | |
271 } | |
272 | |
2376 | 273 octave_value |
5279 | 274 octave_range::convert_to_str_internal (bool pad, bool force, char type) const |
2449 | 275 { |
276 octave_value tmp (range.matrix_value ()); | |
5279 | 277 return tmp.convert_to_str (pad, force, type); |
2449 | 278 } |
279 | |
2376 | 280 void |
3523 | 281 octave_range::print (std::ostream& os, bool pr_as_read_syntax) const |
2901 | 282 { |
283 print_raw (os, pr_as_read_syntax); | |
284 newline (os); | |
285 } | |
286 | |
287 void | |
3523 | 288 octave_range::print_raw (std::ostream& os, bool pr_as_read_syntax) const |
2901 | 289 { |
290 octave_print_internal (os, range, pr_as_read_syntax, | |
291 current_print_indent_level ()); | |
292 } | |
293 | |
294 bool | |
3523 | 295 octave_range::print_name_tag (std::ostream& os, const std::string& name) const |
2376 | 296 { |
2901 | 297 bool retval = false; |
298 | |
5275 | 299 octave_idx_type n = range.nelem (); |
2901 | 300 |
301 indent (os); | |
302 | |
303 if (n == 0 || n == 1) | |
304 os << name << " = "; | |
305 else | |
306 { | |
307 os << name << " ="; | |
308 newline (os); | |
309 newline (os); | |
310 retval = true; | |
311 } | |
312 | |
313 return retval; | |
2376 | 314 } |
315 | |
4687 | 316 // Skip white space and comments on stream IS. |
317 | |
318 static void | |
319 skip_comments (std::istream& is) | |
320 { | |
321 char c = '\0'; | |
322 while (is.get (c)) | |
323 { | |
324 if (c == ' ' || c == '\t' || c == '\n') | |
325 ; // Skip whitespace on way to beginning of next line. | |
326 else | |
327 break; | |
328 } | |
329 | |
8946
e7e928088e90
fix CRLF issues with text-mode reading in windows when loading ascii data
Benjamin Lindner <lindnerb@users.sourceforge.net>
parents:
8920
diff
changeset
|
330 skip_until_newline (is, false); |
4687 | 331 } |
332 | |
333 bool | |
6974 | 334 octave_range::save_ascii (std::ostream& os) |
4687 | 335 { |
336 Range r = range_value (); | |
337 double base = r.base (); | |
338 double limit = r.limit (); | |
339 double inc = r.inc (); | |
340 | |
341 os << "# base, limit, increment\n"; | |
342 octave_write_double (os, base); | |
343 os << " "; | |
344 octave_write_double (os, limit); | |
345 os << " "; | |
346 octave_write_double (os, inc); | |
347 os << "\n"; | |
348 | |
349 return true; | |
350 } | |
351 | |
352 bool | |
353 octave_range::load_ascii (std::istream& is) | |
354 { | |
355 // # base, limit, range comment added by save (). | |
356 skip_comments (is); | |
357 | |
358 is >> range; | |
359 | |
360 if (!is) | |
361 { | |
362 error ("load: failed to load range constant"); | |
363 return false; | |
364 } | |
365 | |
366 return true; | |
367 } | |
368 | |
369 bool | |
370 octave_range::save_binary (std::ostream& os, bool& /* save_as_floats */) | |
371 { | |
5760 | 372 char tmp = LS_DOUBLE; |
373 os.write (reinterpret_cast<char *> (&tmp), 1); | |
4687 | 374 Range r = range_value (); |
375 double bas = r.base (); | |
376 double lim = r.limit (); | |
377 double inc = r.inc (); | |
5760 | 378 os.write (reinterpret_cast<char *> (&bas), 8); |
379 os.write (reinterpret_cast<char *> (&lim), 8); | |
380 os.write (reinterpret_cast<char *> (&inc), 8); | |
4687 | 381 |
382 return true; | |
383 } | |
384 | |
385 bool | |
386 octave_range::load_binary (std::istream& is, bool swap, | |
387 oct_mach_info::float_format /* fmt */) | |
388 { | |
389 char tmp; | |
5760 | 390 if (! is.read (reinterpret_cast<char *> (&tmp), 1)) |
4687 | 391 return false; |
392 double bas, lim, inc; | |
5760 | 393 if (! is.read (reinterpret_cast<char *> (&bas), 8)) |
4687 | 394 return false; |
395 if (swap) | |
4944 | 396 swap_bytes<8> (&bas); |
5760 | 397 if (! is.read (reinterpret_cast<char *> (&lim), 8)) |
4687 | 398 return false; |
399 if (swap) | |
4944 | 400 swap_bytes<8> (&lim); |
5760 | 401 if (! is.read (reinterpret_cast<char *> (&inc), 8)) |
4687 | 402 return false; |
403 if (swap) | |
4944 | 404 swap_bytes<8> (&inc); |
4687 | 405 Range r (bas, lim, inc); |
406 range = r; | |
407 return true; | |
408 } | |
409 | |
410 #if defined (HAVE_HDF5) | |
4944 | 411 |
4687 | 412 // The following subroutines creates an HDF5 representation of the way |
413 // we will store Octave range types (triplets of floating-point numbers). | |
414 // NUM_TYPE is the HDF5 numeric type to use for storage (e.g. | |
415 // H5T_NATIVE_DOUBLE to save as 'double'). Note that any necessary | |
416 // conversions are handled automatically by HDF5. | |
417 | |
418 static hid_t | |
419 hdf5_make_range_type (hid_t num_type) | |
420 { | |
421 hid_t type_id = H5Tcreate (H5T_COMPOUND, sizeof (double) * 3); | |
422 | |
423 H5Tinsert (type_id, "base", 0 * sizeof (double), num_type); | |
424 H5Tinsert (type_id, "limit", 1 * sizeof (double), num_type); | |
425 H5Tinsert (type_id, "increment", 2 * sizeof (double), num_type); | |
426 | |
427 return type_id; | |
428 } | |
429 | |
430 bool | |
431 octave_range::save_hdf5 (hid_t loc_id, const char *name, | |
432 bool /* save_as_floats */) | |
433 { | |
4792 | 434 hsize_t dimens[3]; |
4687 | 435 hid_t space_hid = -1, type_hid = -1, data_hid = -1; |
436 bool retval = true; | |
437 | |
4815 | 438 space_hid = H5Screate_simple (0, dimens, 0); |
4687 | 439 if (space_hid < 0) return false; |
440 | |
441 type_hid = hdf5_make_range_type (H5T_NATIVE_DOUBLE); | |
442 if (type_hid < 0) | |
443 { | |
444 H5Sclose (space_hid); | |
445 return false; | |
446 } | |
447 | |
448 data_hid = H5Dcreate (loc_id, name, type_hid, space_hid, H5P_DEFAULT); | |
449 if (data_hid < 0) | |
450 { | |
451 H5Sclose (space_hid); | |
452 H5Tclose (type_hid); | |
453 return false; | |
454 } | |
455 | |
456 Range r = range_value (); | |
457 double range_vals[3]; | |
458 range_vals[0] = r.base (); | |
459 range_vals[1] = r.limit (); | |
460 range_vals[2] = r.inc (); | |
461 | |
462 retval = H5Dwrite (data_hid, type_hid, H5S_ALL, H5S_ALL, H5P_DEFAULT, | |
4815 | 463 range_vals) >= 0; |
4687 | 464 |
465 H5Dclose (data_hid); | |
466 H5Tclose (type_hid); | |
467 H5Sclose (space_hid); | |
4837 | 468 |
4687 | 469 return retval; |
470 } | |
471 | |
472 bool | |
473 octave_range::load_hdf5 (hid_t loc_id, const char *name, | |
474 bool /* have_h5giterate_bug */) | |
475 { | |
476 bool retval = false; | |
4837 | 477 |
4687 | 478 hid_t data_hid = H5Dopen (loc_id, name); |
479 hid_t type_hid = H5Dget_type (data_hid); | |
480 | |
481 hid_t range_type = hdf5_make_range_type (H5T_NATIVE_DOUBLE); | |
482 | |
483 if (! hdf5_types_compatible (type_hid, range_type)) | |
484 { | |
4837 | 485 H5Tclose (range_type); |
4687 | 486 H5Dclose (data_hid); |
487 return false; | |
488 } | |
489 | |
490 hid_t space_hid = H5Dget_space (data_hid); | |
491 hsize_t rank = H5Sget_simple_extent_ndims (space_hid); | |
492 | |
493 if (rank != 0) | |
494 { | |
4837 | 495 H5Tclose (range_type); |
4687 | 496 H5Sclose (space_hid); |
497 H5Dclose (data_hid); | |
498 return false; | |
499 } | |
500 | |
501 double rangevals[3]; | |
502 if (H5Dread (data_hid, range_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, | |
4815 | 503 rangevals) >= 0) |
4687 | 504 { |
505 retval = true; | |
506 Range r (rangevals[0], rangevals[1], rangevals[2]); | |
507 range = r; | |
508 } | |
509 | |
4837 | 510 H5Tclose (range_type); |
4687 | 511 H5Sclose (space_hid); |
512 H5Dclose (data_hid); | |
4837 | 513 |
4687 | 514 return retval; |
515 } | |
4944 | 516 |
4687 | 517 #endif |
518 | |
5900 | 519 mxArray * |
520 octave_range::as_mxArray (void) const | |
521 { | |
522 mxArray *retval = new mxArray (mxDOUBLE_CLASS, dims (), mxREAL); | |
523 | |
524 double *pr = static_cast<double *> (retval->get_data ()); | |
525 | |
6686 | 526 mwSize nel = numel (); |
5900 | 527 |
528 Matrix m = matrix_value (); | |
529 | |
530 const double *p = m.data (); | |
531 | |
6686 | 532 for (mwSize i = 0; i < nel; i++) |
5900 | 533 pr[i] = p[i]; |
534 | |
535 return retval; | |
536 } | |
537 | |
2376 | 538 /* |
539 ;;; Local Variables: *** | |
540 ;;; mode: C++ *** | |
541 ;;; End: *** | |
542 */ |