Mercurial > hg > octave-lyh
annotate src/ov-range.cc @ 10435:6a271334750c
implement general binary mapping facility
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Tue, 23 Mar 2010 09:30:46 +0100 |
parents | 57a59eae83cc |
children | 1834132fb50b |
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 | |
8971 | 80 case -2: |
81 retval = new octave_matrix (range.matrix_value ()); | |
82 break; | |
83 | |
2410 | 84 default: |
85 break; | |
86 } | |
87 | |
88 return retval; | |
89 } | |
90 | |
2436 | 91 octave_value |
4247 | 92 octave_range::subsref (const std::string& type, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
93 const std::list<octave_value_list>& idx) |
3933 | 94 { |
95 octave_value retval; | |
96 | |
97 switch (type[0]) | |
98 { | |
99 case '(': | |
100 retval = do_index_op (idx.front ()); | |
101 break; | |
102 | |
103 case '{': | |
104 case '.': | |
105 { | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
106 std::string nm = type_name (); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
107 error ("%s cannot be indexed with %c", nm.c_str (), type[0]); |
3933 | 108 } |
109 break; | |
110 | |
111 default: | |
112 panic_impossible (); | |
113 } | |
114 | |
115 return retval.next_subsref (type, idx); | |
116 } | |
117 | |
118 octave_value | |
5885 | 119 octave_range::do_index_op (const octave_value_list& idx, bool resize_ok) |
2436 | 120 { |
9986
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
121 if (idx.length () == 1 && ! resize_ok) |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
122 { |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
123 octave_value retval; |
2436 | 124 |
9986
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
125 // The range can handle a single subscript. |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
126 idx_vector i = idx(0).index_vector (); |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
127 if (! error_state) |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
128 { |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
129 if (i.is_scalar () && i(0) < range.nelem ()) |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
130 retval = range.elem (i(0)); |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
131 else |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
132 retval = range.index (i); |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
133 } |
2436 | 134 |
9986
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
135 return retval; |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
136 } |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
137 else |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
138 { |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
139 octave_value tmp (new octave_matrix (range.matrix_value ())); |
2436 | 140 |
9986
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
141 return tmp.do_index_op (idx, resize_ok); |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
9892
diff
changeset
|
142 } |
2436 | 143 } |
144 | |
2376 | 145 double |
146 octave_range::double_value (bool) const | |
147 { | |
4102 | 148 double retval = lo_ieee_nan_value (); |
2376 | 149 |
5275 | 150 octave_idx_type nel = range.nelem (); |
2376 | 151 |
4455 | 152 if (nel > 0) |
153 { | |
5781 | 154 gripe_implicit_conversion ("Octave:array-as-scalar", |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
155 "range", "real scalar"); |
4455 | 156 |
157 retval = range.base (); | |
158 } | |
2376 | 159 else |
160 gripe_invalid_conversion ("range", "real scalar"); | |
161 | |
162 return retval; | |
163 } | |
164 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
165 float |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
166 octave_range::float_value (bool) const |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
167 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
168 float retval = lo_ieee_float_nan_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
169 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
170 octave_idx_type nel = range.nelem (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
171 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
172 if (nel > 0) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
173 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
174 gripe_implicit_conversion ("Octave:array-as-scalar", |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
175 "range", "real scalar"); |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
176 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
177 retval = range.base (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
178 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
179 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
180 gripe_invalid_conversion ("range", "real scalar"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
181 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
182 return retval; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
183 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
184 |
9146
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
185 charNDArray |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
186 octave_range::char_array_value (bool) const |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
187 { |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
188 const Matrix matrix = range.matrix_value (); |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
189 charNDArray retval (dims ()); |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
190 |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
191 octave_idx_type nel = numel (); |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
192 |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
193 for (octave_idx_type i = 0; i < nel; i++) |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
194 retval.elem (i) = static_cast<char>(matrix.elem (i)); |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
195 |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
196 return retval; |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
197 } |
a48c500e48e1
support range->string conversions
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
198 |
2376 | 199 octave_value |
4017 | 200 octave_range::all (int dim) const |
2376 | 201 { |
5775 | 202 // FIXME -- this is a potential waste of memory. |
2436 | 203 |
204 Matrix m = range.matrix_value (); | |
205 | |
4017 | 206 return m.all (dim); |
2376 | 207 } |
208 | |
209 octave_value | |
4017 | 210 octave_range::any (int dim) const |
2376 | 211 { |
5775 | 212 // FIXME -- this is a potential waste of memory. |
4017 | 213 |
214 Matrix m = range.matrix_value (); | |
215 | |
216 return m.any (dim); | |
2376 | 217 } |
218 | |
8366
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
219 octave_value |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
220 octave_range::diag (octave_idx_type k) const |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
221 { |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
222 return (k == 0 |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
223 ? octave_value (DiagMatrix (DiagArray2<double> (range.matrix_value ()))) |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
224 : octave_value (range.diag (k))); |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
225 } |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
226 |
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8345
diff
changeset
|
227 |
2376 | 228 bool |
229 octave_range::is_true (void) const | |
230 { | |
231 bool retval = false; | |
2436 | 232 |
4478 | 233 if (range.nelem () != 0) |
2436 | 234 { |
5775 | 235 // FIXME -- this is a potential waste of memory. |
2436 | 236 |
237 Matrix m ((range.matrix_value () . all ()) . all ()); | |
238 | |
239 retval = (m.rows () == 1 && m.columns () == 1 && m (0, 0) != 0.0); | |
240 } | |
241 | |
2376 | 242 return retval; |
243 } | |
244 | |
245 Complex | |
246 octave_range::complex_value (bool) const | |
247 { | |
4102 | 248 double tmp = lo_ieee_nan_value (); |
249 | |
250 Complex retval (tmp, tmp); | |
2376 | 251 |
5275 | 252 octave_idx_type nel = range.nelem (); |
2376 | 253 |
4455 | 254 if (nel > 0) |
255 { | |
5781 | 256 gripe_implicit_conversion ("Octave:array-as-scalar", |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
257 "range", "complex scalar"); |
4455 | 258 |
259 retval = range.base (); | |
260 } | |
2376 | 261 else |
262 gripe_invalid_conversion ("range", "complex scalar"); | |
263 | |
264 return retval; | |
265 } | |
266 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
267 FloatComplex |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
268 octave_range::float_complex_value (bool) const |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
269 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
270 float tmp = lo_ieee_float_nan_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
271 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
272 FloatComplex retval (tmp, tmp); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
273 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
274 octave_idx_type nel = range.nelem (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
275 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
276 if (nel > 0) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
277 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
278 gripe_implicit_conversion ("Octave:array-as-scalar", |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
279 "range", "complex scalar"); |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
280 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
281 retval = range.base (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
282 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
283 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
284 gripe_invalid_conversion ("range", "complex scalar"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
285 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
286 return retval; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
287 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
288 |
5731 | 289 octave_value |
290 octave_range::resize (const dim_vector& dv, bool fill) const | |
291 { | |
292 NDArray retval = array_value (); | |
293 if (fill) | |
294 retval.resize (dv, NDArray::resize_fill_value()); | |
295 else | |
296 retval.resize (dv); | |
297 return retval; | |
298 } | |
299 | |
2376 | 300 octave_value |
5279 | 301 octave_range::convert_to_str_internal (bool pad, bool force, char type) const |
2449 | 302 { |
303 octave_value tmp (range.matrix_value ()); | |
5279 | 304 return tmp.convert_to_str (pad, force, type); |
2449 | 305 } |
306 | |
2376 | 307 void |
3523 | 308 octave_range::print (std::ostream& os, bool pr_as_read_syntax) const |
2901 | 309 { |
310 print_raw (os, pr_as_read_syntax); | |
311 newline (os); | |
312 } | |
313 | |
314 void | |
3523 | 315 octave_range::print_raw (std::ostream& os, bool pr_as_read_syntax) const |
2901 | 316 { |
317 octave_print_internal (os, range, pr_as_read_syntax, | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
318 current_print_indent_level ()); |
2901 | 319 } |
320 | |
321 bool | |
3523 | 322 octave_range::print_name_tag (std::ostream& os, const std::string& name) const |
2376 | 323 { |
2901 | 324 bool retval = false; |
325 | |
5275 | 326 octave_idx_type n = range.nelem (); |
2901 | 327 |
328 indent (os); | |
329 | |
330 if (n == 0 || n == 1) | |
331 os << name << " = "; | |
332 else | |
333 { | |
334 os << name << " ="; | |
335 newline (os); | |
336 newline (os); | |
337 retval = true; | |
338 } | |
339 | |
340 return retval; | |
2376 | 341 } |
342 | |
4687 | 343 // Skip white space and comments on stream IS. |
344 | |
345 static void | |
346 skip_comments (std::istream& is) | |
347 { | |
348 char c = '\0'; | |
349 while (is.get (c)) | |
350 { | |
351 if (c == ' ' || c == '\t' || c == '\n') | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
352 ; // Skip whitespace on way to beginning of next line. |
4687 | 353 else |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
354 break; |
4687 | 355 } |
356 | |
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
|
357 skip_until_newline (is, false); |
4687 | 358 } |
359 | |
360 bool | |
6974 | 361 octave_range::save_ascii (std::ostream& os) |
4687 | 362 { |
363 Range r = range_value (); | |
364 double base = r.base (); | |
365 double limit = r.limit (); | |
366 double inc = r.inc (); | |
367 | |
368 os << "# base, limit, increment\n"; | |
369 octave_write_double (os, base); | |
370 os << " "; | |
371 octave_write_double (os, limit); | |
372 os << " "; | |
373 octave_write_double (os, inc); | |
374 os << "\n"; | |
375 | |
376 return true; | |
377 } | |
378 | |
379 bool | |
380 octave_range::load_ascii (std::istream& is) | |
381 { | |
382 // # base, limit, range comment added by save (). | |
383 skip_comments (is); | |
384 | |
385 is >> range; | |
386 | |
387 if (!is) | |
388 { | |
389 error ("load: failed to load range constant"); | |
390 return false; | |
391 } | |
392 | |
393 return true; | |
394 } | |
395 | |
396 bool | |
397 octave_range::save_binary (std::ostream& os, bool& /* save_as_floats */) | |
398 { | |
5760 | 399 char tmp = LS_DOUBLE; |
400 os.write (reinterpret_cast<char *> (&tmp), 1); | |
4687 | 401 Range r = range_value (); |
402 double bas = r.base (); | |
403 double lim = r.limit (); | |
404 double inc = r.inc (); | |
5760 | 405 os.write (reinterpret_cast<char *> (&bas), 8); |
406 os.write (reinterpret_cast<char *> (&lim), 8); | |
407 os.write (reinterpret_cast<char *> (&inc), 8); | |
4687 | 408 |
409 return true; | |
410 } | |
411 | |
412 bool | |
413 octave_range::load_binary (std::istream& is, bool swap, | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
414 oct_mach_info::float_format /* fmt */) |
4687 | 415 { |
416 char tmp; | |
5760 | 417 if (! is.read (reinterpret_cast<char *> (&tmp), 1)) |
4687 | 418 return false; |
419 double bas, lim, inc; | |
5760 | 420 if (! is.read (reinterpret_cast<char *> (&bas), 8)) |
4687 | 421 return false; |
422 if (swap) | |
4944 | 423 swap_bytes<8> (&bas); |
5760 | 424 if (! is.read (reinterpret_cast<char *> (&lim), 8)) |
4687 | 425 return false; |
426 if (swap) | |
4944 | 427 swap_bytes<8> (&lim); |
5760 | 428 if (! is.read (reinterpret_cast<char *> (&inc), 8)) |
4687 | 429 return false; |
430 if (swap) | |
4944 | 431 swap_bytes<8> (&inc); |
4687 | 432 Range r (bas, lim, inc); |
433 range = r; | |
434 return true; | |
435 } | |
436 | |
437 #if defined (HAVE_HDF5) | |
4944 | 438 |
4687 | 439 // The following subroutines creates an HDF5 representation of the way |
440 // we will store Octave range types (triplets of floating-point numbers). | |
441 // NUM_TYPE is the HDF5 numeric type to use for storage (e.g. | |
442 // H5T_NATIVE_DOUBLE to save as 'double'). Note that any necessary | |
443 // conversions are handled automatically by HDF5. | |
444 | |
445 static hid_t | |
446 hdf5_make_range_type (hid_t num_type) | |
447 { | |
448 hid_t type_id = H5Tcreate (H5T_COMPOUND, sizeof (double) * 3); | |
449 | |
450 H5Tinsert (type_id, "base", 0 * sizeof (double), num_type); | |
451 H5Tinsert (type_id, "limit", 1 * sizeof (double), num_type); | |
452 H5Tinsert (type_id, "increment", 2 * sizeof (double), num_type); | |
453 | |
454 return type_id; | |
455 } | |
456 | |
457 bool | |
458 octave_range::save_hdf5 (hid_t loc_id, const char *name, | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
459 bool /* save_as_floats */) |
4687 | 460 { |
4792 | 461 hsize_t dimens[3]; |
4687 | 462 hid_t space_hid = -1, type_hid = -1, data_hid = -1; |
463 bool retval = true; | |
464 | |
4815 | 465 space_hid = H5Screate_simple (0, dimens, 0); |
4687 | 466 if (space_hid < 0) return false; |
467 | |
468 type_hid = hdf5_make_range_type (H5T_NATIVE_DOUBLE); | |
469 if (type_hid < 0) | |
470 { | |
471 H5Sclose (space_hid); | |
472 return false; | |
473 } | |
9892
ac69e6f4b33d
Add HDF5-1.8 compatibility while maintaining compatibility with HDF5-1.6 versions
Kacper Kowalik <xarthisius.kk@gmail.com>
parents:
9881
diff
changeset
|
474 #if HAVE_HDF5_18 |
ac69e6f4b33d
Add HDF5-1.8 compatibility while maintaining compatibility with HDF5-1.6 versions
Kacper Kowalik <xarthisius.kk@gmail.com>
parents:
9881
diff
changeset
|
475 data_hid = H5Dcreate (loc_id, name, type_hid, space_hid, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
476 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); |
9892
ac69e6f4b33d
Add HDF5-1.8 compatibility while maintaining compatibility with HDF5-1.6 versions
Kacper Kowalik <xarthisius.kk@gmail.com>
parents:
9881
diff
changeset
|
477 #else |
4687 | 478 data_hid = H5Dcreate (loc_id, name, type_hid, space_hid, H5P_DEFAULT); |
9892
ac69e6f4b33d
Add HDF5-1.8 compatibility while maintaining compatibility with HDF5-1.6 versions
Kacper Kowalik <xarthisius.kk@gmail.com>
parents:
9881
diff
changeset
|
479 #endif |
4687 | 480 if (data_hid < 0) |
481 { | |
482 H5Sclose (space_hid); | |
483 H5Tclose (type_hid); | |
484 return false; | |
485 } | |
486 | |
487 Range r = range_value (); | |
488 double range_vals[3]; | |
489 range_vals[0] = r.base (); | |
490 range_vals[1] = r.limit (); | |
491 range_vals[2] = r.inc (); | |
492 | |
493 retval = H5Dwrite (data_hid, type_hid, H5S_ALL, H5S_ALL, H5P_DEFAULT, | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
494 range_vals) >= 0; |
4687 | 495 |
496 H5Dclose (data_hid); | |
497 H5Tclose (type_hid); | |
498 H5Sclose (space_hid); | |
4837 | 499 |
4687 | 500 return retval; |
501 } | |
502 | |
503 bool | |
9881
b3089dba88bf
Remove HDF5 cruft for older versions of HDF5
Kacper Kowalik
parents:
9146
diff
changeset
|
504 octave_range::load_hdf5 (hid_t loc_id, const char *name) |
4687 | 505 { |
506 bool retval = false; | |
4837 | 507 |
9892
ac69e6f4b33d
Add HDF5-1.8 compatibility while maintaining compatibility with HDF5-1.6 versions
Kacper Kowalik <xarthisius.kk@gmail.com>
parents:
9881
diff
changeset
|
508 #if HAVE_HDF5_18 |
ac69e6f4b33d
Add HDF5-1.8 compatibility while maintaining compatibility with HDF5-1.6 versions
Kacper Kowalik <xarthisius.kk@gmail.com>
parents:
9881
diff
changeset
|
509 hid_t data_hid = H5Dopen (loc_id, name, H5P_DEFAULT); |
ac69e6f4b33d
Add HDF5-1.8 compatibility while maintaining compatibility with HDF5-1.6 versions
Kacper Kowalik <xarthisius.kk@gmail.com>
parents:
9881
diff
changeset
|
510 #else |
4687 | 511 hid_t data_hid = H5Dopen (loc_id, name); |
9892
ac69e6f4b33d
Add HDF5-1.8 compatibility while maintaining compatibility with HDF5-1.6 versions
Kacper Kowalik <xarthisius.kk@gmail.com>
parents:
9881
diff
changeset
|
512 #endif |
4687 | 513 hid_t type_hid = H5Dget_type (data_hid); |
514 | |
515 hid_t range_type = hdf5_make_range_type (H5T_NATIVE_DOUBLE); | |
516 | |
517 if (! hdf5_types_compatible (type_hid, range_type)) | |
518 { | |
4837 | 519 H5Tclose (range_type); |
4687 | 520 H5Dclose (data_hid); |
521 return false; | |
522 } | |
523 | |
524 hid_t space_hid = H5Dget_space (data_hid); | |
525 hsize_t rank = H5Sget_simple_extent_ndims (space_hid); | |
526 | |
527 if (rank != 0) | |
528 { | |
4837 | 529 H5Tclose (range_type); |
4687 | 530 H5Sclose (space_hid); |
531 H5Dclose (data_hid); | |
532 return false; | |
533 } | |
534 | |
535 double rangevals[3]; | |
536 if (H5Dread (data_hid, range_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
537 rangevals) >= 0) |
4687 | 538 { |
539 retval = true; | |
540 Range r (rangevals[0], rangevals[1], rangevals[2]); | |
541 range = r; | |
542 } | |
543 | |
4837 | 544 H5Tclose (range_type); |
4687 | 545 H5Sclose (space_hid); |
546 H5Dclose (data_hid); | |
4837 | 547 |
4687 | 548 return retval; |
549 } | |
4944 | 550 |
4687 | 551 #endif |
552 | |
5900 | 553 mxArray * |
554 octave_range::as_mxArray (void) const | |
555 { | |
556 mxArray *retval = new mxArray (mxDOUBLE_CLASS, dims (), mxREAL); | |
557 | |
558 double *pr = static_cast<double *> (retval->get_data ()); | |
559 | |
6686 | 560 mwSize nel = numel (); |
5900 | 561 |
562 Matrix m = matrix_value (); | |
563 | |
564 const double *p = m.data (); | |
565 | |
6686 | 566 for (mwSize i = 0; i < nel; i++) |
5900 | 567 pr[i] = p[i]; |
568 | |
569 return retval; | |
570 } |