# HG changeset patch # User jwe # Date 753162295 0 # Node ID 6188aa8d1fecadf26a36311447bafb752a17a149 # Parent 4adbab9c31cd1d49d00b0a2758b8134bffa73b9e [project @ 1993-11-13 03:44:55 by jwe] diff -r 4adbab9c31cd -r 6188aa8d1fec src/pt-const.h --- a/src/pt-const.h Fri Nov 12 14:12:22 1993 +0000 +++ b/src/pt-const.h Sat Nov 13 03:44:55 1993 +0000 @@ -355,14 +355,14 @@ void do_vector_assign (tree_constant& rhs, int i); void do_vector_assign (tree_constant& rhs, idx_vector& i); - void do_vector_assign (tree_constant& rhs, Range& i, int imax); + void do_vector_assign (tree_constant& rhs, Range& i); void do_matrix_assignment (tree_constant& rhs, int i, tree_constant& j_arg); void do_matrix_assignment (tree_constant& rhs, idx_vector& i, tree_constant& j_arg); void do_matrix_assignment - (tree_constant& rhs, Range& i, int imax, tree_constant& j_arg); + (tree_constant& rhs, Range& i, tree_constant& j_arg); void do_matrix_assignment (tree_constant& rhs, constant_type i, tree_constant& j_arg); @@ -425,7 +425,7 @@ tree_constant do_matrix_index (int i, const tree_constant& i_arg) const; tree_constant do_matrix_index (const idx_vector& i, const tree_constant& i_arg) const; - tree_constant do_matrix_index (const Range& i, int imax, + tree_constant do_matrix_index (const Range& i, const tree_constant& i_arg) const; tree_constant do_matrix_index (constant_type i, const tree_constant& i_arg) const; @@ -714,7 +714,12 @@ } int is_zero_by_zero (void) const - { return (rows () == 0 && columns () == 0); } + { + return (rep->type_tag != tree_constant_rep::magic_colon + && rep->type_tag != tree_constant_rep::unknown_constant + && rows () == 0 + && columns () == 0); + } tree_constant all (void) const { return rep->all (); } diff -r 4adbab9c31cd -r 6188aa8d1fec src/tc-assign.cc --- a/src/tc-assign.cc Fri Nov 12 14:12:22 1993 +0000 +++ b/src/tc-assign.cc Sat Nov 13 03:44:55 1993 +0000 @@ -282,15 +282,13 @@ if (! ii) return; - int imax = ii.max (); - if (nr <= 1 || nc <= 1) { - maybe_resize (imax-1); + maybe_resize (ii.max () - 1); if (error_state) return; } - else if (range_max_check (imax-1, len) < 0) + else if (range_max_check (ii.max () - 1, len) < 0) return; if (ii.capacity () != rhs_nr * rhs_nc) @@ -359,16 +357,20 @@ case range_constant: { Range ri = tmp_i.range_value (); - if (rows () == 2 && is_zero_one (ri)) + int len = nr * nc; + if (len == 2 && is_zero_one (ri)) { do_vector_assign (rhs, 1); } + else if (len == 2 && is_one_zero (ri)) + { + do_vector_assign (rhs, 0); + } else { - int imax; - if (index_check (ri, imax, "") < 0) + if (index_check (ri, "") < 0) return; - do_vector_assign (rhs, ri, imax); + do_vector_assign (rhs, ri); } } break; @@ -544,7 +546,7 @@ } void -tree_constant_rep::do_vector_assign (tree_constant& rhs, Range& ri, int imax) +tree_constant_rep::do_vector_assign (tree_constant& rhs, Range& ri) { if (rhs.is_zero_by_zero ()) { @@ -583,7 +585,7 @@ else if (rhs_nc == 1 && rhs_nr != 1) f_orient = column_orient; - maybe_resize (imax, f_orient); + maybe_resize (tree_to_mat_idx (ri.max ()), f_orient); if (error_state) return; @@ -743,16 +745,20 @@ case range_constant: { Range ri = tmp_i.range_value (); - if (rows () == 2 && is_zero_one (ri)) + int nr = rows (); + if (nr == 2 && is_zero_one (ri)) { do_matrix_assignment (rhs, 1, j_arg); } + else if (nr == 2 && is_one_zero (ri)) + { + do_matrix_assignment (rhs, 0, j_arg); + } else { - int imax; - if (index_check (ri, imax, "row") < 0) + if (index_check (ri, "row") < 0) return; - do_matrix_assignment (rhs, ri, imax, j_arg); + do_matrix_assignment (rhs, ri, j_arg); } } break; @@ -831,16 +837,20 @@ return; } - if (columns () == 2 && is_zero_one (rj) && rhs_nc == 1) + int nc = columns (); + if (nc == 2 && is_zero_one (rj) && rhs_nc == 1) { do_matrix_assignment (rhs, i, 1); } + else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1) + { + do_matrix_assignment (rhs, i, 0); + } else { - int jmax; - if (index_check (rj, jmax, "column") < 0) + if (index_check (rj, "column") < 0) return; - maybe_resize (i, jmax); + maybe_resize (i, tree_to_mat_idx (rj.max ())); if (error_state) return; @@ -969,16 +979,20 @@ return; } - if (columns () == 2 && is_zero_one (rj) && rhs_nc == 1) + int nc = columns (); + if (nc == 2 && is_zero_one (rj) && rhs_nc == 1) { do_matrix_assignment (rhs, iv, 1); } + else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1) + { + do_matrix_assignment (rhs, iv, 0); + } else { - int jmax; - if (index_check (rj, jmax, "column") < 0) + if (index_check (rj, "column") < 0) return; - maybe_resize (iv.max (), jmax); + maybe_resize (iv.max (), tree_to_mat_idx (rj.max ())); if (error_state) return; @@ -1027,8 +1041,7 @@ void tree_constant_rep::do_matrix_assignment (tree_constant& rhs, - Range& ri, int imax, - tree_constant& j_arg) + Range& ri, tree_constant& j_arg) { tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic (); @@ -1051,7 +1064,7 @@ the same number of elements as range"); return; } - maybe_resize (imax, j); + maybe_resize (tree_to_mat_idx (ri.max ()), j); if (error_state) return; @@ -1075,7 +1088,7 @@ must match the number of elements in matrix"); return; } - maybe_resize (imax, jv.max ()); + maybe_resize (tree_to_mat_idx (ri.max ()), jv.max ()); if (error_state) return; @@ -1097,16 +1110,23 @@ return; } - if (columns () == 2 && is_zero_one (rj) && rhs_nc == 1) + int nc = columns (); + if (nc == 2 && is_zero_one (rj) && rhs_nc == 1) { do_matrix_assignment (rhs, ri, 1); } + else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1) + { + do_matrix_assignment (rhs, ri, 0); + } else { - int jmax; - if (index_check (rj, jmax, "column") < 0) + if (index_check (rj, "column") < 0) return; - maybe_resize (imax, jmax); + + maybe_resize (tree_to_mat_idx (ri.max ()), + tree_to_mat_idx (rj.max ())); + if (error_state) return; @@ -1123,7 +1143,7 @@ if (indexed_assign_conforms (ri.nelem (), new_nc, rhs_nr, rhs_nc)) { - maybe_resize (imax, new_nc-1); + maybe_resize (tree_to_mat_idx (ri.max ()), new_nc-1); if (error_state) return; } @@ -1269,16 +1289,20 @@ if (indexed_assign_conforms (new_nr, rj.nelem (), rhs_nr, rhs_nc)) { - if (columns () == 2 && is_zero_one (rj) && rhs_nc == 1) + int nc = columns (); + if (nc == 2 && is_zero_one (rj) && rhs_nc == 1) { do_matrix_assignment (rhs, magic_colon, 1); } + else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1) + { + do_matrix_assignment (rhs, magic_colon, 0); + } else { - int jmax; - if (index_check (rj, jmax, "column") < 0) + if (index_check (rj, "column") < 0) return; - maybe_resize (new_nr-1, jmax); + maybe_resize (new_nr-1, tree_to_mat_idx (rj.max ())); if (error_state) return; } diff -r 4adbab9c31cd -r 6188aa8d1fec src/tc-index.cc --- a/src/tc-index.cc Fri Nov 12 14:12:22 1993 +0000 +++ b/src/tc-index.cc Sat Nov 13 03:44:55 1993 +0000 @@ -401,16 +401,15 @@ if (! iv) return tree_constant (); - int imax = iv.max (); if (swap_indices) { - if (range_max_check (imax, nc) < 0) + if (range_max_check (iv.max (), nc) < 0) return tree_constant (); retval = do_matrix_index (0, iv); } else { - if (range_max_check (imax, nr) < 0) + if (range_max_check (iv.max (), nr) < 0) return tree_constant (); retval = do_matrix_index (iv, 0); } @@ -430,20 +429,23 @@ else retval = do_matrix_index (1, 0); } + else if (len == 2 && is_one_zero (ri)) + { + retval = do_matrix_index (0, 0); + } else { - int imax; - if (index_check (ri, imax, "") < 0) + if (index_check (ri, "") < 0) return tree_constant (); if (swap_indices) { - if (range_max_check (imax, nc) < 0) + if (range_max_check (tree_to_mat_idx (ri.max ()), nc) < 0) return tree_constant (); retval = do_matrix_index (0, ri); } else { - if (range_max_check (imax, nr) < 0) + if (range_max_check (tree_to_mat_idx (ri.max ()), nr) < 0) return tree_constant (); retval = do_matrix_index (ri, 0); } @@ -508,16 +510,20 @@ case range_constant: { Range ri = tmp_i.range_value (); - if (rows () == 2 && is_zero_one (ri)) + int nr = rows (); + if (nr == 2 && is_zero_one (ri)) { retval = do_matrix_index (1, j_arg); } + else if (nr == 2 && is_one_zero (ri)) + { + retval = do_matrix_index (0, j_arg); + } else { - int imax; - if (index_check (ri, imax, "row") < 0) + if (index_check (ri, "row") < 0) return tree_constant (); - retval = do_matrix_index (ri, imax, j_arg); + retval = do_matrix_index (ri, j_arg); } } break; @@ -588,12 +594,15 @@ { retval = do_matrix_index (i, 1); } + else if (nc == 2 && is_one_zero (rj)) + { + retval = do_matrix_index (i, 0); + } else { - int jmax; - if (index_check (rj, jmax, "column") < 0) + if (index_check (rj, "column") < 0) return tree_constant (); - if (range_max_check (i, jmax, nr, nc) < 0) + if (range_max_check (i, tree_to_mat_idx (rj.max ()), nr, nc) < 0) return tree_constant (); retval = do_matrix_index (i, rj); } @@ -669,12 +678,16 @@ { retval = do_matrix_index (iv, 1); } + else if (nc == 2 && is_one_zero (rj)) + { + retval = do_matrix_index (iv, 0); + } else { - int jmax; - if (index_check (rj, jmax, "column") < 0) + if (index_check (rj, "column") < 0) return tree_constant (); - if (range_max_check (iv.max (), jmax, nr, nc) < 0) + if (range_max_check (iv.max (), tree_to_mat_idx (rj.max ()), + nr, nc) < 0) return tree_constant (); retval = do_matrix_index (iv, rj); } @@ -694,7 +707,7 @@ } tree_constant -tree_constant_rep::do_matrix_index (const Range& ri, int imax, +tree_constant_rep::do_matrix_index (const Range& ri, const tree_constant& j_arg) const { tree_constant retval; @@ -714,7 +727,7 @@ int j = tree_to_mat_idx (tmp_j.double_value ()); if (index_check (j, "column") < 0) return tree_constant (); - if (range_max_check (imax, j, nr, nc) < 0) + if (range_max_check (tree_to_mat_idx (ri.max ()), j, nr, nc) < 0) return tree_constant (); retval = do_matrix_index (ri, j); } @@ -734,7 +747,8 @@ } else { - if (range_max_check (imax, jv.max (), nr, nc) < 0) + if (range_max_check (tree_to_mat_idx (ri.max ()), + jv.max (), nr, nc) < 0) return tree_constant (); retval = do_matrix_index (ri, jv); } @@ -750,12 +764,16 @@ { retval = do_matrix_index (ri, 1); } + else if (nc == 2 && is_one_zero (rj)) + { + retval = do_matrix_index (ri, 0); + } else { - int jmax; - if (index_check (rj, jmax, "column") < 0) + if (index_check (rj, "column") < 0) return tree_constant (); - if (range_max_check (imax, jmax, nr, nc) < 0) + if (range_max_check (tree_to_mat_idx (ri.max ()), + tree_to_mat_idx (rj.max ()), nr, nc) < 0) return tree_constant (); retval = do_matrix_index (ri, rj); } @@ -829,12 +847,15 @@ { retval = do_matrix_index (magic_colon, 1); } + else if (nc == 2 && is_one_zero (rj)) + { + retval = do_matrix_index (magic_colon, 0); + } else { - int jmax; - if (index_check (rj, jmax, "column") < 0) + if (index_check (rj, "column") < 0) return tree_constant (); - if (range_max_check (0, jmax, nr, nc) < 0) + if (range_max_check (0, tree_to_mat_idx (rj.max ()), nr, nc) < 0) return tree_constant (); retval = do_matrix_index (magic_colon, rj); } diff -r 4adbab9c31cd -r 6188aa8d1fec src/tc-inlines.h --- a/src/tc-inlines.h Fri Nov 12 14:12:22 1993 +0000 +++ b/src/tc-inlines.h Sat Nov 13 03:44:55 1993 +0000 @@ -73,11 +73,19 @@ } static inline int +is_one_zero (const Range& r) +{ + double b = r.base (); + double l = r.limit (); + return (r.nelem () == 2 && NINT (b) == 1 && NINT (l) == 0); +} + +static inline int is_zero_one (const Range& r) { double b = r.base (); double l = r.limit (); - return (NINT (b) == 0 && NINT (l) == 1 && r.nelem () == 2); + return (r.nelem () == 2 && NINT (b) == 0 && NINT (l) == 1); } static inline int @@ -92,7 +100,7 @@ } static inline int -index_check (const Range& r, int& max_val, char *rc) +index_check (const Range& r, char *rc) { if (r.nelem () < 1) { @@ -100,29 +108,18 @@ return -1; } - double b = r.base (); - int ib = tree_to_mat_idx (b); + int imin = tree_to_mat_idx (r.min ()); - if (ib < 0) + if (imin < 0) { - error ("invalid %s index = %d", rc, ib+1); + error ("invalid %s index = %d", rc, imin+1); return -1; } - double lim = r.limit (); - max_val = tree_to_mat_idx (lim); - return 0; } static inline int -index_check (const Range& r, char *rc) -{ - int max_val; - return index_check (r, max_val, rc); -} - -static inline int fortran_row (int i, int nr) { int r;