changeset 212:6188aa8d1fec

[project @ 1993-11-13 03:44:55 by jwe]
author jwe
date Sat, 13 Nov 1993 03:44:55 +0000
parents 4adbab9c31cd
children 83f77b41ff2f
files src/pt-const.h src/tc-assign.cc src/tc-index.cc src/tc-inlines.h
diffstat 4 files changed, 128 insertions(+), 81 deletions(-) [+]
line wrap: on
line diff
--- 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 (); }
--- 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;
 	      }
--- 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);
 	  }
--- 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;