Mercurial > hg > octave-nkf
annotate liboctave/idx-vector.cc @ 7774:ce52af0e4a10
all false logical indexing fix
author | David Bateman <dbateman@free.fr> |
---|---|
date | Tue, 13 May 2008 17:45:35 +0200 |
parents | c8da61051ea2 |
children | 7cbe01c21986 |
rev | line source |
---|---|
1 | 1 /* |
2 | |
7017 | 3 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, |
4 2003, 2004, 2005, 2006, 2007 John W. Eaton | |
1 | 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. | |
1 | 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/>. | |
1 | 21 |
22 */ | |
23 | |
240 | 24 #ifdef HAVE_CONFIG_H |
1192 | 25 #include <config.h> |
1 | 26 #endif |
27 | |
1343 | 28 #include <cstdlib> |
29 | |
3503 | 30 #include <iostream> |
164 | 31 |
1352 | 32 #include "Range.h" |
4650 | 33 #include "boolNDArray.h" |
1560 | 34 #include "dColVector.h" |
4650 | 35 #include "dNDArray.h" |
1352 | 36 |
1 | 37 #include "idx-vector.h" |
1560 | 38 #include "lo-error.h" |
2500 | 39 #include "lo-mappers.h" |
1 | 40 |
1560 | 41 #define IDX_VEC_REP idx_vector::idx_vector_rep |
42 | |
43 IDX_VEC_REP::idx_vector_rep (const IDX_VEC_REP& a) | |
4653 | 44 : data (0), len (a.len), num_zeros (a.num_zeros), num_ones (a.num_ones), |
7422 | 45 range_base (a.range_base), range_step (a.range_step), |
4653 | 46 max_val (a.max_val), min_val (a.min_val), |
47 frozen_at_z_len (a.frozen_at_z_len), frozen_len (a.frozen_len), | |
7573
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
48 colon (a.colon), range(a.range), initialized (a.initialized), |
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
49 frozen (a.frozen), colon_equiv_checked (a.colon_equiv_checked), |
4653 | 50 colon_equiv (a.colon_equiv), orig_dims (a.orig_dims) |
1 | 51 { |
52 if (len > 0) | |
53 { | |
7422 | 54 if (! range) |
55 { | |
56 data = new octave_idx_type [len]; | |
57 | |
58 for (octave_idx_type i = 0; i < len; i++) | |
59 data[i] = a.data[i]; | |
60 } | |
1 | 61 } |
62 } | |
63 | |
5275 | 64 octave_idx_type |
4938 | 65 IDX_VEC_REP::tree_to_mat_idx (double x, bool& conversion_error) |
1 | 66 { |
5275 | 67 octave_idx_type retval = -1; |
4732 | 68 |
69 conversion_error = false; | |
70 | |
71 if (D_NINT (x) != x) | |
72 { | |
73 (*current_liboctave_error_handler) | |
74 ("expecting integer index, found %f", x); | |
75 | |
76 conversion_error = true; | |
77 } | |
78 else | |
5275 | 79 retval = static_cast<octave_idx_type> (x - 1); |
4732 | 80 |
81 return retval; | |
3928 | 82 } |
83 | |
2500 | 84 static inline bool |
85 idx_is_inf_or_nan (double x) | |
86 { | |
87 bool retval = false; | |
88 | |
89 if (xisnan (x)) | |
90 { | |
91 (*current_liboctave_error_handler) ("NaN invalid as index"); | |
92 retval = true; | |
93 } | |
94 else if (xisinf (x)) | |
95 { | |
96 (*current_liboctave_error_handler) ("Inf invalid as index"); | |
97 retval = true; | |
98 } | |
99 | |
100 return retval; | |
1 | 101 } |
102 | |
1560 | 103 IDX_VEC_REP::idx_vector_rep (const ColumnVector& v) |
7422 | 104 : data (0), len (v.length ()), num_zeros (0), num_ones (0), |
105 range_base (0), range_step (0), max_val (0), min_val (0), count (1), | |
106 frozen_at_z_len (0), frozen_len (0), colon (0), range(0), | |
7573
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
107 initialized (0), frozen (0), colon_equiv_checked (0), |
7422 | 108 colon_equiv (0), orig_dims (len, 1) |
1 | 109 { |
1560 | 110 if (len == 0) |
1 | 111 { |
191 | 112 initialized = 1; |
1 | 113 return; |
114 } | |
1560 | 115 else |
1 | 116 { |
5275 | 117 data = new octave_idx_type [len]; |
2500 | 118 |
4732 | 119 bool conversion_error = false; |
120 | |
5275 | 121 for (octave_idx_type i = 0; i < len; i++) |
2500 | 122 { |
123 double d = v.elem (i); | |
124 | |
125 if (idx_is_inf_or_nan (d)) | |
126 return; | |
127 else | |
4732 | 128 data[i] = tree_to_mat_idx (d, conversion_error); |
129 | |
130 if (conversion_error) | |
131 return; | |
2500 | 132 } |
1 | 133 } |
1560 | 134 |
135 init_state (); | |
136 } | |
137 | |
4650 | 138 IDX_VEC_REP::idx_vector_rep (const NDArray& nda) |
4653 | 139 : data (0), len (nda.length ()), num_zeros (0), num_ones (0), |
7422 | 140 range_base (0), range_step (0), max_val (0), min_val (0), count (1), |
141 frozen_at_z_len (0), frozen_len (0), colon (0), range(0), | |
7573
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
142 initialized (0), frozen (0), colon_equiv_checked (0), |
7422 | 143 colon_equiv (0), orig_dims (nda.dims ()) |
1560 | 144 { |
145 if (len == 0) | |
1 | 146 { |
1560 | 147 initialized = 1; |
148 return; | |
1 | 149 } |
150 else | |
151 { | |
5275 | 152 octave_idx_type k = 0; |
153 data = new octave_idx_type [len]; | |
2500 | 154 |
4732 | 155 bool conversion_error = false; |
156 | |
5275 | 157 for (octave_idx_type i = 0; i < len; i++) |
4650 | 158 { |
159 double d = nda.elem (i); | |
2500 | 160 |
4650 | 161 if (idx_is_inf_or_nan (d)) |
162 return; | |
163 else | |
4732 | 164 data[k++] = tree_to_mat_idx (d, conversion_error); |
165 | |
166 if (conversion_error) | |
167 return; | |
4650 | 168 } |
1 | 169 } |
170 | |
1560 | 171 init_state (); |
1 | 172 } |
173 | |
1560 | 174 IDX_VEC_REP::idx_vector_rep (const Range& r) |
4653 | 175 : data (0), len (r.nelem ()), num_zeros (0), num_ones (0), |
7422 | 176 range_base (0), range_step (0), max_val (0), min_val (0), |
177 count (1), frozen_at_z_len (0), frozen_len (0), colon (0), | |
7573
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
178 range(1), initialized (0), frozen (0), |
7422 | 179 colon_equiv_checked (0), colon_equiv (0), orig_dims (1, len) |
1 | 180 { |
191 | 181 if (len < 0) |
182 { | |
1560 | 183 (*current_liboctave_error_handler) ("invalid range used as index"); |
191 | 184 return; |
185 } | |
186 else if (len == 0) | |
187 { | |
188 initialized = 1; | |
189 return; | |
190 } | |
1 | 191 |
6457 | 192 if (r.all_elements_are_ints ()) |
193 { | |
7422 | 194 range_base = static_cast<octave_idx_type> (r.base () - 1); |
195 range_step = static_cast<octave_idx_type> (r.inc ()); | |
4732 | 196 |
7422 | 197 init_state (); |
1 | 198 } |
6457 | 199 else |
200 (*current_liboctave_error_handler) | |
201 ("expecting integer index, found non integer Range"); | |
1 | 202 } |
203 | |
3928 | 204 IDX_VEC_REP::idx_vector_rep (double d) |
4653 | 205 : data (0), len (1), num_zeros (0), num_ones (0), |
7422 | 206 range_base (0), range_step (0), max_val (0), min_val (0), |
207 count (1), frozen_at_z_len (0), frozen_len (0), colon (0), | |
7573
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
208 range(1), initialized (0), frozen (0), colon_equiv_checked (0), |
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
209 colon_equiv (0), orig_dims (1, 1) |
3928 | 210 { |
211 if (idx_is_inf_or_nan (d)) | |
212 return; | |
213 else | |
214 { | |
4732 | 215 bool conversion_error = false; |
216 | |
7422 | 217 range_base = tree_to_mat_idx (d, conversion_error); |
218 range_step = 1; | |
4732 | 219 |
220 if (conversion_error) | |
221 return; | |
3928 | 222 } |
223 | |
224 init_state (); | |
225 } | |
226 | |
5275 | 227 IDX_VEC_REP::idx_vector_rep (octave_idx_type i) |
4653 | 228 : data (0), len (1), num_zeros (0), num_ones (0), |
7422 | 229 range_base (tree_to_mat_idx (i)), range_step (1), |
4653 | 230 max_val (0), min_val (0), count (1), frozen_at_z_len (0), |
7573
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
231 frozen_len (0), colon (0), range(1), initialized (0), |
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
232 frozen (0), colon_equiv_checked (0), colon_equiv (0), orig_dims (1, 1) |
3928 | 233 { |
234 init_state (); | |
235 } | |
236 | |
1560 | 237 IDX_VEC_REP::idx_vector_rep (char c) |
7422 | 238 : data (0), len (0), num_zeros (0), num_ones (0), range_base (0), |
239 range_step (0), max_val (0), min_val (0), count (1), | |
240 frozen_at_z_len (0), frozen_len (0), colon (1), range(0), | |
7573
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
241 initialized (0), frozen (0), colon_equiv_checked (0), |
7422 | 242 colon_equiv (0), orig_dims (0, 0) |
1560 | 243 { |
244 assert (c == ':'); | |
245 | |
246 init_state (); | |
247 } | |
248 | |
2828 | 249 IDX_VEC_REP::idx_vector_rep (bool b) |
7572
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
250 : data (0), len (b ? 1 : 0), num_zeros (0), num_ones (0), range_base (0), |
7422 | 251 range_step (0), max_val (0), min_val (0), count (1), |
252 frozen_at_z_len (0), frozen_len (0), colon (0), range(0), | |
7573
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
253 initialized (0), frozen (0), colon_equiv_checked (0), |
7572
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
254 colon_equiv (0), orig_dims (len, len) |
2828 | 255 { |
7572
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
256 if (len == 0) |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
257 initialized = 1; |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
258 else |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
259 { |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
260 data = new octave_idx_type [len]; |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
261 data[0] = 0; |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
262 init_state (); |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
263 } |
2828 | 264 } |
265 | |
4650 | 266 IDX_VEC_REP::idx_vector_rep (const boolNDArray& bnda) |
7572
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
267 : data (0), len (bnda.nnz ()), num_zeros (0), num_ones (0), |
7422 | 268 range_base (0), range_step (0), max_val (0), min_val (0), |
269 count (1), frozen_at_z_len (0), frozen_len (0), colon (0), | |
7573
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
270 range(0), initialized (0), frozen (0), |
7572
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
271 colon_equiv_checked (0), colon_equiv (0), orig_dims () |
2828 | 272 { |
7774
ce52af0e4a10
all false logical indexing fix
David Bateman <dbateman@free.fr>
parents:
7727
diff
changeset
|
273 dim_vector dv = bnda.dims (); |
ce52af0e4a10
all false logical indexing fix
David Bateman <dbateman@free.fr>
parents:
7727
diff
changeset
|
274 |
ce52af0e4a10
all false logical indexing fix
David Bateman <dbateman@free.fr>
parents:
7727
diff
changeset
|
275 orig_dims = ((dv.length () == 2 && dv(0) == 1) |
ce52af0e4a10
all false logical indexing fix
David Bateman <dbateman@free.fr>
parents:
7727
diff
changeset
|
276 ? dim_vector (1, len) : orig_dims = dim_vector (len, 1)); |
ce52af0e4a10
all false logical indexing fix
David Bateman <dbateman@free.fr>
parents:
7727
diff
changeset
|
277 |
2828 | 278 if (len == 0) |
7774
ce52af0e4a10
all false logical indexing fix
David Bateman <dbateman@free.fr>
parents:
7727
diff
changeset
|
279 initialized = 1; |
2828 | 280 else |
281 { | |
5275 | 282 data = new octave_idx_type [len]; |
2828 | 283 |
7572
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
284 octave_idx_type ntot = bnda.length (); |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
285 |
7727
c8da61051ea2
idx-vector.cc: fix for-loop condition
John W. Eaton <jwe@octave.org>
parents:
7573
diff
changeset
|
286 for (octave_idx_type i = 0, k = 0; i < ntot && k < len; i++) |
7572
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
287 if (bnda.elem (i)) |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
288 data[k++] = i; |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
289 |
85da2ab0c6fd
logical indexing compatibility fixes
John W. Eaton <jwe@octave.org>
parents:
7425
diff
changeset
|
290 init_state (); |
2828 | 291 } |
292 } | |
293 | |
1560 | 294 IDX_VEC_REP& |
295 IDX_VEC_REP::operator = (const IDX_VEC_REP& a) | |
1 | 296 { |
297 if (this != &a) | |
298 { | |
299 delete [] data; | |
300 len = a.len; | |
7422 | 301 |
302 if (a.data) | |
303 { | |
304 data = new octave_idx_type [len]; | |
305 | |
306 for (octave_idx_type i = 0; i < len; i++) | |
307 data[i] = a.data[i]; | |
308 } | |
309 else | |
310 data = 0; | |
1 | 311 |
312 num_zeros = a.num_zeros; | |
313 num_ones = a.num_ones; | |
7425 | 314 range_base = a.range_base; |
315 range_step = a.range_step; | |
1 | 316 max_val = a.max_val; |
317 min_val = a.min_val; | |
4653 | 318 frozen_at_z_len = a.frozen_at_z_len; |
319 frozen_len = a.frozen_len; | |
320 colon = a.colon; | |
7422 | 321 range = a.range; |
4653 | 322 initialized = a.initialized; |
323 frozen = a.frozen; | |
324 colon_equiv_checked = a.colon_equiv_checked; | |
325 colon_equiv = a.colon_equiv; | |
326 orig_dims = a.orig_dims; | |
1 | 327 } |
4653 | 328 |
1 | 329 return *this; |
330 } | |
331 | |
332 void | |
1560 | 333 IDX_VEC_REP::init_state (void) |
1 | 334 { |
335 num_zeros = 0; | |
336 num_ones = 0; | |
337 | |
1560 | 338 if (colon) |
1 | 339 { |
2828 | 340 min_val = 0; |
341 max_val = 0; | |
1 | 342 } |
7422 | 343 else if (range) |
344 { | |
345 if (range_step >= 0) | |
346 { | |
347 min_val = range_base; | |
348 max_val = (len > 0) ? range_base + (len-1)*range_step : range_base; | |
349 } | |
350 else | |
351 { | |
352 max_val = range_base; | |
353 min_val = (len > 0) ? range_base + (len-1)*range_step : range_base; | |
354 } | |
355 | |
356 if ((range_base <= 0 && range_step > 0) | |
357 || (range_base >= 0 && range_step < 0)) | |
358 num_zeros = 1; | |
359 | |
360 if ((range_base <= 1 && range_step > 0) | |
361 || (range_base >= 1 && range_step < 0)) | |
362 num_zeros = 0; | |
363 } | |
1 | 364 else |
365 { | |
366 min_val = max_val = data[0]; | |
367 | |
5275 | 368 octave_idx_type i = 0; |
1 | 369 do |
370 { | |
1560 | 371 if (data[i] == -1) |
372 num_zeros++; | |
373 else if (data[i] == 0) | |
374 num_ones++; | |
375 | |
1 | 376 if (data[i] > max_val) |
377 max_val = data[i]; | |
378 | |
379 if (data[i] < min_val) | |
380 min_val = data[i]; | |
381 } | |
382 while (++i < len); | |
383 } | |
1560 | 384 |
385 initialized = 1; | |
386 } | |
387 | |
5275 | 388 octave_idx_type |
389 IDX_VEC_REP::checkelem (octave_idx_type n) const | |
227 | 390 { |
391 if (n < 0 || n >= len) | |
392 { | |
1560 | 393 (*current_liboctave_error_handler) ("idx-vector: index out of range"); |
227 | 394 return 0; |
395 } | |
396 | |
397 return elem (n); | |
398 } | |
399 | |
1552 | 400 static inline int |
3262 | 401 intcmp (const void *ii, const void *jj) |
1552 | 402 { |
5275 | 403 return (*(static_cast<const octave_idx_type *> (ii)) - *(static_cast<const octave_idx_type *> (jj))); |
1552 | 404 } |
405 | |
1560 | 406 static inline void |
5275 | 407 sort_data (octave_idx_type *d, octave_idx_type l) |
1560 | 408 { |
5275 | 409 qsort (d, l, sizeof (octave_idx_type), intcmp); |
1560 | 410 } |
411 | |
5275 | 412 static inline octave_idx_type |
413 make_uniq (octave_idx_type *d, octave_idx_type l) | |
1560 | 414 { |
3125 | 415 if (l < 2) |
416 return l; | |
417 | |
5275 | 418 octave_idx_type k = 0; |
419 for (octave_idx_type ii = 1; ii < l; ii++) | |
1560 | 420 { |
1650 | 421 if (d[ii] != d[k]) |
1560 | 422 { |
423 k++; | |
1650 | 424 d[k] = d[ii]; |
1560 | 425 } |
426 } | |
427 return k+1; | |
428 } | |
429 | |
5275 | 430 static inline octave_idx_type * |
431 copy_data (const octave_idx_type *d, octave_idx_type l) | |
209 | 432 { |
5275 | 433 octave_idx_type *new_data = new octave_idx_type [l]; |
1560 | 434 |
5275 | 435 for (octave_idx_type ii = 0; ii < l; ii++) |
1650 | 436 new_data[ii] = d[ii]; |
1560 | 437 |
438 return new_data; | |
439 } | |
440 | |
441 int | |
5275 | 442 IDX_VEC_REP::is_colon_equiv (octave_idx_type n, int sort_uniq) |
1560 | 443 { |
444 if (! colon_equiv_checked) | |
445 { | |
446 if (colon) | |
447 { | |
448 colon_equiv = 1; | |
449 } | |
7422 | 450 else if (range) |
451 { | |
452 colon_equiv = (range_base == 0 | |
453 && len == n | |
454 && (range_step == 1 | |
455 || (range_step == -1 && sort_uniq))); | |
456 } | |
5275 | 457 else if (static_cast<octave_idx_type> (len) > 1) |
1560 | 458 { |
7573
755bf7ecc29b
eliminate one_zero stuff from idx_vector
John W. Eaton <jwe@octave.org>
parents:
7572
diff
changeset
|
459 if (sort_uniq) |
2356 | 460 { |
5275 | 461 octave_idx_type *tmp_data = copy_data (data, len); |
2966 | 462 |
2356 | 463 sort_data (tmp_data, len); |
464 | |
5275 | 465 octave_idx_type tmp_len = make_uniq (tmp_data, len); |
2966 | 466 |
467 colon_equiv = (tmp_len == n | |
468 && tmp_data[0] == 0 | |
469 && tmp_data[tmp_len-1] == tmp_len - 1); | |
1560 | 470 |
2966 | 471 delete [] tmp_data; |
472 } | |
473 else | |
474 { | |
475 if (len == n) | |
476 { | |
477 colon_equiv = 1; | |
1560 | 478 |
5275 | 479 for (octave_idx_type ii = 0; ii < n; ii++) |
2966 | 480 if (data[ii] != ii) |
481 { | |
482 colon_equiv = 0; | |
483 break; | |
484 } | |
485 } | |
486 } | |
1560 | 487 } |
488 else | |
2966 | 489 colon_equiv = (len == n && (n == 0 || (n == 1 && data[0] == 0))); |
1560 | 490 |
491 colon_equiv_checked = 1; | |
492 } | |
493 | |
494 return colon_equiv; | |
209 | 495 } |
496 | |
417 | 497 void |
3079 | 498 IDX_VEC_REP::sort (bool uniq) |
499 { | |
7422 | 500 if (range && len) |
501 { | |
502 if (range_step < 0) | |
503 { | |
504 range_base += (len-1)*(range_step); | |
505 range_step = -range_step; | |
506 } | |
507 } | |
508 else if (len > 1) | |
3125 | 509 { |
510 sort_data (data, len); | |
3079 | 511 |
3125 | 512 if (uniq) |
513 len = make_uniq (data, len); | |
514 } | |
3079 | 515 } |
516 | |
517 void | |
5275 | 518 IDX_VEC_REP::shorten (octave_idx_type n) |
434 | 519 { |
520 if (n > 0 && n <= len) | |
521 len = n; | |
522 else | |
1560 | 523 (*current_liboctave_error_handler) |
524 ("idx_vector::shorten: internal error!"); | |
434 | 525 } |
526 | |
3504 | 527 std::ostream& |
528 IDX_VEC_REP::print (std::ostream& os) const | |
1560 | 529 { |
7425 | 530 if (colon) |
531 os << "colon" << std::endl; | |
532 else if (range) | |
533 os << "range_base: " << range_base | |
534 << ", range_step: " << range_step << std::endl; | |
535 else | |
536 { | |
537 for (octave_idx_type ii = 0; ii < len; ii++) | |
538 os << data[ii] << "\n"; | |
539 } | |
540 | |
1560 | 541 return os; |
542 } | |
543 | |
5275 | 544 octave_idx_type |
5781 | 545 IDX_VEC_REP::freeze (octave_idx_type z_len, const char *tag, bool resize_ok) |
1 | 546 { |
1560 | 547 if (frozen) |
3680 | 548 return frozen_len; |
1560 | 549 |
550 frozen_len = -1; | |
551 | |
552 if (colon) | |
553 frozen_len = z_len; | |
554 else | |
555 { | |
556 if (len == 0) | |
557 frozen_len = 0; | |
558 else | |
559 { | |
1650 | 560 max_val = max (); |
561 min_val = min (); | |
1560 | 562 |
563 if (min_val < 0) | |
564 { | |
565 if (tag) | |
566 (*current_liboctave_error_handler) | |
567 ("invalid %s index = %d", tag, min_val+1); | |
568 else | |
569 (*current_liboctave_error_handler) | |
570 ("invalid index = %d", min_val+1); | |
571 | |
572 initialized = 0; | |
573 } | |
574 else if (! resize_ok && max_val >= z_len) | |
575 { | |
576 if (tag) | |
577 (*current_liboctave_error_handler) | |
578 ("invalid %s index = %d", tag, max_val+1); | |
579 else | |
580 (*current_liboctave_error_handler) | |
581 ("invalid index = %d", max_val+1); | |
582 | |
583 initialized = 0; | |
584 } | |
585 else | |
4461 | 586 { |
5781 | 587 if (max_val >= z_len) |
4461 | 588 { |
589 if (tag) | |
5781 | 590 (*current_liboctave_warning_with_id_handler) |
591 ("Octave:resize-on-range-error", | |
592 "resizing object with %s index = %d out of bounds", | |
4461 | 593 tag, max_val+1); |
594 else | |
5781 | 595 (*current_liboctave_warning_with_id_handler) |
596 ("Octave:resize-on-range-error", | |
597 "resizing object with index = %d out of bounds", | |
4461 | 598 max_val+1); |
599 } | |
600 | |
601 frozen_len = length (z_len); | |
602 } | |
1560 | 603 } |
604 } | |
605 | |
606 frozen = 1; | |
3680 | 607 |
608 frozen_at_z_len = z_len ? z_len : len; | |
1560 | 609 |
610 return frozen_len; | |
1 | 611 } |
612 | |
613 /* | |
614 ;;; Local Variables: *** | |
615 ;;; mode: C++ *** | |
616 ;;; End: *** | |
617 */ |