comparison liboctave/idx-vector.cc @ 5275:23b37da9fd5b

[project @ 2005-04-08 16:07:35 by jwe]
author jwe
date Fri, 08 Apr 2005 16:07:37 +0000
parents 10004c9625c3
children 4c8a2e4e0717
comparison
equal deleted inserted replaced
5274:eae7b40388e9 5275:23b37da9fd5b
47 frozen (a.frozen), colon_equiv_checked (a.colon_equiv_checked), 47 frozen (a.frozen), colon_equiv_checked (a.colon_equiv_checked),
48 colon_equiv (a.colon_equiv), orig_dims (a.orig_dims) 48 colon_equiv (a.colon_equiv), orig_dims (a.orig_dims)
49 { 49 {
50 if (len > 0) 50 if (len > 0)
51 { 51 {
52 data = new int [len]; 52 data = new octave_idx_type [len];
53 for (int i = 0; i < len; i++) 53 for (octave_idx_type i = 0; i < len; i++)
54 data[i] = a.data[i]; 54 data[i] = a.data[i];
55 } 55 }
56 } 56 }
57 57
58 int 58 octave_idx_type
59 IDX_VEC_REP::tree_to_mat_idx (double x, bool& conversion_error) 59 IDX_VEC_REP::tree_to_mat_idx (double x, bool& conversion_error)
60 { 60 {
61 int retval = -1; 61 octave_idx_type retval = -1;
62 62
63 conversion_error = false; 63 conversion_error = false;
64 64
65 if (D_NINT (x) != x) 65 if (D_NINT (x) != x)
66 { 66 {
68 ("expecting integer index, found %f", x); 68 ("expecting integer index, found %f", x);
69 69
70 conversion_error = true; 70 conversion_error = true;
71 } 71 }
72 else 72 else
73 retval = static_cast<int> (x - 1); 73 retval = static_cast<octave_idx_type> (x - 1);
74 74
75 return retval; 75 return retval;
76 } 76 }
77 77
78 static inline bool 78 static inline bool
105 initialized = 1; 105 initialized = 1;
106 return; 106 return;
107 } 107 }
108 else 108 else
109 { 109 {
110 data = new int [len]; 110 data = new octave_idx_type [len];
111 111
112 bool conversion_error = false; 112 bool conversion_error = false;
113 113
114 for (int i = 0; i < len; i++) 114 for (octave_idx_type i = 0; i < len; i++)
115 { 115 {
116 double d = v.elem (i); 116 double d = v.elem (i);
117 117
118 if (idx_is_inf_or_nan (d)) 118 if (idx_is_inf_or_nan (d))
119 return; 119 return;
140 initialized = 1; 140 initialized = 1;
141 return; 141 return;
142 } 142 }
143 else 143 else
144 { 144 {
145 int k = 0; 145 octave_idx_type k = 0;
146 data = new int [len]; 146 data = new octave_idx_type [len];
147 147
148 bool conversion_error = false; 148 bool conversion_error = false;
149 149
150 for (int i = 0; i < len; i++) 150 for (octave_idx_type i = 0; i < len; i++)
151 { 151 {
152 double d = nda.elem (i); 152 double d = nda.elem (i);
153 153
154 if (idx_is_inf_or_nan (d)) 154 if (idx_is_inf_or_nan (d))
155 return; 155 return;
183 } 183 }
184 184
185 double b = r.base (); 185 double b = r.base ();
186 double step = r.inc (); 186 double step = r.inc ();
187 187
188 data = new int [len]; 188 data = new octave_idx_type [len];
189 189
190 bool conversion_error = false; 190 bool conversion_error = false;
191 191
192 for (int i = 0; i < len; i++) 192 for (octave_idx_type i = 0; i < len; i++)
193 { 193 {
194 double val = b + i * step; 194 double val = b + i * step;
195 195
196 if (idx_is_inf_or_nan (val)) 196 if (idx_is_inf_or_nan (val))
197 return; 197 return;
214 { 214 {
215 if (idx_is_inf_or_nan (d)) 215 if (idx_is_inf_or_nan (d))
216 return; 216 return;
217 else 217 else
218 { 218 {
219 data = new int [len]; 219 data = new octave_idx_type [len];
220 220
221 bool conversion_error = false; 221 bool conversion_error = false;
222 222
223 data[0] = tree_to_mat_idx (d, conversion_error); 223 data[0] = tree_to_mat_idx (d, conversion_error);
224 224
227 } 227 }
228 228
229 init_state (); 229 init_state ();
230 } 230 }
231 231
232 IDX_VEC_REP::idx_vector_rep (int i) 232 IDX_VEC_REP::idx_vector_rep (octave_idx_type i)
233 : data (0), len (1), num_zeros (0), num_ones (0), 233 : data (0), len (1), num_zeros (0), num_ones (0),
234 max_val (0), min_val (0), count (1), frozen_at_z_len (0), 234 max_val (0), min_val (0), count (1), frozen_at_z_len (0),
235 frozen_len (0), colon (0), one_zero (0), initialized (0), 235 frozen_len (0), colon (0), one_zero (0), initialized (0),
236 frozen (0), colon_equiv_checked (0), colon_equiv (0), 236 frozen (0), colon_equiv_checked (0), colon_equiv (0),
237 orig_dims (1, 1) 237 orig_dims (1, 1)
238 { 238 {
239 data = new int [len]; 239 data = new octave_idx_type [len];
240 240
241 data[0] = tree_to_mat_idx (i); 241 data[0] = tree_to_mat_idx (i);
242 242
243 init_state (); 243 init_state ();
244 } 244 }
260 max_val (0), min_val (0), count (1), frozen_at_z_len (0), 260 max_val (0), min_val (0), count (1), frozen_at_z_len (0),
261 frozen_len (0), colon (0), one_zero (1), initialized (0), 261 frozen_len (0), colon (0), one_zero (1), initialized (0),
262 frozen (0), colon_equiv_checked (0), colon_equiv (0), 262 frozen (0), colon_equiv_checked (0), colon_equiv (0),
263 orig_dims (1, 1) 263 orig_dims (1, 1)
264 { 264 {
265 data = new int [len]; 265 data = new octave_idx_type [len];
266 266
267 data[0] = tree_to_mat_idx (b); 267 data[0] = tree_to_mat_idx (b);
268 268
269 init_state (); 269 init_state ();
270 } 270 }
281 initialized = 1; 281 initialized = 1;
282 return; 282 return;
283 } 283 }
284 else 284 else
285 { 285 {
286 int k = 0; 286 octave_idx_type k = 0;
287 data = new int [len]; 287 data = new octave_idx_type [len];
288 288
289 for (int i = 0; i < len; i++) 289 for (octave_idx_type i = 0; i < len; i++)
290 data[k++] = tree_to_mat_idx (bnda.elem (i)); 290 data[k++] = tree_to_mat_idx (bnda.elem (i));
291 } 291 }
292 292
293 init_state (); 293 init_state ();
294 } 294 }
298 { 298 {
299 if (this != &a) 299 if (this != &a)
300 { 300 {
301 delete [] data; 301 delete [] data;
302 len = a.len; 302 len = a.len;
303 data = new int [len]; 303 data = new octave_idx_type [len];
304 for (int i = 0; i < len; i++) 304 for (octave_idx_type i = 0; i < len; i++)
305 data[i] = a.data[i]; 305 data[i] = a.data[i];
306 306
307 num_zeros = a.num_zeros; 307 num_zeros = a.num_zeros;
308 num_ones = a.num_ones; 308 num_ones = a.num_ones;
309 max_val = a.max_val; 309 max_val = a.max_val;
335 } 335 }
336 else 336 else
337 { 337 {
338 min_val = max_val = data[0]; 338 min_val = max_val = data[0];
339 339
340 int i = 0; 340 octave_idx_type i = 0;
341 do 341 do
342 { 342 {
343 if (data[i] == -1) 343 if (data[i] == -1)
344 num_zeros++; 344 num_zeros++;
345 else if (data[i] == 0) 345 else if (data[i] == 0)
356 356
357 initialized = 1; 357 initialized = 1;
358 } 358 }
359 359
360 void 360 void
361 IDX_VEC_REP::maybe_convert_one_zero_to_idx (int z_len) 361 IDX_VEC_REP::maybe_convert_one_zero_to_idx (octave_idx_type z_len)
362 { 362 {
363 if (one_zero && (z_len == len || z_len == 0)) 363 if (one_zero && (z_len == len || z_len == 0))
364 { 364 {
365 if (num_ones == 0) 365 if (num_ones == 0)
366 { 366 {
372 } 372 }
373 else 373 else
374 { 374 {
375 assert (num_ones + num_zeros == len); 375 assert (num_ones + num_zeros == len);
376 376
377 int *new_data = new int [num_ones]; 377 octave_idx_type *new_data = new octave_idx_type [num_ones];
378 int k = 0; 378 octave_idx_type k = 0;
379 for (int i = 0; i < len; i++) 379 for (octave_idx_type i = 0; i < len; i++)
380 if (data[i] == 0) 380 if (data[i] == 0)
381 new_data[k++] = i; 381 new_data[k++] = i;
382 382
383 delete [] data; 383 delete [] data;
384 len = num_ones; 384 len = num_ones;
385 data = new_data; 385 data = new_data;
386 386
387 min_val = max_val = data[0]; 387 min_val = max_val = data[0];
388 388
389 int i = 0; 389 octave_idx_type i = 0;
390 do 390 do
391 { 391 {
392 if (data[i] > max_val) 392 if (data[i] > max_val)
393 max_val = data[i]; 393 max_val = data[i];
394 394
398 while (++i < len); 398 while (++i < len);
399 } 399 }
400 } 400 }
401 } 401 }
402 402
403 int 403 octave_idx_type
404 IDX_VEC_REP::checkelem (int n) const 404 IDX_VEC_REP::checkelem (octave_idx_type n) const
405 { 405 {
406 if (n < 0 || n >= len) 406 if (n < 0 || n >= len)
407 { 407 {
408 (*current_liboctave_error_handler) ("idx-vector: index out of range"); 408 (*current_liboctave_error_handler) ("idx-vector: index out of range");
409 return 0; 409 return 0;
413 } 413 }
414 414
415 static inline int 415 static inline int
416 intcmp (const void *ii, const void *jj) 416 intcmp (const void *ii, const void *jj)
417 { 417 {
418 return (*(static_cast<const int *> (ii)) - *(static_cast<const int *> (jj))); 418 return (*(static_cast<const octave_idx_type *> (ii)) - *(static_cast<const octave_idx_type *> (jj)));
419 } 419 }
420 420
421 static inline void 421 static inline void
422 sort_data (int *d, int l) 422 sort_data (octave_idx_type *d, octave_idx_type l)
423 { 423 {
424 qsort (d, l, sizeof (int), intcmp); 424 qsort (d, l, sizeof (octave_idx_type), intcmp);
425 } 425 }
426 426
427 static inline int 427 static inline octave_idx_type
428 make_uniq (int *d, int l) 428 make_uniq (octave_idx_type *d, octave_idx_type l)
429 { 429 {
430 if (l < 2) 430 if (l < 2)
431 return l; 431 return l;
432 432
433 int k = 0; 433 octave_idx_type k = 0;
434 for (int ii = 1; ii < l; ii++) 434 for (octave_idx_type ii = 1; ii < l; ii++)
435 { 435 {
436 if (d[ii] != d[k]) 436 if (d[ii] != d[k])
437 { 437 {
438 k++; 438 k++;
439 d[k] = d[ii]; 439 d[k] = d[ii];
440 } 440 }
441 } 441 }
442 return k+1; 442 return k+1;
443 } 443 }
444 444
445 static inline int * 445 static inline octave_idx_type *
446 copy_data (const int *d, int l) 446 copy_data (const octave_idx_type *d, octave_idx_type l)
447 { 447 {
448 int *new_data = new int [l]; 448 octave_idx_type *new_data = new octave_idx_type [l];
449 449
450 for (int ii = 0; ii < l; ii++) 450 for (octave_idx_type ii = 0; ii < l; ii++)
451 new_data[ii] = d[ii]; 451 new_data[ii] = d[ii];
452 452
453 return new_data; 453 return new_data;
454 } 454 }
455 455
456 int 456 int
457 IDX_VEC_REP::is_colon_equiv (int n, int sort_uniq) 457 IDX_VEC_REP::is_colon_equiv (octave_idx_type n, int sort_uniq)
458 { 458 {
459 if (! colon_equiv_checked) 459 if (! colon_equiv_checked)
460 { 460 {
461 if (colon) 461 if (colon)
462 { 462 {
463 colon_equiv = 1; 463 colon_equiv = 1;
464 } 464 }
465 else if (len > 1) 465 else if (static_cast<octave_idx_type> (len) > 1)
466 { 466 {
467 if (one_zero) 467 if (one_zero)
468 { 468 {
469 colon_equiv = (len == n && ones_count () == n); 469 colon_equiv = (len == n && ones_count () == n);
470 } 470 }
471 else if (sort_uniq) 471 else if (sort_uniq)
472 { 472 {
473 int *tmp_data = copy_data (data, len); 473 octave_idx_type *tmp_data = copy_data (data, len);
474 474
475 sort_data (tmp_data, len); 475 sort_data (tmp_data, len);
476 476
477 int tmp_len = make_uniq (tmp_data, len); 477 octave_idx_type tmp_len = make_uniq (tmp_data, len);
478 478
479 colon_equiv = (tmp_len == n 479 colon_equiv = (tmp_len == n
480 && tmp_data[0] == 0 480 && tmp_data[0] == 0
481 && tmp_data[tmp_len-1] == tmp_len - 1); 481 && tmp_data[tmp_len-1] == tmp_len - 1);
482 482
486 { 486 {
487 if (len == n) 487 if (len == n)
488 { 488 {
489 colon_equiv = 1; 489 colon_equiv = 1;
490 490
491 for (int ii = 0; ii < n; ii++) 491 for (octave_idx_type ii = 0; ii < n; ii++)
492 if (data[ii] != ii) 492 if (data[ii] != ii)
493 { 493 {
494 colon_equiv = 0; 494 colon_equiv = 0;
495 break; 495 break;
496 } 496 }
517 len = make_uniq (data, len); 517 len = make_uniq (data, len);
518 } 518 }
519 } 519 }
520 520
521 void 521 void
522 IDX_VEC_REP::shorten (int n) 522 IDX_VEC_REP::shorten (octave_idx_type n)
523 { 523 {
524 if (n > 0 && n <= len) 524 if (n > 0 && n <= len)
525 len = n; 525 len = n;
526 else 526 else
527 (*current_liboctave_error_handler) 527 (*current_liboctave_error_handler)
529 } 529 }
530 530
531 std::ostream& 531 std::ostream&
532 IDX_VEC_REP::print (std::ostream& os) const 532 IDX_VEC_REP::print (std::ostream& os) const
533 { 533 {
534 for (int ii = 0; ii < len; ii++) 534 for (octave_idx_type ii = 0; ii < len; ii++)
535 os << data[ii] << "\n"; 535 os << data[ii] << "\n";
536 return os; 536 return os;
537 } 537 }
538 538
539 int 539 octave_idx_type
540 IDX_VEC_REP::freeze (int z_len, const char *tag, bool resize_ok, 540 IDX_VEC_REP::freeze (octave_idx_type z_len, const char *tag, bool resize_ok,
541 bool warn_resize) 541 bool warn_resize)
542 { 542 {
543 if (frozen) 543 if (frozen)
544 return frozen_len; 544 return frozen_len;
545 545