# HG changeset patch # User Jaroslav Hajek # Date 1270561136 -7200 # Node ID 077fef5da460989098e2cc21bfae9e2b63d6bb9f # Parent fdccd69d26bd87d85411d309d6c9dd66fd5be674 optimize null assignment with bool masks diff -r fdccd69d26bd -r 077fef5da460 liboctave/ChangeLog --- a/liboctave/ChangeLog Tue Apr 06 13:42:59 2010 +0200 +++ b/liboctave/ChangeLog Tue Apr 06 15:38:56 2010 +0200 @@ -1,3 +1,7 @@ +2010-04-06 Jaroslav Hajek + + * idx-vector.cc (idx_vector::complement): Rewrite. + 2010-04-06 Jaroslav Hajek * Sparse.cc (Sparse::maybe_delete_elements): Rename to diff -r fdccd69d26bd -r 077fef5da460 liboctave/idx-vector.cc --- a/liboctave/idx-vector.cc Tue Apr 06 13:42:59 2010 +0200 +++ b/liboctave/idx-vector.cc Tue Apr 06 15:38:56 2010 +0200 @@ -1096,29 +1096,32 @@ idx_vector idx_vector::complement (octave_idx_type n) const { - OCTAVE_LOCAL_BUFFER_INIT (bool, left, n, true); - - octave_idx_type cnt = n; + idx_vector retval; + if (extent (n) > n) + (*current_liboctave_error_handler) + ("internal error: out of range complement index requested"); - for (octave_idx_type i = 0, len = length (); i < len; i++) - { - octave_idx_type k = xelem (i); - if (k < n && left[k]) - { - left[k] = false; - cnt--; - } + if (idx_class () == class_mask) + { + idx_mask_rep * r = dynamic_cast (rep); + octave_idx_type nz = r->length (0), ext = r->extent (0); + Array mask (n, 1); + const bool *data = r->get_data (); + bool *ndata = mask.fortran_vec (); + for (octave_idx_type i = 0; i < ext; i++) + ndata[i] = ! data[i]; + for (octave_idx_type i = ext; i < n; i++) + ndata[i] = true; + retval = new idx_mask_rep (mask, n - nz); + } + else + { + Array mask (n, 1, true); + fill (false, length (n), mask.fortran_vec ()); + retval = idx_vector (mask); } - octave_idx_type len = cnt, *data = new octave_idx_type[len]; - - for (octave_idx_type i = 0, j = 0; i < n; i++) - if (left[i]) - data[j++] = i; - - return new idx_vector_rep (data, len, - len ? data[len-1]+1 : 0, - dim_vector (1, len), DIRECT); + return retval; } bool