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