annotate src/pt-const.cc @ 1321:64819a909ed7

[project @ 1995-08-22 05:39:43 by jwe]
author jwe
date Tue, 22 Aug 1995 05:41:48 +0000
parents c9aecc02c6d4
children c04c2a6849e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 513
diff changeset
1 // tree-const.cc -*- C++ -*-
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
2 /*
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
3
1009
dfe01093f657 [project @ 1995-01-04 04:05:12 by jwe]
jwe
parents: 877
diff changeset
4 Copyright (C) 1992, 1993, 1994, 1995 John W. Eaton
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
5
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
7
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
11 later version.
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
12
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
16 for more details.
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
17
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
1315
611d403c7f3d [project @ 1995-06-25 19:56:32 by jwe]
jwe
parents: 1299
diff changeset
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
21
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
22 */
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
23
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
24 #if defined (__GNUG__)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
25 #pragma implementation
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
26 #endif
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
27
240
a99f28f5e351 [project @ 1993-11-30 20:24:36 by jwe]
jwe
parents: 217
diff changeset
28 #ifdef HAVE_CONFIG_H
1192
b6360f2d4fa6 [project @ 1995-03-30 21:38:35 by jwe]
jwe
parents: 1170
diff changeset
29 #include <config.h>
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
30 #endif
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
31
1277
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
32 #include <string.h>
581
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 531
diff changeset
33 #include <iostream.h>
1199
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
34 #include <strstream.h>
581
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 531
diff changeset
35
493
1391e7ed65f6 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents: 482
diff changeset
36 #include "tree-const.h"
1199
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
37 #include "user-prefs.h"
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
38 #include "pager.h"
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
39 #include "error.h"
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
40 #include "gripes.h"
747
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
41 #include "oct-map.h"
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
42
1168
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
43 // The following three variables could be made static members of the
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
44 // tree_constant class.
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
45
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
46 // Pointer to the blocks of memory we manage.
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
47 static tree_constant *tc_newlist = 0;
1168
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
48
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
49 // Multiplier for allocating new blocks.
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
50 static const int tc_newlist_grow_size = 128;
1168
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
51
747
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
52 Octave_map
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
53 tree_constant::map_value (void) const
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
54 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
55 return rep->map_value ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
56 }
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
57
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
58 tree_constant::~tree_constant (void)
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
59 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
60 #if defined (MDEBUG)
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
61 cerr << "~tree_constant: rep: " << rep
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
62 << " rep->count: " << rep->count << "\n";
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
63 #endif
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
64
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
65 if (--rep->count <= 0)
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
66 {
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
67 delete rep;
531
1be78be437c7 [project @ 1994-07-20 19:44:13 by jwe]
jwe
parents: 529
diff changeset
68 rep = 0;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
69 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
70 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
71
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
72 void *
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
73 tree_constant::operator new (size_t size)
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
74 {
1168
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
75 assert (size == sizeof (tree_constant));
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
76
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
77 if (! tc_newlist)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
78 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
79 int block_size = tc_newlist_grow_size * sizeof (tree_constant);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
80 tc_newlist = (tree_constant *) new char [block_size];
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
81
1321
64819a909ed7 [project @ 1995-08-22 05:39:43 by jwe]
jwe
parents: 1320
diff changeset
82 int i = 0;
64819a909ed7 [project @ 1995-08-22 05:39:43 by jwe]
jwe
parents: 1320
diff changeset
83
64819a909ed7 [project @ 1995-08-22 05:39:43 by jwe]
jwe
parents: 1320
diff changeset
84 for (i = 0; i < tc_newlist_grow_size - 1; i++)
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
85 tc_newlist[i].freeptr = &tc_newlist[i+1];
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
86
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
87 tc_newlist[i].freeptr = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
88 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
89
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
90 tree_constant *tmp = tc_newlist;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
91 tc_newlist = tc_newlist->freeptr;
1168
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
92 return tmp;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
93 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
94
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
95 void
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
96 tree_constant::operator delete (void *p, size_t size)
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
97 {
1168
e2036dce97ea [project @ 1995-03-10 18:49:55 by jwe]
jwe
parents: 1009
diff changeset
98 tree_constant *tmp = (tree_constant *) p;
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
99 tmp->freeptr = tc_newlist;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
100 tc_newlist = tmp;
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
101 }
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
102
747
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
103 // Simple assignment.
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
104
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
105 tree_constant
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
106 tree_constant::operator = (const tree_constant& a)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
107 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
108 if (rep != a.rep)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
109 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
110 if (--rep->count <= 0)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
111 delete rep;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
112 rep = a.rep;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
113 rep->count++;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
114 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
115 return *this;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
116 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
117
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
118 tree_constant
1277
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
119 tree_constant::lookup_map_element (const char *ref, int insert,
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
120 int silent)
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
121 {
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
122 tree_constant retval;
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
123
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
124 if (ref)
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
125 {
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
126 char *tmp = strsave (ref);
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
127
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
128 SLList<char *> list;
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
129
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
130 char *beg = tmp;
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
131 char *end = 0;
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
132 do
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
133 {
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
134 end = strchr (beg, '.');
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
135 if (end)
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
136 *end = '\0';
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
137
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
138 list.append (strsave (beg));
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
139 }
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
140 while (end && (beg = end + 1));
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
141
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
142 retval = lookup_map_element (list, insert, silent);
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
143
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
144 delete [] tmp;
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
145 }
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
146
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
147 return retval;
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
148 }
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
149
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
150 tree_constant
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
151 tree_constant::lookup_map_element (SLList<char*>& list, int insert,
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
152 int silent)
747
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
153 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
154 tree_constant retval;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
155
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
156 tree_constant_rep *tmp_rep = rep;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
157
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
158 Pix p = list.first ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
159 while (p)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
160 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
161 char *elt = list (p);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
162
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
163 list.next (p);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
164
1277
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
165 tree_constant tmp;
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
166
db4f4009d6e8 [project @ 1995-04-24 20:35:06 by jwe]
jwe
parents: 1199
diff changeset
167 tmp = tmp_rep->lookup_map_element (elt, insert, silent);
747
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
168
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
169 if (error_state)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
170 break;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
171
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
172 tmp_rep = tmp.rep;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
173
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
174 if (! p)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
175 retval = tmp;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
176 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
177
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
178 return retval;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
179 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
180
1199
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
181 void
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
182 tree_constant::print (void)
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
183 {
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
184 ostrstream output_buf;
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
185 print (output_buf);
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
186 output_buf << ends;
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
187 maybe_page_output (output_buf);
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
188 }
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
189
747
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
190 // Simple structure assignment.
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
191
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
192 void
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
193 tree_constant::make_unique (void)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
194 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
195 if (rep->count > 1)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
196 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
197 --rep->count;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
198 rep = new tree_constant_rep (*rep);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
199 rep->count = 1;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
200 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
201
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
202 if (rep->is_map ())
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
203 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
204 for (Pix p = rep->a_map->first (); p != 0; rep->a_map->next (p))
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
205 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
206 rep->a_map->contents (p) . make_unique ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
207 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
208 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
209 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
210
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
211 tree_constant::tree_constant_rep *
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
212 tree_constant::make_unique_map (void)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
213 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
214 if (! rep->is_map ())
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
215 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
216 if (--rep->count <= 0)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
217 delete rep;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
218
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
219 Octave_map m;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
220 rep = new tree_constant_rep (m);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
221 rep->count = 1;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
222 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
223
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
224 make_unique ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
225
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
226 return rep;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
227 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
228
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
229 tree_constant
780
81a661c0368b [project @ 1994-10-07 17:26:04 by jwe]
jwe
parents: 777
diff changeset
230 tree_constant::assign_map_element (SLList<char*>& list,
782
ffe18d3d64a6 [project @ 1994-10-07 19:01:20 by jwe]
jwe
parents: 780
diff changeset
231 tree_constant& rhs)
747
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
232 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
233 tree_constant_rep *tmp_rep = make_unique_map ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
234
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
235 if (rhs.is_map ())
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
236 rhs.make_unique ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
237
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
238 Pix p = list.first ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
239 while (p)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
240 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
241 char *elt = list (p);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
242
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
243 list.next (p);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
244
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
245 tree_constant& tmp = tmp_rep->lookup_map_element (elt, 1);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
246
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
247 if (! p)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
248 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
249 tmp = rhs;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
250 return tmp;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
251 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
252
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
253 tmp_rep = tmp.make_unique_map ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
254 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
255
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
256 return tree_constant ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
257 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
258
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
259 // Indexed structure assignment.
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
260
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
261 tree_constant
780
81a661c0368b [project @ 1994-10-07 17:26:04 by jwe]
jwe
parents: 777
diff changeset
262 tree_constant::assign_map_element (SLList<char*>& list,
782
ffe18d3d64a6 [project @ 1994-10-07 19:01:20 by jwe]
jwe
parents: 780
diff changeset
263 tree_constant& rhs,
747
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
264 const Octave_object& args)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
265 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
266 tree_constant_rep *tmp_rep = make_unique_map ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
267
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
268 if (rhs.is_map ())
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
269 rhs.make_unique ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
270
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
271 Pix p = list.first ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
272 while (p)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
273 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
274 char *elt = list (p);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
275
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
276 list.next (p);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
277
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
278 tree_constant& tmp = tmp_rep->lookup_map_element (elt, 1);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
279
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
280 if (! p)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
281 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
282 tmp.assign (rhs, args);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
283 return tmp;
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
284 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
285
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
286 tmp_rep = tmp.make_unique_map ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
287 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
288
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
289 return tree_constant ();
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
290 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
291
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
292 void
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
293 tree_constant::print_code (ostream& os)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
294 {
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
295 print_code_indent (os);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
296
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
297 if (in_parens)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
298 os << "(";
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
299
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
300 if (rep)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
301 rep->print_code (os);
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
302
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
303 if (in_parens)
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
304 os << ")";
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
305 }
6182de8cb3b7 [project @ 1994-09-30 15:09:36 by jwe]
jwe
parents: 629
diff changeset
306
1199
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
307 int
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
308 print_as_scalar (const tree_constant& val)
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
309 {
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
310 int nr = val.rows ();
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
311 int nc = val.columns ();
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
312 return (val.is_scalar_type ()
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
313 || val.is_string ()
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
314 || (val.is_matrix_type ()
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
315 && ((nr == 1 && nc == 1)
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
316 || nr == 0
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
317 || nc == 0)));
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
318 }
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
319
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
320 int
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
321 print_as_structure (const tree_constant& val)
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
322 {
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
323 return val.is_map ();
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
324 }
4f1bfa351b99 [project @ 1995-03-31 22:16:54 by jwe]
jwe
parents: 1192
diff changeset
325
581
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 531
diff changeset
326 // Construct return vector of empty matrices. Return empty matrices
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 531
diff changeset
327 // and/or gripe when appropriate.
bc813f5eb025 [project @ 1994-08-07 01:02:15 by jwe]
jwe
parents: 531
diff changeset
328
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 493
diff changeset
329 Octave_object
164
e2c950dd96d2 [project @ 1993-10-18 19:32:00 by jwe]
jwe
parents: 161
diff changeset
330 vector_of_empties (int nargout, const char *fcn_name)
96
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
331 {
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 493
diff changeset
332 Octave_object retval;
96
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
333
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
334 // Got an empty argument, check if should gripe/return empty values.
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
335
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
336 int flag = user_pref.propagate_empty_matrices;
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
337 if (flag != 0)
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
338 {
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
339 if (flag < 0)
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
340 gripe_empty_arg (fcn_name, 0);
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
341
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
342 Matrix m;
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 493
diff changeset
343 retval.resize (nargout ? nargout : 1);
96
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
344 for (int i = 0; i < nargout; i++)
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 513
diff changeset
345 retval(i) = m;
96
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
346 }
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
347 else
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
348 gripe_empty_arg (fcn_name, 1);
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
349
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
350 return retval;
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
351 }
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
352
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
353 // -------------------------------------------------------------------
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
354 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
355 // Basic stuff for the tree-constant representation class.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
356 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
357 // Leave the commented #includes below to make it easy to split this
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
358 // out again, should we want to do that.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
359 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
360 // -------------------------------------------------------------------
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
361
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
362 // #ifdef HAVE_CONFIG_H
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
363 // #include <config.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
364 // #endif
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
365
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
366 #include <ctype.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
367 // #include <string.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
368 #include <fstream.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
369 // #include <iostream.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
370
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
371 #include "mx-base.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
372 #include "Range.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
373
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
374 #include "arith-ops.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
375 #include "variables.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
376 #include "sysdep.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
377 // #include "error.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
378 // #include "gripes.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
379 // #include "user-prefs.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
380 #include "utils.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
381 #include "pr-output.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
382 // #include "tree-const.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
383 #include "idx-vector.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
384 #include "unwind-prot.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
385 // #include "oct-map.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
386
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
387 #include "tc-inlines.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
388
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
389 // The following three variables could be made static members of the
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
390 // TC_REP class.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
391
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
392 // Pointer to the blocks of memory we manage.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
393 static TC_REP *tc_rep_newlist = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
394
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
395 // Multiplier for allocating new blocks.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
396 static const int tc_rep_newlist_grow_size = 128;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
397
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
398 // Indentation level for structures.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
399 static int structure_indent_level = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
400
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
401 static void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
402 increment_structure_indent_level (void)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
403 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
404 structure_indent_level += 2;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
405 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
406
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
407 static void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
408 decrement_structure_indent_level (void)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
409 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
410 structure_indent_level -= 2;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
411 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
412
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
413 static int
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
414 any_element_is_complex (const ComplexMatrix& a)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
415 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
416 int nr = a.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
417 int nc = a.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
418 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
419 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
420 if (imag (a.elem (i, j)) != 0.0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
421 return 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
422 return 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
423 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
424
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
425 // The real representation of constants.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
426
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
427 TC_REP::tree_constant_rep (void)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
428 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
429 type_tag = unknown_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
430 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
431 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
432
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
433 TC_REP::tree_constant_rep (double d)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
434 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
435 scalar = d;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
436 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
437 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
438 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
439
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
440 TC_REP::tree_constant_rep (const Matrix& m)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
441 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
442 if (m.rows () == 1 && m.columns () == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
443 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
444 scalar = m.elem (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
445 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
446 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
447 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
448 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
449 matrix = new Matrix (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
450 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
451 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
452 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
453 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
454
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
455 TC_REP::tree_constant_rep (const DiagMatrix& d)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
456 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
457 if (d.rows () == 1 && d.columns () == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
458 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
459 scalar = d.elem (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
460 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
461 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
462 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
463 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
464 matrix = new Matrix (d);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
465 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
466 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
467 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
468 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
469
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
470 TC_REP::tree_constant_rep (const RowVector& v, int prefer_column_vector)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
471 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
472 int len = v.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
473 if (len == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
474 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
475 scalar = v.elem (0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
476 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
477 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
478 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
479 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
480 int pcv = (prefer_column_vector < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
481 ? user_pref.prefer_column_vectors
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
482 : prefer_column_vector;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
483
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
484 if (pcv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
485 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
486 Matrix m (len, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
487 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
488 m.elem (i, 0) = v.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
489 matrix = new Matrix (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
490 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
491 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
492 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
493 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
494 Matrix m (1, len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
495 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
496 m.elem (0, i) = v.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
497 matrix = new Matrix (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
498 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
499 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
500 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
501 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
502 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
503
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
504 TC_REP::tree_constant_rep (const ColumnVector& v, int prefer_column_vector)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
505 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
506 int len = v.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
507 if (len == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
508 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
509 scalar = v.elem (0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
510 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
511 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
512 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
513 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
514 int pcv = (prefer_column_vector < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
515 ? user_pref.prefer_column_vectors
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
516 : prefer_column_vector;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
517
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
518 if (pcv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
519 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
520 Matrix m (len, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
521 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
522 m.elem (i, 0) = v.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
523 matrix = new Matrix (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
524 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
525 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
526 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
527 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
528 Matrix m (1, len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
529 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
530 m.elem (0, i) = v.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
531 matrix = new Matrix (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
532 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
533 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
534 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
535 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
536 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
537
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
538 TC_REP::tree_constant_rep (const Complex& c)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
539 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
540 complex_scalar = new Complex (c);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
541 type_tag = complex_scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
542 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
543 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
544
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
545 TC_REP::tree_constant_rep (const ComplexMatrix& m)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
546 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
547 if (m.rows () == 1 && m.columns () == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
548 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
549 complex_scalar = new Complex (m.elem (0, 0));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
550 type_tag = complex_scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
551 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
552 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
553 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
554 complex_matrix = new ComplexMatrix (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
555 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
556 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
557 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
558 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
559
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
560 TC_REP::tree_constant_rep (const ComplexDiagMatrix& d)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
561 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
562 if (d.rows () == 1 && d.columns () == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
563 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
564 complex_scalar = new Complex (d.elem (0, 0));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
565 type_tag = complex_scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
566 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
567 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
568 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
569 complex_matrix = new ComplexMatrix (d);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
570 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
571 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
572 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
573 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
574
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
575 TC_REP::tree_constant_rep (const ComplexRowVector& v,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
576 int prefer_column_vector)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
577 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
578 int len = v.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
579 if (len == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
580 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
581 complex_scalar = new Complex (v.elem (0));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
582 type_tag = complex_scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
583 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
584 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
585 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
586 int pcv = (prefer_column_vector < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
587 ? user_pref.prefer_column_vectors
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
588 : prefer_column_vector;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
589
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
590 if (pcv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
591 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
592 ComplexMatrix m (len, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
593 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
594 m.elem (i, 0) = v.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
595 complex_matrix = new ComplexMatrix (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
596 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
597 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
598 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
599 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
600 ComplexMatrix m (1, len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
601 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
602 m.elem (0, i) = v.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
603 complex_matrix = new ComplexMatrix (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
604 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
605 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
606 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
607 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
608 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
609
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
610 TC_REP::tree_constant_rep (const ComplexColumnVector& v, int
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
611 prefer_column_vector)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
612 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
613 int len = v.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
614 if (len == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
615 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
616 complex_scalar = new Complex (v.elem (0));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
617 type_tag = complex_scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
618 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
619 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
620 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
621 int pcv = (prefer_column_vector < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
622 ? user_pref.prefer_column_vectors
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
623 : prefer_column_vector;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
624
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
625 if (pcv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
626 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
627 ComplexMatrix m (len, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
628 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
629 m.elem (i, 0) = v.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
630 complex_matrix = new ComplexMatrix (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
631 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
632 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
633 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
634 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
635 ComplexMatrix m (1, len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
636 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
637 m.elem (0, i) = v.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
638 complex_matrix = new ComplexMatrix (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
639 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
640 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
641 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
642 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
643 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
644
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
645 TC_REP::tree_constant_rep (const char *s)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
646 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
647 string = strsave (s);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
648 type_tag = string_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
649 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
650 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
651
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
652 TC_REP::tree_constant_rep (double b, double l, double i)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
653 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
654 range = new Range (b, l, i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
655 int nel = range->nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
656 if (nel > 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
657 type_tag = range_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
658 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
659 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
660 delete range;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
661 if (nel == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
662 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
663 scalar = b;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
664 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
665 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
666 else if (nel == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
667 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
668 matrix = new Matrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
669 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
670 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
671 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
672 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
673 type_tag = unknown_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
674 if (nel == -1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
675 ::error ("number of elements in range exceeds INT_MAX");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
676 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
677 ::error ("invalid range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
678 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
679 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
680 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
681 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
682
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
683 TC_REP::tree_constant_rep (const Range& r)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
684 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
685 int nel = r.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
686 if (nel > 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
687 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
688 range = new Range (r);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
689 type_tag = range_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
690 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
691 else if (nel == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
692 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
693 scalar = r.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
694 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
695 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
696 else if (nel == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
697 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
698 matrix = new Matrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
699 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
700 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
701 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
702 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
703 type_tag = unknown_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
704 if (nel == -1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
705 ::error ("number of elements in range exceeds INT_MAX");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
706 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
707 ::error ("invalid range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
708 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
709
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
710 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
711 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
712
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
713 TC_REP::tree_constant_rep (const Octave_map& m)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
714 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
715 a_map = new Octave_map (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
716 type_tag = map_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
717 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
718 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
719
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
720 TC_REP::tree_constant_rep (TC_REP::constant_type t)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
721 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
722 assert (t == magic_colon || t == all_va_args);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
723 type_tag = t;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
724 orig_text = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
725 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
726
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
727 TC_REP::tree_constant_rep (const tree_constant_rep& t)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
728 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
729 type_tag = t.type_tag;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
730
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
731 switch (t.type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
732 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
733 case unknown_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
734 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
735
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
736 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
737 scalar = t.scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
738 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
739
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
740 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
741 matrix = new Matrix (*(t.matrix));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
742 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
743
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
744 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
745 string = strsave (t.string);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
746 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
747
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
748 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
749 complex_matrix = new ComplexMatrix (*(t.complex_matrix));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
750 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
751
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
752 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
753 complex_scalar = new Complex (*(t.complex_scalar));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
754 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
755
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
756 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
757 range = new Range (*(t.range));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
758 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
759
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
760 case map_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
761 a_map = new Octave_map (*(t.a_map));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
762 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
763
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
764 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
765 case all_va_args:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
766 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
767 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
768
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
769 orig_text = strsave (t.orig_text);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
770 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
771
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
772 TC_REP::~tree_constant_rep (void)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
773 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
774 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
775 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
776 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
777 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
778 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
779
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
780 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
781 delete complex_scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
782 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
783
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
784 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
785 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
786 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
787
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
788 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
789 delete [] string;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
790 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
791
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
792 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
793 delete range;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
794 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
795
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
796 case map_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
797 delete a_map;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
798 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
799
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
800 case unknown_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
801 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
802 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
803 case all_va_args:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
804 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
805 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
806
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
807 delete [] orig_text;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
808 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
809
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
810 void *
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
811 TC_REP::operator new (size_t size)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
812 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
813 assert (size == sizeof (TC_REP));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
814
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
815 if (! tc_rep_newlist)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
816 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
817 int block_size = tc_rep_newlist_grow_size * sizeof (TC_REP);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
818 tc_rep_newlist = (TC_REP *) new char [block_size];
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
819
1321
64819a909ed7 [project @ 1995-08-22 05:39:43 by jwe]
jwe
parents: 1320
diff changeset
820 int i = 0;
64819a909ed7 [project @ 1995-08-22 05:39:43 by jwe]
jwe
parents: 1320
diff changeset
821
64819a909ed7 [project @ 1995-08-22 05:39:43 by jwe]
jwe
parents: 1320
diff changeset
822 for (i = 0; i < tc_rep_newlist_grow_size - 1; i++)
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
823 tc_rep_newlist[i].freeptr = &tc_rep_newlist[i+1];
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
824
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
825 tc_rep_newlist[i].freeptr = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
826 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
827
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
828 TC_REP *tmp = tc_rep_newlist;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
829 tc_rep_newlist = tc_rep_newlist->freeptr;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
830 return tmp;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
831 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
832
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
833 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
834 TC_REP::operator delete (void *p, size_t size)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
835 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
836 TC_REP *tmp = (TC_REP *) p;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
837 tmp->freeptr = tc_rep_newlist;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
838 tc_rep_newlist = tmp;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
839 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
840
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
841 int
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
842 TC_REP::rows (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
843 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
844 int retval = -1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
845
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
846 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
847 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
848 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
849 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
850 retval = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
851 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
852
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
853 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
854 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
855 retval = (columns () > 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
856 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
857
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
858 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
859 retval = matrix->rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
860 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
861
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
862 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
863 retval = complex_matrix->rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
864 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
865
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
866 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
867 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
868 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
869
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
870 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
871 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
872
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
873 int
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
874 TC_REP::columns (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
875 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
876 int retval = -1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
877
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
878 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
879 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
880 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
881 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
882 retval = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
883 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
884
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
885 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
886 retval = matrix->columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
887 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
888
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
889 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
890 retval = complex_matrix->columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
891 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
892
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
893 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
894 retval = strlen (string);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
895 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
896
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
897 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
898 retval = range->nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
899 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
900
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
901 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
902 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
903 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
904
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
905 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
906 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
907
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
908 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
909 TC_REP::all (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
910 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
911 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
912
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
913 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
914 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
915
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
916 if (! is_numeric_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
917 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
918 tree_constant tmp = make_numeric ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
919
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
920 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
921 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
922
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
923 return tmp.all ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
924 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
925
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
926 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
927 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
928 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
929 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
930 double status = (scalar != 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
931 retval = tree_constant (status);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
932 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
933 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
934
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
935 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
936 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
937 Matrix m = matrix->all ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
938 retval = tree_constant (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
939 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
940 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
941
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
942 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
943 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
944 double status = (*complex_scalar != 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
945 retval = tree_constant (status);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
946 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
947 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
948
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
949 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
950 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
951 Matrix m = complex_matrix->all ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
952 retval = tree_constant (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
953 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
954 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
955
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
956 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
957 gripe_wrong_type_arg ("all", *this);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
958 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
959 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
960
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
961 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
962 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
963
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
964 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
965 TC_REP::any (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
966 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
967 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
968
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
969 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
970 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
971
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
972 if (! is_numeric_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
973 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
974 tree_constant tmp = make_numeric ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
975
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
976 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
977 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
978
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
979 return tmp.any ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
980 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
981
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
982 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
983 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
984 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
985 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
986 double status = (scalar != 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
987 retval = tree_constant (status);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
988 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
989 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
990
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
991 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
992 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
993 Matrix m = matrix->any ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
994 retval = tree_constant (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
995 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
996 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
997
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
998 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
999 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1000 double status = (*complex_scalar != 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1001 retval = tree_constant (status);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1002 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1003 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1004
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1005 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1006 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1007 Matrix m = complex_matrix->any ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1008 retval = tree_constant (m);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1009 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1010 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1011
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1012 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1013 gripe_wrong_type_arg ("any", *this);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1014 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1015 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1016
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1017 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1018 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1019
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1020 int
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1021 TC_REP::valid_as_scalar_index (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1022 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1023 return (type_tag == magic_colon
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1024 || (type_tag == scalar_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1025 && ! xisnan (scalar)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1026 && NINT (scalar) == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1027 || (type_tag == range_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1028 && range->nelem () == 1
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1029 && ! xisnan (range->base ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1030 && NINT (range->base ()) == 1));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1031 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1032
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1033 int
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1034 TC_REP::valid_as_zero_index (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1035 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1036 return ((type_tag == scalar_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1037 && ! xisnan (scalar)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1038 && NINT (scalar) == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1039 || (type_tag == matrix_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1040 && matrix->rows () == 0
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1041 && matrix->columns () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1042 || (type_tag == range_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1043 && range->nelem () == 1
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1044 && ! xisnan (range->base ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1045 && NINT (range->base ()) == 0));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1046 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1047
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1048 int
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1049 TC_REP::is_true (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1050 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1051 int retval = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1052
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1053 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1054 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1055
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1056 if (! is_numeric_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1057 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1058 tree_constant tmp = make_numeric ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1059
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1060 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1061 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1062
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1063 return tmp.is_true ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1064 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1065
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1066 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1067 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1068 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1069 retval = (scalar != 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1070 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1071
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1072 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1073 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1074 Matrix m = (matrix->all ()) . all ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1075 retval = (m.rows () == 1
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1076 && m.columns () == 1
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1077 && m.elem (0, 0) != 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1078 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1079 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1080
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1081 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1082 retval = (*complex_scalar != 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1083 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1084
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1085 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1086 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1087 Matrix m = (complex_matrix->all ()) . all ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1088 retval = (m.rows () == 1
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1089 && m.columns () == 1
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1090 && m.elem (0, 0) != 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1091 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1092 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1093
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1094 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1095 gripe_wrong_type_arg (0, *this);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1096 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1097 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1098
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1099 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1100 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1101
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1102 static void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1103 warn_implicit_conversion (const char *from, const char *to)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1104 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1105 warning ("implicit conversion from %s to %s", from, to);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1106 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1107
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1108 double
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1109 TC_REP::double_value (int force_string_conversion) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1110 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1111 double retval = octave_NaN;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1112
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1113 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1114 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1115 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1116 retval = scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1117 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1118
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1119 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1120 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1121 if (user_pref.do_fortran_indexing && rows () > 0 && columns () > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1122 retval = matrix->elem (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1123 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1124 gripe_invalid_conversion ("real matrix", "real scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1125 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1126 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1127
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1128 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1129 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1130 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1131 int flag = user_pref.ok_to_lose_imaginary_part;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1132
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1133 if (flag < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1134 warn_implicit_conversion ("complex scalar", "real scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1135
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1136 if (flag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1137 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1138 if (type_tag == complex_scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1139 retval = ::real (*complex_scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1140 else if (type_tag == complex_matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1141 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1142 if (user_pref.do_fortran_indexing
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1143 && rows () > 0 && columns () > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1144 retval = ::real (complex_matrix->elem (0, 0));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1145 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1146 gripe_invalid_conversion ("complex matrix", "real scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1147 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1148 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1149 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1150 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1151 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1152 gripe_invalid_conversion ("complex scalar", "real scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1153 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1154 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1155
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1156 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1157 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1158 int flag = force_string_conversion;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1159 if (! flag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1160 flag = user_pref.implicit_str_to_num_ok;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1161
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1162 if (flag < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1163 warn_implicit_conversion ("string", "real scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1164
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1165 int len = strlen (string);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1166 if (flag && (len == 1 || (len > 1 && user_pref.do_fortran_indexing)))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1167 retval = toascii ((int) string[0]);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1168 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1169 gripe_invalid_conversion ("string", "real scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1170 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1171 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1172
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1173 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1174 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1175 int nel = range->nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1176 if (nel == 1 || (nel > 1 && user_pref.do_fortran_indexing))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1177 retval = range->base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1178 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1179 gripe_invalid_conversion ("range", "real scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1180 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1181 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1182
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1183 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1184 gripe_invalid_conversion (type_as_string (), "real scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1185 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1186 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1187
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1188 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1189 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1190
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1191 Matrix
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1192 TC_REP::matrix_value (int force_string_conversion) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1193 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1194 Matrix retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1195
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1196 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1197 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1198 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1199 retval = Matrix (1, 1, scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1200 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1201
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1202 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1203 retval = *matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1204 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1205
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1206 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1207 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1208 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1209 int flag = user_pref.ok_to_lose_imaginary_part;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1210 if (flag < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1211 warn_implicit_conversion ("complex matrix", "real matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1212
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1213 if (flag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1214 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1215 if (type_tag == complex_scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1216 retval = Matrix (1, 1, ::real (*complex_scalar));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1217 else if (type_tag == complex_matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1218 retval = ::real (*complex_matrix);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1219 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1220 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1221 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1222 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1223 gripe_invalid_conversion ("complex matrix", "real matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1224 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1225 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1226
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1227 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1228 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1229 int flag = force_string_conversion;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1230 if (! flag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1231 flag = user_pref.implicit_str_to_num_ok;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1232
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1233 if (flag < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1234 warn_implicit_conversion ("string", "real matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1235
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1236 if (flag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1237 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1238 int len = strlen (string);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1239
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1240 if (len > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1241 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1242 retval.resize (1, len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1243
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1244 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1245 retval.elem (0, i) = toascii ((int) string[i]);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1246 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1247 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1248 retval = Matrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1249 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1250 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1251 gripe_invalid_conversion ("string", "real matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1252 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1253 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1254
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1255 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1256 retval = range->matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1257 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1258
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1259 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1260 gripe_invalid_conversion (type_as_string (), "real matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1261 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1262 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1263
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1264 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1265 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1266
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1267 Complex
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1268 TC_REP::complex_value (int force_string_conversion) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1269 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1270 Complex retval (octave_NaN, octave_NaN);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1271
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1272 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1273 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1274 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1275 retval = *complex_scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1276 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1277
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1278 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1279 retval = scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1280 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1281
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1282 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1283 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1284 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1285 if (user_pref.do_fortran_indexing && rows () > 0 && columns () > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1286 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1287 if (type_tag == complex_matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1288 retval = complex_matrix->elem (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1289 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1290 retval = matrix->elem (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1291 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1292 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1293 gripe_invalid_conversion ("real matrix", "real scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1294 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1295 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1296
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1297 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1298 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1299 int flag = force_string_conversion;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1300 if (! flag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1301 flag = user_pref.implicit_str_to_num_ok;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1302
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1303 if (flag < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1304 warn_implicit_conversion ("string", "complex scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1305
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1306 int len = strlen (string);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1307 if (flag && (len == 1 || (len > 1 && user_pref.do_fortran_indexing)))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1308 retval = toascii ((int) string[0]);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1309 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1310 gripe_invalid_conversion ("string", "complex scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1311 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1312 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1313
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1314 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1315 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1316 int nel = range->nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1317 if (nel == 1 || (nel > 1 && user_pref.do_fortran_indexing))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1318 retval = range->base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1319 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1320 gripe_invalid_conversion ("range", "complex scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1321 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1322 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1323
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1324 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1325 gripe_invalid_conversion (type_as_string (), "complex scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1326 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1327 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1328
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1329 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1330 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1331
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1332 ComplexMatrix
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1333 TC_REP::complex_matrix_value (int force_string_conversion) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1334 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1335 ComplexMatrix retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1336
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1337 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1338 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1339 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1340 retval = ComplexMatrix (1, 1, Complex (scalar));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1341 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1342
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1343 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1344 retval = ComplexMatrix (1, 1, *complex_scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1345 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1346
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1347 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1348 retval = ComplexMatrix (*matrix);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1349 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1350
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1351 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1352 retval = *complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1353 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1354
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1355 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1356 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1357 int flag = force_string_conversion;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1358 if (! flag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1359 flag = user_pref.implicit_str_to_num_ok;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1360
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1361 if (flag < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1362 warn_implicit_conversion ("string", "complex matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1363
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1364 if (flag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1365 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1366 int len = strlen (string);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1367
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1368 retval.resize (1, len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1369
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1370 if (len > 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1371 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1372 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1373 retval.elem (0, i) = toascii ((int) string[i]);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1374 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1375 else if (len == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1376 retval.elem (0, 0) = toascii ((int) string[0]);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1377 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1378 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1379 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1380 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1381 gripe_invalid_conversion ("string", "real matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1382 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1383 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1384
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1385 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1386 retval = range->matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1387 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1388
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1389 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1390 gripe_invalid_conversion (type_as_string (), "complex matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1391 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1392 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1393
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1394 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1395 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1396
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1397 char *
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1398 TC_REP::string_value (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1399 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1400 if (type_tag == string_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1401 return string;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1402 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1403 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1404 gripe_invalid_conversion (type_as_string (), "string");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1405 return 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1406 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1407 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1408
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1409 Range
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1410 TC_REP::range_value (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1411 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1412 assert (type_tag == range_constant);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1413 return *range;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1414 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1415
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1416 Octave_map
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1417 TC_REP::map_value (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1418 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1419 assert (type_tag == map_constant);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1420 return *a_map;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1421 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1422
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1423 tree_constant&
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1424 TC_REP::lookup_map_element (const char *name, int insert, int silent)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1425 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1426 static tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1427
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1428 if (type_tag == map_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1429 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1430 Pix idx = a_map->seek (name);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1431
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1432 if (idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1433 return a_map->contents (idx);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1434 else if (insert)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1435 return (*a_map) [name];
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1436 else if (! silent)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1437 error ("structure has no member `%s'", name);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1438 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1439 else if (! silent)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1440 error ("invalid structure access attempted");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1441
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1442 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1443 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1444
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1445 // This could be made more efficient by doing all the work here rather
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1446 // than relying on matrix_value() to do any possible type conversions.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1447
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1448 ColumnVector
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1449 TC_REP::vector_value (int force_string_conversion,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1450 int force_vector_conversion) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1451 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1452 ColumnVector retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1453
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1454 Matrix m = matrix_value (force_string_conversion);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1455
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1456 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1457 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1458
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1459 int nr = m.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1460 int nc = m.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1461 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1462 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1463 retval.resize (nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1464 for (int i = 0; i < nc; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1465 retval.elem (i) = m (0, i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1466 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1467 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1468 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1469 retval.resize (nr);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1470 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1471 retval.elem (i) = m.elem (i, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1472 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1473 else if (nr > 0 && nc > 0
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1474 && (user_pref.do_fortran_indexing || force_vector_conversion))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1475 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1476 retval.resize (nr * nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1477 int k = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1478 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1479 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1480 retval.elem (k++) = m.elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1481 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1482 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1483 gripe_invalid_conversion ("real matrix", "real vector");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1484
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1485 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1486 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1487
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1488 // This could be made more efficient by doing all the work here rather
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1489 // than relying on complex_matrix_value() to do any possible type
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1490 // conversions.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1491
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1492 ComplexColumnVector
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1493 TC_REP::complex_vector_value (int force_string_conversion,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1494 int force_vector_conversion) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1495 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1496 ComplexColumnVector retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1497
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1498 ComplexMatrix m = complex_matrix_value (force_string_conversion);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1499
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1500 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1501 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1502
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1503 int nr = m.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1504 int nc = m.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1505 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1506 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1507 retval.resize (nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1508 for (int i = 0; i < nc; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1509 retval.elem (i) = m (0, i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1510 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1511 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1512 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1513 retval.resize (nr);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1514 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1515 retval.elem (i) = m.elem (i, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1516 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1517 else if (nr > 0 && nc > 0
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1518 && (user_pref.do_fortran_indexing || force_vector_conversion))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1519 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1520 retval.resize (nr * nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1521 int k = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1522 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1523 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1524 retval.elem (k++) = m.elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1525 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1526 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1527 gripe_invalid_conversion ("complex matrix", "complex vector");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1528
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1529 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1530 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1531
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1532 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1533 TC_REP::convert_to_str (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1534 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1535 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1536
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1537 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1538 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1539 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1540 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1541 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1542 double d = double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1543
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1544 if (xisnan (d))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1545 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1546 ::error ("invalid conversion from NaN to character");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1547 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1548 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1549 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1550 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1551 int i = NINT (d);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1552 // Warn about out of range conversions?
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1553 char s[2];
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1554 s[0] = (char) i;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1555 s[1] = '\0';
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1556 retval = tree_constant (s);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1557 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1558 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1559 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1560
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1561 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1562 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1563 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1564 if (rows () == 0 && columns () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1565 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1566 char s = '\0';
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1567 retval = tree_constant (&s);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1568 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1569 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1570 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1571 ColumnVector v = vector_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1572 int len = v.length ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1573 if (len == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1574 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1575 char s = '\0';
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1576 retval = tree_constant (&s);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1577 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1578 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1579 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1580 char *s = new char [len+1];
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1581 s[len] = '\0';
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1582 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1583 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1584 double d = v.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1585
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1586 if (xisnan (d))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1587 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1588 ::error ("invalid conversion from NaN to character");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1589 delete [] s;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1590 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1591 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1592 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1593 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1594 int ival = NINT (d);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1595 // Warn about out of range conversions?
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1596 s[i] = (char) ival;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1597 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1598 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1599 retval = tree_constant (s);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1600 delete [] s;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1601 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1602 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1603 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1604 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1605
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1606 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1607 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1608 Range r = range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1609 double b = r.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1610 double incr = r.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1611 int nel = r.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1612 char *s = new char [nel+1];
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1613 s[nel] = '\0';
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1614 for (int i = 0; i < nel; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1615 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1616 double d = b + i * incr;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1617
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1618 if (xisnan (d))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1619 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1620 ::error ("invalid conversion from NaN to character");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1621 delete [] s;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1622 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1623 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1624 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1625 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1626 int ival = NINT (d);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1627 // Warn about out of range conversions?
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1628 s[i] = (char) ival;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1629 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1630 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1631 retval = tree_constant (s);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1632 delete [] s;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1633 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1634 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1635
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1636 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1637 retval = string;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1638 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1639
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1640 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1641 gripe_invalid_conversion (type_as_string (), "string");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1642 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1643 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1644
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1645 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1646 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1647
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1648 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1649 TC_REP::convert_to_row_or_column_vector (void)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1650 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1651 assert (type_tag == matrix_constant || type_tag == complex_matrix_constant);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1652
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1653 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1654 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1655
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1656 if (nr == 1 || nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1657 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1658
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1659 int len = nr * nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1660
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1661 assert (len > 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1662
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1663 int new_nr = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1664 int new_nc = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1665
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1666 if (user_pref.prefer_column_vectors)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1667 new_nr = len;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1668 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1669 new_nc = len;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1670
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1671 if (type_tag == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1672 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1673 Matrix *m = new Matrix (new_nr, new_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1674
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1675 double *cop_out = matrix->fortran_vec ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1676
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1677 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1678 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1679 if (new_nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1680 m->elem (0, i) = *cop_out++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1681 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1682 m->elem (i, 0) = *cop_out++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1683 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1684
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1685 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1686 matrix = m;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1687 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1688 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1689 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1690 ComplexMatrix *cm = new ComplexMatrix (new_nr, new_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1691
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1692 Complex *cop_out = complex_matrix->fortran_vec ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1693
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1694 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1695 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1696 if (new_nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1697 cm->elem (0, i) = *cop_out++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1698 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1699 cm->elem (i, 0) = *cop_out++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1700 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1701
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1702 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1703 complex_matrix = cm;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1704 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1705 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1706
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1707 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1708 TC_REP::force_numeric (int force_str_conv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1709 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1710 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1711 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1712 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1713 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1714 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1715 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1716 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1717
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1718 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1719 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1720 if (! force_str_conv && ! user_pref.implicit_str_to_num_ok)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1721 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1722 ::error ("failed to convert `%s' to a numeric type --", string);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1723 ::error ("default conversion turned off");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1724
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1725 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1726 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1727
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1728 int len = strlen (string);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1729 if (len > 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1730 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1731 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1732 Matrix *tm = new Matrix (1, len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1733 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1734 tm->elem (0, i) = toascii ((int) string[i]);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1735 matrix = tm;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1736 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1737 else if (len == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1738 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1739 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1740 scalar = toascii ((int) string[0]);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1741 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1742 else if (len == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1743 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1744 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1745 matrix = new Matrix (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1746 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1747 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1748 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1749 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1750 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1751
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1752 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1753 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1754 int len = range->nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1755 if (len > 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1756 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1757 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1758 Matrix *tm = new Matrix (1, len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1759 double b = range->base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1760 double increment = range->inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1761 for (int i = 0; i < len; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1762 tm->elem (0, i) = b + i * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1763 matrix = tm;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1764 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1765 else if (len == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1766 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1767 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1768 scalar = range->base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1769 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1770 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1771 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1772
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1773 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1774 gripe_invalid_conversion (type_as_string (), "numeric type");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1775 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1776 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1777 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1778
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1779 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1780 TC_REP::make_numeric (int force_str_conv) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1781 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1782 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1783
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1784 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1785 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1786 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1787 retval = tree_constant (scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1788 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1789
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1790 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1791 retval = tree_constant (*matrix);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1792 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1793
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1794 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1795 retval = tree_constant (*complex_scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1796 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1797
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1798 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1799 retval = tree_constant (*complex_matrix);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1800 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1801
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1802 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1803 retval = tree_constant (string);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1804 retval.force_numeric (force_str_conv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1805 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1806
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1807 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1808 retval = tree_constant (*range);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1809 retval.force_numeric (force_str_conv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1810 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1811
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1812 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1813 gripe_invalid_conversion (type_as_string (), "numeric value");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1814 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1815 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1816
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1817 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1818 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1819
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1820 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1821 TC_REP::bump_value (tree_expression::type etype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1822 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1823 switch (etype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1824 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1825 case tree_expression::increment:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1826 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1827 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1828 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1829 scalar++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1830 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1831
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1832 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1833 *matrix = *matrix + 1.0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1834 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1835
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1836 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1837 *complex_scalar = *complex_scalar + 1.0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1838 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1839
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1840 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1841 *complex_matrix = *complex_matrix + 1.0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1842 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1843
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1844 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1845 range->set_base (range->base () + 1.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1846 range->set_limit (range->limit () + 1.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1847 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1848
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1849 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1850 gripe_wrong_type_arg ("operator ++", type_as_string ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1851 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1852 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1853 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1854
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1855 case tree_expression::decrement:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1856 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1857 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1858 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1859 scalar--;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1860 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1861
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1862 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1863 *matrix = *matrix - 1.0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1864 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1865
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1866 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1867 range->set_base (range->base () - 1.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1868 range->set_limit (range->limit () - 1.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1869 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1870
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1871 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1872 gripe_wrong_type_arg ("operator --", type_as_string ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1873 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1874 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1875 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1876
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1877 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1878 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1879 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1880 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1881 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1882
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1883 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1884 TC_REP::resize (int i, int j)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1885 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1886 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1887 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1888 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1889 matrix->resize (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1890 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1891
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1892 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1893 complex_matrix->resize (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1894 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1895
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1896 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1897 gripe_wrong_type_arg ("resize", type_as_string ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1898 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1899 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1900 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1901
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1902 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1903 TC_REP::resize (int i, int j, double val)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1904 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1905 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1906 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1907 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1908 matrix->resize (i, j, val);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1909 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1910
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1911 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1912 complex_matrix->resize (i, j, val);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1913 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1914
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1915 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1916 gripe_wrong_type_arg ("resize", type_as_string ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1917 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1918 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1919 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1920
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1921 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1922 TC_REP::maybe_resize (int i, int j)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1923 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1924 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1925 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1926
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1927 i++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1928 j++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1929
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1930 assert (i > 0 && j > 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1931
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1932 if (i > nr || j > nc)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1933 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1934 if (user_pref.resize_on_range_error)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1935 resize (MAX (i, nr), MAX (j, nc), 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1936 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1937 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1938 if (i > nr)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1939 ::error ("row index = %d exceeds max row dimension = %d", i, nr);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1940
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1941 if (j > nc)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1942 ::error ("column index = %d exceeds max column dimension = %d",
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1943 j, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1944 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1945 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1946 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1947
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1948 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1949 TC_REP::maybe_resize (int i, force_orient f_orient)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1950 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1951 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1952 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1953
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1954 i++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1955
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1956 assert (i >= 0 && (nr <= 1 || nc <= 1));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1957
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1958 // This function never reduces the size of a vector, and all vectors
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1959 // have dimensions of at least 0x0. If i is 0, it is either because
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1960 // a vector has been indexed with a vector of all zeros (in which case
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1961 // the index vector is empty and nothing will happen) or a vector has
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1962 // been indexed with 0 (an error which will be caught elsewhere).
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1963 if (i == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1964 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1965
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1966 if (nr <= 1 && nc <= 1 && i >= 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1967 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1968 if (user_pref.resize_on_range_error)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1969 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1970 if (f_orient == row_orient)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1971 resize (1, i, 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1972 else if (f_orient == column_orient)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1973 resize (i, 1, 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1974 else if (user_pref.prefer_column_vectors)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1975 resize (i, 1, 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1976 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1977 resize (1, i, 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1978 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1979 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1980 ::error ("matrix index = %d exceeds max dimension = %d", i, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1981 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1982 else if (nr == 1 && i > nc)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1983 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1984 if (user_pref.resize_on_range_error)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1985 resize (1, i, 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1986 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1987 ::error ("matrix index = %d exceeds max dimension = %d", i, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1988 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1989 else if (nc == 1 && i > nr)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1990 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1991 if (user_pref.resize_on_range_error)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1992 resize (i, 1, 0.0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1993 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1994 ::error ("matrix index = %d exceeds max dimension = ", i, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1995 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1996 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1997
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1998 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
1999 TC_REP::stash_original_text (char *s)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2000 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2001 orig_text = strsave (s);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2002 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2003
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2004 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2005 TC_REP::maybe_mutate (void)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2006 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2007 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2008 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2009
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2010 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2011 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2012 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2013 if (::imag (*complex_scalar) == 0.0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2014 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2015 double d = ::real (*complex_scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2016 delete complex_scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2017 scalar = d;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2018 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2019 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2020 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2021
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2022 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2023 if (! any_element_is_complex (*complex_matrix))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2024 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2025 Matrix *m = new Matrix (::real (*complex_matrix));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2026 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2027 matrix = m;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2028 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2029 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2030 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2031
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2032 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2033 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2034 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2035
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2036 // Avoid calling rows() and columns() for things like magic_colon.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2037
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2038 int nr = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2039 int nc = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2040 if (type_tag == matrix_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2041 || type_tag == complex_matrix_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2042 || type_tag == range_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2043 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2044 nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2045 nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2046 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2047
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2048 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2049 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2050 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2051 if (nr == 1 && nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2052 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2053 double d = matrix->elem (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2054 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2055 scalar = d;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2056 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2057 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2058 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2059
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2060 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2061 if (nr == 1 && nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2062 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2063 Complex c = complex_matrix->elem (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2064 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2065 complex_scalar = new Complex (c);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2066 type_tag = complex_scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2067 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2068 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2069
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2070 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2071 if (nr == 1 && nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2072 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2073 double d = range->base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2074 delete range;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2075 scalar = d;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2076 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2077 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2078 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2079
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2080 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2081 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2082 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2083 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2084
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2085 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2086 TC_REP::print (ostream& output_buf)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2087 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2088 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2089 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2090
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2091 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2092 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2093 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2094 octave_print_internal (output_buf, scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2095 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2096
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2097 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2098 octave_print_internal (output_buf, *matrix);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2099 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2100
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2101 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2102 octave_print_internal (output_buf, *complex_scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2103 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2104
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2105 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2106 octave_print_internal (output_buf, *complex_matrix);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2107 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2108
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2109 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2110 output_buf << string << "\n";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2111 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2112
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2113 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2114 octave_print_internal (output_buf, *range);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2115 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2116
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2117 case map_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2118 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2119 // XXX FIXME XXX -- would be nice to print the output in some standard
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2120 // order. Maybe all substructures first, maybe alphabetize entries,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2121 // etc.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2122 begin_unwind_frame ("TC_REP_print");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2123
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2124 unwind_protect_int (structure_indent_level);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2125 unwind_protect_int (user_pref.struct_levels_to_print);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2126
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2127 if (user_pref.struct_levels_to_print-- > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2128 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2129 output_buf << "{\n";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2130
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2131 increment_structure_indent_level ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2132
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2133 for (Pix p = a_map->first (); p != 0; a_map->next (p))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2134 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2135 const char *key = a_map->key (p);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2136 tree_constant val = a_map->contents (p);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2137
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2138 output_buf.form ("%*s%s = ", structure_indent_level,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2139 "", key);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2140
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2141 if (! (print_as_scalar (val) || print_as_structure (val)))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2142 output_buf << "\n";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2143
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2144 val.print (output_buf);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2145 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2146
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2147 decrement_structure_indent_level ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2148
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2149 output_buf.form ("%*s%s", structure_indent_level, "", "}\n");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2150 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2151 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2152 output_buf << "<structure>\n";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2153
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2154 run_unwind_frame ("TC_REP_print");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2155 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2156 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2157
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2158 case unknown_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2159 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2160 case all_va_args:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2161 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2162 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2163 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2164 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2165
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2166 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2167 TC_REP::print_code (ostream& os)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2168 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2169 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2170 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2171 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2172 if (orig_text)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2173 os << orig_text;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2174 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2175 octave_print_internal (os, scalar, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2176 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2177
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2178 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2179 octave_print_internal (os, *matrix, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2180 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2181
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2182 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2183 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2184 double re = complex_scalar->real ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2185 double im = complex_scalar->imag ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2186
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2187 // If we have the original text and a pure imaginary, just print the
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2188 // original text, because this must be a constant that was parsed as
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2189 // part of a function.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2190
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2191 if (orig_text && re == 0.0 && im > 0.0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2192 os << orig_text;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2193 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2194 octave_print_internal (os, *complex_scalar, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2195 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2196 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2197
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2198 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2199 octave_print_internal (os, *complex_matrix, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2200 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2201
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2202 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2203 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2204 os << "\"";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2205 char *s, *t = string;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2206 while ((s = undo_string_escape (*t++)))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2207 os << s;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2208 os << "\"";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2209 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2210 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2211
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2212 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2213 octave_print_internal (os, *range, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2214 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2215
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2216 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2217 os << ":";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2218 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2219
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2220 case all_va_args:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2221 os << "all_va_args";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2222 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2223
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2224 case map_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2225 case unknown_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2226 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2227 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2228 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2229 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2230
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2231 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2232 TC_REP::gripe_wrong_type_arg (const char *name,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2233 const tree_constant_rep& tcr) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2234 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2235 if (name)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2236 ::error ("%s: wrong type argument `%s'", name, tcr.type_as_string ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2237 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2238 ::error ("wrong type argument `%s'", name, tcr.type_as_string ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2239 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2240
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2241 char *
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2242 TC_REP::type_as_string (void) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2243 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2244 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2245 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2246 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2247 return "real scalar";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2248
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2249 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2250 return "real matrix";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2251
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2252 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2253 return "complex scalar";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2254
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2255 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2256 return "complex matrix";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2257
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2258 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2259 return "string";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2260
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2261 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2262 return "range";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2263
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2264 case map_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2265 return "structure";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2266
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2267 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2268 return "<unknown type>";
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2269 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2270 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2271
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2272 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2273 do_binary_op (tree_constant& a, tree_constant& b, tree_expression::type t)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2274 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2275 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2276
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2277 int first_empty = (a.rows () == 0 || a.columns () == 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2278 int second_empty = (b.rows () == 0 || b.columns () == 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2279
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2280 if (first_empty || second_empty)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2281 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2282 int flag = user_pref.propagate_empty_matrices;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2283 if (flag < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2284 warning ("binary operation on empty matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2285 else if (flag == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2286 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2287 ::error ("invalid binary operation on empty matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2288 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2289 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2290 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2291
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2292 tree_constant tmp_a = a.make_numeric ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2293
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2294 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2295 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2296
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2297 tree_constant tmp_b = b.make_numeric ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2298
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2299 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2300 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2301
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2302 TC_REP::constant_type a_type = tmp_a.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2303 TC_REP::constant_type b_type = tmp_b.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2304
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2305 double d1, d2;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2306 Matrix m1, m2;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2307 Complex c1, c2;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2308 ComplexMatrix cm1, cm2;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2309
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2310 switch (a_type)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2311 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2312 case TC_REP::scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2313
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2314 d1 = tmp_a.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2315
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2316 switch (b_type)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2317 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2318 case TC_REP::scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2319 d2 = tmp_b.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2320 retval = do_binary_op (d1, d2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2321 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2322
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2323 case TC_REP::matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2324 m2 = tmp_b.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2325 retval = do_binary_op (d1, m2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2326 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2327
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2328 case TC_REP::complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2329 c2 = tmp_b.complex_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2330 retval = do_binary_op (d1, c2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2331 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2332
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2333 case TC_REP::complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2334 cm2 = tmp_b.complex_matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2335 retval = do_binary_op (d1, cm2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2336 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2337
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2338 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2339 gripe_wrong_type_arg_for_binary_op (tmp_b);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2340 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2341 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2342 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2343
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2344 case TC_REP::matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2345
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2346 m1 = tmp_a.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2347
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2348 switch (b_type)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2349 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2350 case TC_REP::scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2351 d2 = tmp_b.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2352 retval = do_binary_op (m1, d2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2353 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2354
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2355 case TC_REP::matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2356 m2 = tmp_b.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2357 retval = do_binary_op (m1, m2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2358 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2359
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2360 case TC_REP::complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2361 c2 = tmp_b.complex_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2362 retval = do_binary_op (m1, c2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2363 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2364
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2365 case TC_REP::complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2366 cm2 = tmp_b.complex_matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2367 retval = do_binary_op (m1, cm2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2368 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2369
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2370 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2371 gripe_wrong_type_arg_for_binary_op (tmp_b);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2372 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2373 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2374 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2375
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2376 case TC_REP::complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2377
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2378 c1 = tmp_a.complex_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2379
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2380 switch (b_type)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2381 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2382 case TC_REP::scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2383 d2 = tmp_b.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2384 retval = do_binary_op (c1, d2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2385 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2386
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2387 case TC_REP::matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2388 m2 = tmp_b.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2389 retval = do_binary_op (c1, m2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2390 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2391
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2392 case TC_REP::complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2393 c2 = tmp_b.complex_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2394 retval = do_binary_op (c1, c2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2395 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2396
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2397 case TC_REP::complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2398 cm2 = tmp_b.complex_matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2399 retval = do_binary_op (c1, cm2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2400 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2401
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2402 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2403 gripe_wrong_type_arg_for_binary_op (tmp_b);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2404 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2405 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2406 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2407
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2408 case TC_REP::complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2409
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2410 cm1 = tmp_a.complex_matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2411
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2412 switch (b_type)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2413 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2414 case TC_REP::scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2415 d2 = tmp_b.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2416 retval = do_binary_op (cm1, d2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2417 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2418
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2419 case TC_REP::matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2420 m2 = tmp_b.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2421 retval = do_binary_op (cm1, m2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2422 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2423
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2424 case TC_REP::complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2425 c2 = tmp_b.complex_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2426 retval = do_binary_op (cm1, c2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2427 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2428
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2429 case TC_REP::complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2430 cm2 = tmp_b.complex_matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2431 retval = do_binary_op (cm1, cm2, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2432 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2433
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2434 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2435 gripe_wrong_type_arg_for_binary_op (tmp_b);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2436 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2437 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2438 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2439
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2440 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2441 gripe_wrong_type_arg_for_binary_op (tmp_a);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2442 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2443 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2444
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2445 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2446 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2447
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2448 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2449 do_unary_op (tree_constant& a, tree_expression::type t)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2450 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2451 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2452
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2453 if (a.rows () == 0 || a.columns () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2454 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2455 int flag = user_pref.propagate_empty_matrices;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2456 if (flag < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2457 warning ("unary operation on empty matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2458 else if (flag == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2459 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2460 ::error ("invalid unary operation on empty matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2461 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2462 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2463 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2464
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2465 tree_constant tmp_a = a.make_numeric ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2466
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2467 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2468 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2469
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2470 switch (tmp_a.const_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2471 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2472 case TC_REP::scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2473 retval = do_unary_op (tmp_a.double_value (), t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2474 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2475
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2476 case TC_REP::matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2477 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2478 Matrix m = tmp_a.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2479 retval = do_unary_op (m, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2480 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2481 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2482
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2483 case TC_REP::complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2484 retval = do_unary_op (tmp_a.complex_value (), t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2485 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2486
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2487 case TC_REP::complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2488 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2489 ComplexMatrix m = tmp_a.complex_matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2490 retval = do_unary_op (m, t);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2491 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2492 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2493
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2494 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2495 gripe_wrong_type_arg_for_unary_op (tmp_a);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2496 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2497 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2498
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2499 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2500 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2501
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2502 // -------------------------------------------------------------------
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2503 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2504 // Indexing operations for the tree-constant representation class.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2505 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2506 // Leave the commented #includes below to make it easy to split this
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2507 // out again, should we want to do that.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2508 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2509 // -------------------------------------------------------------------
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2510
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2511 // #ifdef HAVE_CONFIG_H
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2512 // #include <config.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2513 // #endif
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2514
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2515 // #include <ctype.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2516 // #include <string.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2517 // #include <fstream.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2518 // #include <iostream.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2519 // #include <strstream.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2520
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2521 // #include "mx-base.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2522 // #include "Range.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2523
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2524 // #include "arith-ops.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2525 // #include "variables.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2526 // #include "sysdep.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2527 // #include "error.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2528 // #include "gripes.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2529 // #include "user-prefs.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2530 // #include "utils.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2531 // #include "pager.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2532 // #include "pr-output.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2533 // #include "tree-const.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2534 // #include "idx-vector.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2535 // #include "oct-map.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2536
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2537 // #include "tc-inlines.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2538
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2539 // Indexing functions.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2540
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2541 // This is the top-level indexing function.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2542
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2543 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2544 TC_REP::do_index (const Octave_object& args)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2545 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2546 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2547
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2548 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2549 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2550
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2551 if (rows () == 0 || columns () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2552 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2553 switch (args.length ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2554 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2555 case 2:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2556 if (! args(1).is_magic_colon ()
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2557 && args(1).rows () != 0 && args(1).columns () != 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2558 goto index_error;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2559
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2560 case 1:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2561 if (! args(0).is_magic_colon ()
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2562 && args(0).rows () != 0 && args(0).columns () != 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2563 goto index_error;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2564
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2565 return Matrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2566
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2567 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2568 index_error:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2569 ::error ("attempt to index empty matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2570 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2571 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2572 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2573
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2574 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2575 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2576 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2577 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2578 retval = do_scalar_index (args);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2579 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2580
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2581 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2582 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2583 retval = do_matrix_index (args);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2584 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2585
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2586 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2587 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2588 // retval = do_string_index (args);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2589 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2590
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2591 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2592
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2593 // This isn\'t great, but it\'s easier than implementing a lot of
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2594 // other special indexing functions.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2595
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2596 force_numeric ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2597
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2598 if (! error_state && is_numeric_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2599 retval = do_index (args);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2600
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2601 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2602 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2603
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2604 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2605 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2606
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2607 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2608 TC_REP::do_scalar_index (const Octave_object& args) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2609 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2610 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2611
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2612 if (valid_scalar_indices (args))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2613 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2614 if (type_tag == scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2615 retval = scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2616 else if (type_tag == complex_scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2617 retval = *complex_scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2618 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2619 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2620
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2621 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2622 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2623 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2624 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2625 int rows = -1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2626 int cols = -1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2627
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2628 int nargin = args.length ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2629
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2630 switch (nargin)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2631 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2632 case 2:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2633 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2634 tree_constant arg = args(1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2635
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2636 if (arg.is_matrix_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2637 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2638 Matrix mj = arg.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2639
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2640 idx_vector j (mj, user_pref.do_fortran_indexing, "", 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2641 if (! j)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2642 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2643
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2644 int jmax = j.max ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2645 int len = j.length ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2646 if (len == j.ones_count ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2647 cols = len;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2648 else if (jmax > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2649 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2650 error ("invalid scalar index = %d", jmax+1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2651 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2652 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2653 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2654 else if (arg.const_type () == magic_colon)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2655 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2656 cols = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2657 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2658 else if (arg.is_scalar_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2659 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2660 double dval = arg.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2661 if (! xisnan (dval))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2662 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2663 int ival = NINT (dval);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2664 if (ival == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2665 cols = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2666 else if (ival == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2667 cols = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2668 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2669 break;;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2670 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2671 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2672 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2673 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2674 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2675 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2676 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2677
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2678 // Fall through...
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2679
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2680 case 1:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2681 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2682 tree_constant arg = args(0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2683
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2684 if (arg.is_matrix_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2685 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2686 Matrix mi = arg.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2687
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2688 idx_vector i (mi, user_pref.do_fortran_indexing, "", 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2689 if (! i)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2690 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2691
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2692 int imax = i.max ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2693 int len = i.length ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2694 if (len == i.ones_count ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2695 rows = len;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2696 else if (imax > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2697 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2698 error ("invalid scalar index = %d", imax+1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2699 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2700 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2701 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2702 else if (arg.const_type () == magic_colon)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2703 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2704 rows = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2705 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2706 else if (arg.is_scalar_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2707 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2708 double dval = arg.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2709
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2710 if (! xisnan (dval))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2711 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2712 int ival = NINT (dval);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2713 if (ival == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2714 rows = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2715 else if (ival == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2716 rows = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2717 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2718 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2719 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2720 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2721 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2722 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2723 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2724 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2725
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2726 // If only one index, cols will not be set, so we set it.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2727 // If single index is [], rows will be zero, and we should set cols to
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2728 // zero too.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2729
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2730 if (cols < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2731 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2732 if (rows == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2733 cols = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2734 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2735 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2736 if (user_pref.prefer_column_vectors)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2737 cols = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2738 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2739 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2740 cols = rows;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2741 rows = 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2742 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2743 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2744 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2745
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2746 if (type_tag == scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2747 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2748 return Matrix (rows, cols, scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2749 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2750 else if (type_tag == complex_scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2751 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2752 return ComplexMatrix (rows, cols, *complex_scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2753 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2754 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2755 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2756 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2757 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2758
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2759 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2760 ::error ("invalid number of arguments for scalar type");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2761 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2762 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2763 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2764 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2765
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2766 ::error ("index invalid or out of range for scalar type");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2767 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2768 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2769
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2770 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2771 TC_REP::do_matrix_index (const Octave_object& args) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2772 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2773 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2774
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2775 int nargin = args.length ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2776
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2777 switch (nargin)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2778 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2779 case 1:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2780 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2781 tree_constant arg = args(0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2782
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2783 if (arg.is_undefined ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2784 ::error ("matrix index is a null expression");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2785 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2786 retval = do_matrix_index (arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2787 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2788 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2789
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2790 case 2:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2791 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2792 tree_constant arg_a = args(0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2793 tree_constant arg_b = args(1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2794
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2795 if (arg_a.is_undefined ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2796 ::error ("first matrix index is a null expression");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2797 else if (arg_b.is_undefined ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2798 ::error ("second matrix index is a null expression");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2799 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2800 retval = do_matrix_index (arg_a, arg_b);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2801 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2802 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2803
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2804 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2805 if (nargin == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2806 ::error ("matrix indices expected, but none provided");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2807 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2808 ::error ("too many indices for matrix expression");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2809 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2810 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2811
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2812 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2813 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2814
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2815 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2816 TC_REP::do_matrix_index (const tree_constant& i_arg) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2817 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2818 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2819
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2820 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2821 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2822
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2823 if (user_pref.do_fortran_indexing)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2824 retval = fortran_style_matrix_index (i_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2825 else if (nr <= 1 || nc <= 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2826 retval = do_vector_index (i_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2827 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2828 ::error ("single index only valid for row or column vector");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2829
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2830 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2831 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2832
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2833 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2834 TC_REP::do_matrix_index (const tree_constant& i_arg,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2835 const tree_constant& j_arg) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2836 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2837 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2838
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2839 tree_constant tmp_i = i_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2840
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2841 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2842 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2843
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2844 TC_REP::constant_type itype = tmp_i.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2845
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2846 switch (itype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2847 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2848 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2849 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2850 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2851 int i = tree_to_mat_idx (tmp_i.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2852 retval = do_matrix_index (i, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2853 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2854 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2855
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2856 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2857 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2858 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2859 Matrix mi = tmp_i.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2860 idx_vector iv (mi, user_pref.do_fortran_indexing, "row", rows ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2861 if (! iv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2862 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2863
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2864 if (iv.length () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2865 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2866 Matrix mtmp;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2867 retval = tree_constant (mtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2868 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2869 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2870 retval = do_matrix_index (iv, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2871 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2872 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2873
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2874 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2875 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2876 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2877
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2878 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2879 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2880 Range ri = tmp_i.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2881 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2882 if (nr == 2 && is_zero_one (ri))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2883 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2884 retval = do_matrix_index (1, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2885 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2886 else if (nr == 2 && is_one_zero (ri))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2887 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2888 retval = do_matrix_index (0, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2889 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2890 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2891 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2892 if (index_check (ri, "row") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2893 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2894 retval = do_matrix_index (ri, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2895 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2896 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2897 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2898
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2899 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2900 retval = do_matrix_index (magic_colon, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2901 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2902
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2903 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2904 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2905 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2906 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2907
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2908 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2909 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2910
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2911 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2912 TC_REP::do_matrix_index (TC_REP::constant_type mci) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2913 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2914 assert (mci == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2915
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2916 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2917 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2918 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2919 int size = nr * nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2920 if (size > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2921 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2922 CRMATRIX (m, cm, size, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2923 int idx = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2924 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2925 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2926 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2927 CRMATRIX_ASSIGN_REP_ELEM (m, cm, idx, 0, i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2928 idx++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2929 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2930 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2931 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2932 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2933 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2934
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2935 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2936 TC_REP::fortran_style_matrix_index (const tree_constant& i_arg) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2937 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2938 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2939
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2940 tree_constant tmp_i = i_arg.make_numeric_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2941
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2942 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2943 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2944
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2945 TC_REP::constant_type itype = tmp_i.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2946
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2947 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2948 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2949
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2950 switch (itype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2951 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2952 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2953 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2954 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2955 double dval = tmp_i.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2956
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2957 if (xisnan (dval))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2958 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2959 ::error ("NaN is invalid as a matrix index");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2960 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2961 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2962 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2963 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2964 int i = NINT (dval);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2965 int ii = fortran_row (i, nr) - 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2966 int jj = fortran_column (i, nr) - 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2967 if (index_check (i-1, "") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2968 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2969 if (range_max_check (i-1, nr * nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2970 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2971 retval = do_matrix_index (ii, jj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2972 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2973 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2974 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2975
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2976 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2977 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2978 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2979 Matrix mi = tmp_i.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2980 if (mi.rows () == 0 || mi.columns () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2981 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2982 Matrix mtmp;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2983 retval = tree_constant (mtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2984 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2985 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2986 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2987 // Yes, we really do want to call this with mi.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2988 retval = fortran_style_matrix_index (mi);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2989 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2990 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2991 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2992
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2993 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2994 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2995 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2996
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2997 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2998 gripe_range_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
2999 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3000
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3001 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3002 retval = do_matrix_index (magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3003 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3004
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3005 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3006 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3007 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3008 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3009
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3010 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3011 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3012
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3013 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3014 TC_REP::fortran_style_matrix_index (const Matrix& mi) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3015 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3016 assert (is_matrix_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3017
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3018 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3019
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3020 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3021 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3022
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3023 int len = nr * nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3024
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3025 int index_nr = mi.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3026 int index_nc = mi.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3027
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3028 if (index_nr >= 1 && index_nc >= 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3029 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3030 const double *cop_out = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3031 const Complex *c_cop_out = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3032 int real_type = type_tag == matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3033 if (real_type)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3034 cop_out = matrix->data ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3035 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3036 c_cop_out = complex_matrix->data ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3037
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3038 const double *cop_out_index = mi.data ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3039
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3040 idx_vector iv (mi, 1, "", len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3041 if (! iv || range_max_check (iv.max (), len) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3042 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3043
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3044 int result_size = iv.length ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3045
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3046 // XXX FIXME XXX -- there is way too much duplicate code here...
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3047
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3048 if (iv.one_zero_only ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3049 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3050 if (iv.ones_count () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3051 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3052 retval = Matrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3053 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3054 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3055 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3056 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3057 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3058 CRMATRIX (m, cm, 1, result_size);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3059
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3060 for (int i = 0; i < result_size; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3061 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3062 int idx = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3063 CRMATRIX_ASSIGN_ELEM (m, cm, 0, i, cop_out [idx],
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3064 c_cop_out [idx], real_type);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3065 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3066
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3067 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3068 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3069 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3070 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3071 CRMATRIX (m, cm, result_size, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3072
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3073 for (int i = 0; i < result_size; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3074 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3075 int idx = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3076 CRMATRIX_ASSIGN_ELEM (m, cm, i, 0, cop_out [idx],
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3077 c_cop_out [idx], real_type);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3078 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3079
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3080 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3081 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3082 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3083 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3084 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3085 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3086 CRMATRIX (m, cm, result_size, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3087
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3088 for (int i = 0; i < result_size; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3089 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3090 int idx = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3091 CRMATRIX_ASSIGN_ELEM (m, cm, i, 0, cop_out [idx],
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3092 c_cop_out [idx], real_type);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3093 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3094
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3095 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3096 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3097 else if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3098 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3099 CRMATRIX (m, cm, 1, result_size);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3100
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3101 for (int i = 0; i < result_size; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3102 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3103 int idx = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3104 CRMATRIX_ASSIGN_ELEM (m, cm, 0, i, cop_out [idx],
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3105 c_cop_out [idx], real_type);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3106 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3107
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3108 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3109 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3110 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3111 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3112 CRMATRIX (m, cm, index_nr, index_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3113
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3114 for (int j = 0; j < index_nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3115 for (int i = 0; i < index_nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3116 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3117 double tmp = *cop_out_index++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3118 int idx = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3119 CRMATRIX_ASSIGN_ELEM (m, cm, i, j, cop_out [idx],
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3120 c_cop_out [idx], real_type);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3121 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3122
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3123 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3124 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3125 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3126 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3127 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3128 if (index_nr == 0 || index_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3129 ::error ("empty matrix invalid as index");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3130 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3131 ::error ("invalid matrix index");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3132 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3133 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3134
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3135 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3136 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3137
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3138 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3139 TC_REP::do_vector_index (const tree_constant& i_arg) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3140 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3141 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3142
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3143 tree_constant tmp_i = i_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3144
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3145 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3146 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3147
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3148 TC_REP::constant_type itype = tmp_i.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3149
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3150 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3151 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3152
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3153 int len = MAX (nr, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3154
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3155 assert ((nr == 1 || nc == 1) && ! user_pref.do_fortran_indexing);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3156
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3157 int swap_indices = (nr == 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3158
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3159 switch (itype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3160 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3161 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3162 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3163 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3164 int i = tree_to_mat_idx (tmp_i.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3165 if (index_check (i, "") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3166 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3167 if (swap_indices)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3168 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3169 if (range_max_check (i, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3170 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3171 retval = do_matrix_index (0, i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3172 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3173 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3174 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3175 if (range_max_check (i, nr) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3176 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3177 retval = do_matrix_index (i, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3178 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3179 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3180 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3181
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3182 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3183 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3184 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3185 Matrix mi = tmp_i.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3186 if (mi.rows () == 0 || mi.columns () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3187 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3188 Matrix mtmp;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3189 retval = tree_constant (mtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3190 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3191 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3192 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3193 idx_vector iv (mi, user_pref.do_fortran_indexing, "", len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3194 if (! iv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3195 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3196
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3197 if (swap_indices)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3198 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3199 if (range_max_check (iv.max (), nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3200 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3201 retval = do_matrix_index (0, iv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3202 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3203 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3204 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3205 if (range_max_check (iv.max (), nr) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3206 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3207 retval = do_matrix_index (iv, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3208 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3209 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3210 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3211 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3212
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3213 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3214 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3215 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3216
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3217 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3218 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3219 Range ri = tmp_i.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3220 if (len == 2 && is_zero_one (ri))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3221 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3222 if (swap_indices)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3223 retval = do_matrix_index (0, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3224 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3225 retval = do_matrix_index (1, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3226 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3227 else if (len == 2 && is_one_zero (ri))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3228 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3229 retval = do_matrix_index (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3230 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3231 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3232 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3233 if (index_check (ri, "") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3234 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3235 if (swap_indices)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3236 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3237 if (range_max_check (tree_to_mat_idx (ri.max ()), nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3238 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3239 retval = do_matrix_index (0, ri);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3240 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3241 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3242 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3243 if (range_max_check (tree_to_mat_idx (ri.max ()), nr) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3244 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3245 retval = do_matrix_index (ri, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3246 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3247 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3248 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3249 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3250
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3251 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3252 if (swap_indices)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3253 retval = do_matrix_index (0, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3254 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3255 retval = do_matrix_index (magic_colon, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3256 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3257
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3258 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3259 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3260 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3261 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3262
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3263 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3264 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3265
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3266 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3267 TC_REP::do_matrix_index (int i, const tree_constant& j_arg) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3268 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3269 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3270
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3271 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3272
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3273 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3274 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3275
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3276 TC_REP::constant_type jtype = tmp_j.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3277
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3278 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3279 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3280
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3281 switch (jtype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3282 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3283 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3284 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3285 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3286 if (index_check (i, "row") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3287 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3288 int j = tree_to_mat_idx (tmp_j.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3289 if (index_check (j, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3290 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3291 if (range_max_check (i, j, nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3292 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3293 retval = do_matrix_index (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3294 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3295 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3296
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3297 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3298 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3299 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3300 if (index_check (i, "row") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3301 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3302 Matrix mj = tmp_j.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3303 idx_vector jv (mj, user_pref.do_fortran_indexing, "column", nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3304 if (! jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3305 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3306
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3307 if (jv.length () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3308 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3309 Matrix mtmp;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3310 retval = tree_constant (mtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3311 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3312 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3313 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3314 if (range_max_check (i, jv.max (), nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3315 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3316 retval = do_matrix_index (i, jv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3317 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3318 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3319 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3320
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3321 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3322 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3323 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3324
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3325 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3326 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3327 if (index_check (i, "row") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3328 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3329 Range rj = tmp_j.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3330 if (nc == 2 && is_zero_one (rj))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3331 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3332 retval = do_matrix_index (i, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3333 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3334 else if (nc == 2 && is_one_zero (rj))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3335 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3336 retval = do_matrix_index (i, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3337 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3338 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3339 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3340 if (index_check (rj, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3341 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3342 if (range_max_check (i, tree_to_mat_idx (rj.max ()), nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3343 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3344 retval = do_matrix_index (i, rj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3345 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3346 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3347 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3348
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3349 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3350 if (i == -1 && nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3351 return Matrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3352 if (index_check (i, "row") < 0
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3353 || range_max_check (i, 0, nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3354 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3355 retval = do_matrix_index (i, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3356 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3357
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3358 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3359 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3360 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3361 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3362
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3363 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3364 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3365
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3366 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3367 TC_REP::do_matrix_index (const idx_vector& iv,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3368 const tree_constant& j_arg) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3369 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3370 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3371
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3372 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3373
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3374 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3375 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3376
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3377 TC_REP::constant_type jtype = tmp_j.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3378
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3379 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3380 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3381
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3382 switch (jtype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3383 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3384 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3385 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3386 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3387 int j = tree_to_mat_idx (tmp_j.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3388 if (index_check (j, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3389 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3390 if (range_max_check (iv.max (), j, nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3391 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3392 retval = do_matrix_index (iv, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3393 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3394 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3395
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3396 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3397 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3398 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3399 Matrix mj = tmp_j.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3400 idx_vector jv (mj, user_pref.do_fortran_indexing, "column", nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3401 if (! jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3402 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3403
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3404 if (jv.length () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3405 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3406 Matrix mtmp;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3407 retval = tree_constant (mtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3408 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3409 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3410 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3411 if (range_max_check (iv.max (), jv.max (), nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3412 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3413 retval = do_matrix_index (iv, jv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3414 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3415 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3416 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3417
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3418 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3419 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3420 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3421
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3422 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3423 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3424 Range rj = tmp_j.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3425 if (nc == 2 && is_zero_one (rj))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3426 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3427 retval = do_matrix_index (iv, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3428 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3429 else if (nc == 2 && is_one_zero (rj))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3430 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3431 retval = do_matrix_index (iv, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3432 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3433 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3434 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3435 if (index_check (rj, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3436 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3437 if (range_max_check (iv.max (), tree_to_mat_idx (rj.max ()),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3438 nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3439 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3440 retval = do_matrix_index (iv, rj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3441 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3442 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3443 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3444
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3445 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3446 if (range_max_check (iv.max (), 0, nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3447 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3448 retval = do_matrix_index (iv, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3449 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3450
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3451 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3452 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3453 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3454 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3455
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3456 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3457 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3458
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3459 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3460 TC_REP::do_matrix_index (const Range& ri,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3461 const tree_constant& j_arg) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3462 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3463 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3464
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3465 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3466
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3467 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3468 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3469
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3470 TC_REP::constant_type jtype = tmp_j.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3471
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3472 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3473 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3474
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3475 switch (jtype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3476 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3477 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3478 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3479 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3480 int j = tree_to_mat_idx (tmp_j.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3481 if (index_check (j, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3482 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3483 if (range_max_check (tree_to_mat_idx (ri.max ()), j, nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3484 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3485 retval = do_matrix_index (ri, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3486 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3487 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3488
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3489 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3490 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3491 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3492 Matrix mj = tmp_j.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3493 idx_vector jv (mj, user_pref.do_fortran_indexing, "column", nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3494 if (! jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3495 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3496
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3497 if (jv.length () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3498 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3499 Matrix mtmp;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3500 retval = tree_constant (mtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3501 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3502 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3503 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3504 if (range_max_check (tree_to_mat_idx (ri.max ()),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3505 jv.max (), nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3506 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3507 retval = do_matrix_index (ri, jv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3508 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3509 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3510 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3511
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3512 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3513 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3514 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3515
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3516 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3517 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3518 Range rj = tmp_j.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3519 if (nc == 2 && is_zero_one (rj))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3520 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3521 retval = do_matrix_index (ri, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3522 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3523 else if (nc == 2 && is_one_zero (rj))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3524 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3525 retval = do_matrix_index (ri, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3526 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3527 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3528 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3529 if (index_check (rj, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3530 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3531 if (range_max_check (tree_to_mat_idx (ri.max ()),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3532 tree_to_mat_idx (rj.max ()), nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3533 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3534 retval = do_matrix_index (ri, rj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3535 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3536 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3537 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3538
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3539 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3540 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3541 if (index_check (ri, "row") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3542 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3543 if (range_max_check (tree_to_mat_idx (ri.max ()), 0, nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3544 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3545 retval = do_matrix_index (ri, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3546 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3547 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3548
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3549 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3550 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3551 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3552 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3553
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3554 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3555 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3556
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3557 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3558 TC_REP::do_matrix_index (TC_REP::constant_type mci,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3559 const tree_constant& j_arg) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3560 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3561 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3562
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3563 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3564
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3565 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3566 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3567
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3568 TC_REP::constant_type jtype = tmp_j.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3569
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3570 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3571 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3572
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3573 switch (jtype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3574 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3575 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3576 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3577 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3578 int j = tree_to_mat_idx (tmp_j.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3579 if (j == -1 && nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3580 return Matrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3581 if (index_check (j, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3582 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3583 if (range_max_check (0, j, nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3584 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3585 retval = do_matrix_index (magic_colon, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3586 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3587 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3588
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3589 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3590 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3591 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3592 Matrix mj = tmp_j.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3593 idx_vector jv (mj, user_pref.do_fortran_indexing, "column", nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3594 if (! jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3595 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3596
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3597 if (jv.length () == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3598 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3599 Matrix mtmp;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3600 retval = tree_constant (mtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3601 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3602 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3603 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3604 if (range_max_check (0, jv.max (), nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3605 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3606 retval = do_matrix_index (magic_colon, jv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3607 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3608 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3609 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3610
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3611 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3612 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3613 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3614
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3615 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3616 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3617 Range rj = tmp_j.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3618 if (nc == 2 && is_zero_one (rj))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3619 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3620 retval = do_matrix_index (magic_colon, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3621 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3622 else if (nc == 2 && is_one_zero (rj))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3623 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3624 retval = do_matrix_index (magic_colon, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3625 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3626 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3627 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3628 if (index_check (rj, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3629 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3630 if (range_max_check (0, tree_to_mat_idx (rj.max ()), nr, nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3631 return tree_constant ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3632 retval = do_matrix_index (magic_colon, rj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3633 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3634 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3635 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3636
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3637 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3638 retval = do_matrix_index (magic_colon, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3639 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3640
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3641 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3642 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3643 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3644 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3645
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3646 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3647 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3648
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3649 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3650 TC_REP::do_matrix_index (int i, int j) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3651 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3652 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3653
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3654 if (type_tag == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3655 retval = tree_constant (matrix->elem (i, j));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3656 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3657 retval = tree_constant (complex_matrix->elem (i, j));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3658
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3659 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3660 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3661
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3662 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3663 TC_REP::do_matrix_index (int i, const idx_vector& jv) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3664 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3665 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3666
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3667 int jlen = jv.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3668
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3669 CRMATRIX (m, cm, 1, jlen);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3670
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3671 for (int j = 0; j < jlen; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3672 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3673 int col = jv.elem (j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3674 CRMATRIX_ASSIGN_REP_ELEM (m, cm, 0, j, i, col);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3675 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3676 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3677
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3678 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3679 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3680
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3681 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3682 TC_REP::do_matrix_index (int i, const Range& rj) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3683 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3684 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3685
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3686 int jlen = rj.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3687
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3688 CRMATRIX (m, cm, 1, jlen);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3689
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3690 double b = rj.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3691 double increment = rj.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3692 for (int j = 0; j < jlen; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3693 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3694 double tmp = b + j * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3695 int col = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3696 CRMATRIX_ASSIGN_REP_ELEM (m, cm, 0, j, i, col);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3697 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3698
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3699 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3700
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3701 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3702 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3703
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3704 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3705 TC_REP::do_matrix_index (int i, TC_REP::constant_type mcj) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3706 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3707 assert (mcj == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3708
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3709 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3710
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3711 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3712
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3713 CRMATRIX (m, cm, 1, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3714
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3715 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3716 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3717 CRMATRIX_ASSIGN_REP_ELEM (m, cm, 0, j, i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3718 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3719
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3720 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3721
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3722 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3723 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3724
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3725 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3726 TC_REP::do_matrix_index (const idx_vector& iv, int j) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3727 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3728 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3729
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3730 int ilen = iv.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3731
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3732 CRMATRIX (m, cm, ilen, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3733
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3734 for (int i = 0; i < ilen; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3735 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3736 int row = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3737 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, 0, row, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3738 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3739
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3740 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3741
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3742 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3743 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3744
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3745 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3746 TC_REP::do_matrix_index (const idx_vector& iv, const idx_vector& jv) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3747 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3748 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3749
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3750 int ilen = iv.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3751 int jlen = jv.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3752
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3753 CRMATRIX (m, cm, ilen, jlen);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3754
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3755 for (int i = 0; i < ilen; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3756 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3757 int row = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3758 for (int j = 0; j < jlen; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3759 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3760 int col = jv.elem (j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3761 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3762 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3763 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3764
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3765 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3766
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3767 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3768 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3769
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3770 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3771 TC_REP::do_matrix_index (const idx_vector& iv, const Range& rj) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3772 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3773 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3774
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3775 int ilen = iv.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3776 int jlen = rj.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3777
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3778 CRMATRIX (m, cm, ilen, jlen);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3779
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3780 double b = rj.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3781 double increment = rj.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3782
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3783 for (int i = 0; i < ilen; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3784 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3785 int row = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3786 for (int j = 0; j < jlen; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3787 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3788 double tmp = b + j * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3789 int col = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3790 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3791 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3792 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3793
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3794 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3795
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3796 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3797 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3798
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3799 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3800 TC_REP::do_matrix_index (const idx_vector& iv,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3801 TC_REP::constant_type mcj) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3802 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3803 assert (mcj == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3804
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3805 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3806
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3807 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3808 int ilen = iv.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3809
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3810 CRMATRIX (m, cm, ilen, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3811
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3812 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3813 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3814 for (int i = 0; i < ilen; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3815 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3816 int row = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3817 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3818 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3819 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3820
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3821 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3822
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3823 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3824 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3825
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3826 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3827 TC_REP::do_matrix_index (const Range& ri, int j) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3828 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3829 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3830
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3831 int ilen = ri.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3832
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3833 CRMATRIX (m, cm, ilen, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3834
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3835 double b = ri.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3836 double increment = ri.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3837 for (int i = 0; i < ilen; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3838 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3839 double tmp = b + i * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3840 int row = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3841 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, 0, row, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3842 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3843
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3844 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3845
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3846 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3847 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3848
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3849 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3850 TC_REP::do_matrix_index (const Range& ri,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3851 const idx_vector& jv) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3852 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3853 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3854
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3855 int ilen = ri.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3856 int jlen = jv.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3857
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3858 CRMATRIX (m, cm, ilen, jlen);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3859
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3860 double b = ri.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3861 double increment = ri.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3862 for (int i = 0; i < ilen; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3863 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3864 double tmp = b + i * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3865 int row = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3866 for (int j = 0; j < jlen; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3867 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3868 int col = jv.elem (j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3869 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3870 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3871 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3872
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3873 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3874
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3875 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3876 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3877
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3878 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3879 TC_REP::do_matrix_index (const Range& ri, const Range& rj) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3880 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3881 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3882
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3883 int ilen = ri.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3884 int jlen = rj.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3885
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3886 CRMATRIX (m, cm, ilen, jlen);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3887
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3888 double ib = ri.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3889 double iinc = ri.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3890 double jb = rj.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3891 double jinc = rj.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3892
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3893 for (int i = 0; i < ilen; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3894 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3895 double itmp = ib + i * iinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3896 int row = tree_to_mat_idx (itmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3897 for (int j = 0; j < jlen; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3898 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3899 double jtmp = jb + j * jinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3900 int col = tree_to_mat_idx (jtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3901
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3902 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3903 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3904 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3905
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3906 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3907
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3908 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3909 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3910
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3911 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3912 TC_REP::do_matrix_index (const Range& ri, TC_REP::constant_type mcj) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3913 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3914 assert (mcj == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3915
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3916 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3917
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3918 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3919
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3920 int ilen = ri.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3921
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3922 CRMATRIX (m, cm, ilen, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3923
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3924 double ib = ri.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3925 double iinc = ri.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3926
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3927 for (int i = 0; i < ilen; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3928 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3929 double itmp = ib + i * iinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3930 int row = tree_to_mat_idx (itmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3931 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3932 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3933 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3934 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3935 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3936
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3937 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3938
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3939 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3940 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3941
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3942 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3943 TC_REP::do_matrix_index (TC_REP::constant_type mci, int j) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3944 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3945 assert (mci == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3946
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3947 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3948
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3949 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3950
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3951 CRMATRIX (m, cm, nr, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3952
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3953 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3954 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3955 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, 0, i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3956 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3957
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3958 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3959
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3960 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3961 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3962
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3963 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3964 TC_REP::do_matrix_index (TC_REP::constant_type mci,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3965 const idx_vector& jv) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3966 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3967 assert (mci == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3968
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3969 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3970
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3971 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3972 int jlen = jv.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3973
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3974 CRMATRIX (m, cm, nr, jlen);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3975
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3976 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3977 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3978 for (int j = 0; j < jlen; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3979 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3980 int col = jv.elem (j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3981 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, i, col);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3982 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3983 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3984
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3985 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3986
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3987 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3988 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3989
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3990 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3991 TC_REP::do_matrix_index (TC_REP::constant_type mci, const Range& rj) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3992 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3993 assert (mci == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3994
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3995 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3996
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3997 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3998 int jlen = rj.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
3999
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4000 CRMATRIX (m, cm, nr, jlen);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4001
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4002 double jb = rj.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4003 double jinc = rj.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4004
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4005 for (int j = 0; j < jlen; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4006 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4007 double jtmp = jb + j * jinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4008 int col = tree_to_mat_idx (jtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4009 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4010 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4011 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, i, col);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4012 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4013 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4014
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4015 ASSIGN_CRMATRIX_TO (retval, m, cm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4016
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4017 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4018 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4019
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4020 tree_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4021 TC_REP::do_matrix_index (TC_REP::constant_type mci,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4022 TC_REP::constant_type mcj) const
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4023 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4024 tree_constant retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4025
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4026 assert (mci == magic_colon && mcj == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4027
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4028 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4029 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4030 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4031 retval = *complex_scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4032 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4033
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4034 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4035 retval = scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4036 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4037
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4038 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4039 retval = *complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4040 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4041
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4042 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4043 retval = *matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4044 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4045
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4046 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4047 retval = *range;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4048 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4049
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4050 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4051 retval = string;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4052 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4053
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4054 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4055 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4056 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4057 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4058 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4059
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4060 return retval;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4061 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4062
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4063 // -------------------------------------------------------------------
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4064 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4065 // Assignment operations for the tree-constant representation class.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4066 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4067 // Leave the commented #includes below to make it easy to split this
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4068 // out again, should we want to do that.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4069 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4070 // -------------------------------------------------------------------
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4071
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4072 // #ifdef HAVE_CONFIG_H
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4073 // #include <config.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4074 // #endif
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4075
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4076 // #include <ctype.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4077 // #include <string.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4078 // #include <fstream.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4079 // #include <iostream.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4080 // #include <strstream.h>
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4081
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4082 // #include "mx-base.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4083 // #include "Range.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4084
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4085 // #include "arith-ops.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4086 // #include "variables.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4087 // #include "sysdep.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4088 // #include "error.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4089 // #include "gripes.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4090 // #include "user-prefs.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4091 // #include "utils.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4092 // #include "pager.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4093 // #include "pr-output.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4094 // #include "tree-const.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4095 // #include "idx-vector.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4096 // #include "oct-map.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4097
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4098 // #include "tc-inlines.h"
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4099
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4100 // Top-level tree-constant function that handles assignments. Only
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4101 // decide if the left-hand side is currently a scalar or a matrix and
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4102 // hand off to other functions to do the real work.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4103
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4104 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4105 TC_REP::assign (tree_constant& rhs, const Octave_object& args)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4106 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4107 tree_constant rhs_tmp = rhs.make_numeric ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4108
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4109 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4110 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4111
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4112 // This is easier than actually handling assignments to strings.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4113 // An assignment to a range will normally require a conversion to a
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4114 // vector since it will normally destroy the equally-spaced property
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4115 // of the range elements.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4116
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4117 if (is_defined () && ! is_numeric_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4118 force_numeric ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4119
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4120 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4121 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4122
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4123 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4124 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4125 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4126 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4127 case unknown_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4128 do_scalar_assignment (rhs_tmp, args);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4129 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4130
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4131 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4132 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4133 do_matrix_assignment (rhs_tmp, args);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4134 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4135
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4136 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4137 ::error ("invalid assignment to %s", type_as_string ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4138 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4139 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4140 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4141
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4142 // Assignments to scalars. If resize_on_range_error is true,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4143 // this can convert the left-hand side to a matrix.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4144
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4145 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4146 TC_REP::do_scalar_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4147 const Octave_object& args)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4148 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4149 assert (type_tag == unknown_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4150 || type_tag == scalar_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4151 || type_tag == complex_scalar_constant);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4152
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4153 int nargin = args.length ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4154
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4155 if (rhs.is_zero_by_zero ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4156 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4157 if (valid_scalar_indices (args))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4158 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4159 if (type_tag == complex_scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4160 delete complex_scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4161
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4162 matrix = new Matrix (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4163 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4164 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4165 else if (! valid_zero_index (args))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4166 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4167 ::error ("invalid assigment of empty matrix to scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4168 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4169 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4170 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4171 else if (rhs.is_scalar_type () && valid_scalar_indices (args))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4172 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4173 if (type_tag == unknown_constant || type_tag == scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4174 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4175 if (rhs.const_type () == scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4176 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4177 scalar = rhs.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4178 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4179 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4180 else if (rhs.const_type () == complex_scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4181 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4182 complex_scalar = new Complex (rhs.complex_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4183 type_tag = complex_scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4184 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4185 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4186 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4187 ::error ("invalid assignment to scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4188 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4189 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4190 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4191 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4192 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4193 if (rhs.const_type () == scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4194 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4195 delete complex_scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4196 scalar = rhs.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4197 type_tag = scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4198 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4199 else if (rhs.const_type () == complex_scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4200 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4201 *complex_scalar = rhs.complex_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4202 type_tag = complex_scalar_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4203 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4204 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4205 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4206 ::error ("invalid assignment to scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4207 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4208 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4209 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4210 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4211 else if (user_pref.resize_on_range_error)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4212 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4213 TC_REP::constant_type old_type_tag = type_tag;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4214
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4215 if (type_tag == complex_scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4216 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4217 Complex *old_complex = complex_scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4218 complex_matrix = new ComplexMatrix (1, 1, *complex_scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4219 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4220 delete old_complex;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4221 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4222 else if (type_tag == scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4223 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4224 matrix = new Matrix (1, 1, scalar);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4225 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4226 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4227
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4228 // If there is an error, the call to do_matrix_assignment should not
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4229 // destroy the current value.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4230 // TC_REP::eval(int) will take
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4231 // care of converting single element matrices back to scalars.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4232
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4233 do_matrix_assignment (rhs, args);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4234
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4235 // I don't think there's any other way to revert back to unknown
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4236 // constant types, so here it is.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4237
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4238 if (old_type_tag == unknown_constant && error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4239 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4240 if (type_tag == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4241 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4242 else if (type_tag == complex_matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4243 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4244
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4245 type_tag = unknown_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4246 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4247 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4248 else if (nargin > 2 || nargin < 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4249 ::error ("invalid index expression for scalar type");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4250 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4251 ::error ("index invalid or out of range for scalar type");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4252 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4253
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4254 // Assignments to matrices (and vectors).
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4255 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4256 // For compatibility with Matlab, we allow assignment of an empty
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4257 // matrix to an expression with empty indices to do nothing.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4258
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4259 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4260 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4261 const Octave_object& args)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4262 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4263 assert (type_tag == unknown_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4264 || type_tag == matrix_constant
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4265 || type_tag == complex_matrix_constant);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4266
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4267 if (type_tag == matrix_constant && rhs.is_complex_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4268 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4269 Matrix *old_matrix = matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4270 complex_matrix = new ComplexMatrix (*matrix);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4271 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4272 delete old_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4273 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4274 else if (type_tag == unknown_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4275 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4276 if (rhs.is_complex_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4277 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4278 complex_matrix = new ComplexMatrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4279 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4280 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4281 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4282 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4283 matrix = new Matrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4284 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4285 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4286 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4287
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4288 int nargin = args.length ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4289
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4290 // The do_matrix_assignment functions can't handle empty matrices, so
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4291 // don't let any pass through here.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4292 switch (nargin)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4293 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4294 case 1:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4295 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4296 tree_constant arg = args(0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4297
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4298 if (arg.is_undefined ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4299 ::error ("matrix index is undefined");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4300 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4301 do_matrix_assignment (rhs, arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4302 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4303 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4304
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4305 case 2:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4306 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4307 tree_constant arg_a = args(0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4308 tree_constant arg_b = args(1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4309
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4310 if (arg_a.is_undefined ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4311 ::error ("first matrix index is undefined");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4312 else if (arg_b.is_undefined ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4313 ::error ("second matrix index is undefined");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4314 else if (arg_a.is_empty () || arg_b.is_empty ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4315 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4316 if (! rhs.is_empty ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4317 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4318 ::error ("in assignment expression, a matrix index is empty");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4319 ::error ("but the right hand side is not an empty matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4320 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4321 // XXX FIXME XXX -- to really be correct here, we should probably
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4322 // check to see if the assignment conforms, but that seems like more
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4323 // work than it's worth right now...
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4324 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4325 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4326 do_matrix_assignment (rhs, arg_a, arg_b);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4327 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4328 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4329
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4330 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4331 if (nargin == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4332 ::error ("matrix indices expected, but none provided");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4333 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4334 ::error ("too many indices for matrix expression");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4335 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4336 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4337 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4338
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4339 // Matrix assignments indexed by a single value.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4340
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4341 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4342 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4343 const tree_constant& i_arg)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4344 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4345 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4346 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4347
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4348 if (user_pref.do_fortran_indexing || nr <= 1 || nc <= 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4349 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4350 if (i_arg.is_empty ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4351 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4352 if (! rhs.is_empty ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4353 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4354 ::error ("in assignment expression, matrix index is empty but");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4355 ::error ("right hand side is not an empty matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4356 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4357 // XXX FIXME XXX -- to really be correct here, we should probably
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4358 // check to see if the assignment conforms, but that seems like more
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4359 // work than it's worth right now...
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4360
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4361 // The assignment functions can't handle empty matrices, so don't let
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4362 // any pass through here.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4363 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4364 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4365
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4366 // We can't handle the case of assigning to a vector first, since even
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4367 // then, the two operations are not equivalent. For example, the
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4368 // expression V(:) = M is handled differently depending on whether the
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4369 // user specified do_fortran_indexing = "true".
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4370
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4371 if (user_pref.do_fortran_indexing)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4372 fortran_style_matrix_assignment (rhs, i_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4373 else if (nr <= 1 || nc <= 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4374 vector_assignment (rhs, i_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4375 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4376 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4377 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4378 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4379 ::error ("single index only valid for row or column vector");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4380 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4381
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4382 // Fortran-style assignments. Matrices are assumed to be stored in
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4383 // column-major order and it is ok to use a single index for
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4384 // multi-dimensional matrices.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4385
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4386 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4387 TC_REP::fortran_style_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4388 const tree_constant& i_arg)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4389 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4390 tree_constant tmp_i = i_arg.make_numeric_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4391
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4392 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4393 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4394
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4395 TC_REP::constant_type itype = tmp_i.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4396
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4397 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4398 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4399
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4400 int rhs_nr = rhs.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4401 int rhs_nc = rhs.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4402
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4403 switch (itype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4404 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4405 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4406 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4407 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4408 double dval = tmp_i.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4409
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4410 if (xisnan (dval))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4411 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4412 error ("NaN is invalid as a matrix index");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4413 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4414 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4415
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4416 int i = NINT (dval);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4417 int idx = i - 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4418
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4419 if (rhs_nr == 0 && rhs_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4420 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4421 int len = nr * nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4422
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4423 if (idx < len && len > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4424 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4425 convert_to_row_or_column_vector ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4426
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4427 nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4428 nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4429
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4430 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4431 delete_column (idx);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4432 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4433 delete_row (idx);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4434 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4435 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4436 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4437 else if (idx < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4438 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4439 error ("invalid index = %d", idx+1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4440 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4441
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4442 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4443 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4444
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4445 if (index_check (idx, "") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4446 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4447
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4448 if (nr <= 1 || nc <= 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4449 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4450 maybe_resize (idx);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4451 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4452 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4453 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4454 else if (range_max_check (idx, nr * nc) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4455 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4456
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4457 nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4458 nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4459
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4460 if (! indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4461 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4462 ::error ("for A(int) = X: X must be a scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4463 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4464 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4465 int ii = fortran_row (i, nr) - 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4466 int jj = fortran_column (i, nr) - 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4467 do_matrix_assignment (rhs, ii, jj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4468 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4469 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4470
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4471 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4472 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4473 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4474 Matrix mi = tmp_i.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4475 int len = nr * nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4476 idx_vector ii (mi, 1, "", len); // Always do fortran indexing here...
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4477 if (! ii)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4478 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4479
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4480 if (rhs_nr == 0 && rhs_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4481 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4482 ii.sort_uniq ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4483 int num_to_delete = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4484 for (int i = 0; i < ii.length (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4485 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4486 if (ii.elem (i) < len)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4487 num_to_delete++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4488 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4489 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4490 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4491
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4492 if (num_to_delete > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4493 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4494 if (num_to_delete != ii.length ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4495 ii.shorten (num_to_delete);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4496
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4497 convert_to_row_or_column_vector ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4498
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4499 nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4500 nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4501
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4502 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4503 delete_columns (ii);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4504 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4505 delete_rows (ii);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4506 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4507 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4508 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4509 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4510 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4511
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4512 if (nr <= 1 || nc <= 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4513 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4514 maybe_resize (ii.max ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4515 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4516 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4517 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4518 else if (range_max_check (ii.max (), len) < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4519 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4520
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4521 int ilen = ii.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4522
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4523 if (ilen != rhs_nr * rhs_nc)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4524 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4525 ::error ("A(matrix) = X: X and matrix must have the same number");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4526 ::error ("of elements");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4527 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4528 else if (ilen == 1 && rhs.is_scalar_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4529 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4530 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4531 int idx = ii.elem (0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4532 int ii = fortran_row (idx + 1, nr) - 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4533 int jj = fortran_column (idx + 1, nr) - 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4534
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4535 if (rhs.const_type () == scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4536 matrix->elem (ii, jj) = rhs.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4537 else if (rhs.const_type () == complex_scalar_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4538 complex_matrix->elem (ii, jj) = rhs.complex_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4539 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4540 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4541 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4542 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4543 fortran_style_matrix_assignment (rhs, ii);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4544 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4545 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4546
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4547 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4548 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4549 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4550
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4551 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4552 gripe_range_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4553 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4554
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4555 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4556 // a(:) = [] is equivalent to a(:,:) = [].
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4557 if (rhs_nr == 0 && rhs_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4558 do_matrix_assignment (rhs, magic_colon, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4559 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4560 fortran_style_matrix_assignment (rhs, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4561 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4562
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4563 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4564 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4565 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4566 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4567 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4568
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4569 // Fortran-style assignment for vector index.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4570
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4571 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4572 TC_REP::fortran_style_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4573 idx_vector& i)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4574 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4575 assert (rhs.is_matrix_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4576
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4577 int ilen = i.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4578
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4579 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4580
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4581 int len = rhs_nr * rhs_nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4582
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4583 if (len == ilen)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4584 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4585 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4586 if (rhs.const_type () == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4587 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4588 double *cop_out = rhs_m.fortran_vec ();
1320
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4589
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4590 if (type_tag == matrix_constant)
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4591 {
1320
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4592 for (int k = 0; k < len; k++)
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4593 {
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4594 int ii = fortran_row (i.elem (k) + 1, nr) - 1;
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4595 int jj = fortran_column (i.elem (k) + 1, nr) - 1;
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4596
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4597 matrix->elem (ii, jj) = *cop_out++;
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4598 }
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4599 }
1320
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4600 else if (type_tag == complex_matrix_constant)
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4601 {
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4602 for (int k = 0; k < len; k++)
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4603 {
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4604 int ii = fortran_row (i.elem (k) + 1, nr) - 1;
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4605 int jj = fortran_column (i.elem (k) + 1, nr) - 1;
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4606
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4607 complex_matrix->elem (ii, jj) = *cop_out++;
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4608 }
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4609 }
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4610 else
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4611 panic_impossible ();
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4612 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4613 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4614 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4615 Complex *cop_out = rhs_cm.fortran_vec ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4616 for (int k = 0; k < len; k++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4617 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4618 int ii = fortran_row (i.elem (k) + 1, nr) - 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4619 int jj = fortran_column (i.elem (k) + 1, nr) - 1;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4620
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4621 complex_matrix->elem (ii, jj) = *cop_out++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4622 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4623 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4624 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4625 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4626 ::error ("number of rows and columns must match for indexed assignment");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4627 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4628
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4629 // Fortran-style assignment for colon index.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4630
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4631 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4632 TC_REP::fortran_style_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4633 TC_REP::constant_type mci)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4634 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4635 assert (rhs.is_matrix_type () && mci == TC_REP::magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4636
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4637 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4638 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4639
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4640 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4641
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4642 int rhs_size = rhs_nr * rhs_nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4643 if (rhs_size == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4644 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4645 if (rhs.const_type () == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4646 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4647 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4648 matrix = new Matrix (0, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4649 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4650 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4651 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4652 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4653 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4654 else if (nr*nc != rhs_size)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4655 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4656 ::error ("A(:) = X: X and A must have the same number of elements");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4657 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4658 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4659
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4660 if (rhs.const_type () == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4661 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4662 double *cop_out = rhs_m.fortran_vec ();
1320
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4663 if (type_tag == matrix_constant)
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4664 {
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4665 for (int j = 0; j < nc; j++)
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4666 for (int i = 0; i < nr; i++)
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4667 matrix->elem (i, j) = *cop_out++;
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4668 }
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4669 else if (type_tag == complex_matrix_constant)
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4670 {
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4671 for (int j = 0; j < nc; j++)
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4672 for (int i = 0; i < nr; i++)
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4673 complex_matrix->elem (i, j) = *cop_out++;
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4674 }
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4675 else
c9aecc02c6d4 [project @ 1995-08-22 04:10:01 by jwe]
jwe
parents: 1315
diff changeset
4676 panic_impossible ();
1299
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4677 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4678 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4679 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4680 Complex *cop_out = rhs_cm.fortran_vec ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4681 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4682 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4683 complex_matrix->elem (i, j) = *cop_out++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4684 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4685 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4686
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4687 // Assignments to vectors. Hand off to other functions once we know
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4688 // what kind of index we have. For a colon, it is the same as
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4689 // assignment to a matrix indexed by two colons.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4690
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4691 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4692 TC_REP::vector_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4693 const tree_constant& i_arg)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4694 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4695 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4696 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4697
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4698 assert ((nr <= 1 || nc <= 1) && ! user_pref.do_fortran_indexing);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4699
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4700 tree_constant tmp_i = i_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4701
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4702 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4703 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4704
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4705 TC_REP::constant_type itype = tmp_i.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4706
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4707 switch (itype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4708 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4709 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4710 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4711 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4712 int i = tree_to_mat_idx (tmp_i.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4713 if (index_check (i, "") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4714 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4715 do_vector_assign (rhs, i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4716 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4717 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4718
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4719 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4720 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4721 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4722 Matrix mi = tmp_i.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4723 int len = nr * nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4724 idx_vector iv (mi, user_pref.do_fortran_indexing, "", len);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4725 if (! iv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4726 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4727
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4728 do_vector_assign (rhs, iv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4729 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4730 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4731
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4732 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4733 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4734 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4735
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4736 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4737 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4738 Range ri = tmp_i.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4739 int len = nr * nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4740 if (len == 2 && is_zero_one (ri))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4741 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4742 do_vector_assign (rhs, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4743 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4744 else if (len == 2 && is_one_zero (ri))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4745 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4746 do_vector_assign (rhs, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4747 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4748 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4749 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4750 if (index_check (ri, "") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4751 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4752 do_vector_assign (rhs, ri);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4753 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4754 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4755 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4756
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4757 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4758 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4759 int rhs_nr = rhs.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4760 int rhs_nc = rhs.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4761
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4762 if (! indexed_assign_conforms (nr, nc, rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4763 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4764 ::error ("A(:) = X: X and A must have the same dimensions");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4765 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4766 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4767 do_matrix_assignment (rhs, magic_colon, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4768 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4769 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4770
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4771 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4772 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4773 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4774 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4775 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4776
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4777 // Check whether an indexed assignment to a vector is valid.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4778
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4779 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4780 TC_REP::check_vector_assign (int rhs_nr, int rhs_nc, int ilen, const char *rm)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4781 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4782 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4783 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4784
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4785 if ((nr == 1 && nc == 1) || nr == 0 || nc == 0) // No orientation.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4786 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4787 if (! (ilen == rhs_nr || ilen == rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4788 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4789 ::error ("A(%s) = X: X and %s must have the same number of elements",
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4790 rm, rm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4791 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4792 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4793 else if (nr == 1) // Preserve current row orientation.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4794 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4795 if (! (rhs_nr == 1 && rhs_nc == ilen))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4796 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4797 ::error ("A(%s) = X: where A is a row vector, X must also be a", rm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4798 ::error ("row vector with the same number of elements as %s", rm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4799 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4800 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4801 else if (nc == 1) // Preserve current column orientation.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4802 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4803 if (! (rhs_nc == 1 && rhs_nr == ilen))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4804 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4805 ::error ("A(%s) = X: where A is a column vector, X must also be", rm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4806 ::error ("a column vector with the same number of elements as %s", rm);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4807 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4808 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4809 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4810 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4811 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4812
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4813 // Assignment to a vector with an integer index.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4814
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4815 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4816 TC_REP::do_vector_assign (const tree_constant& rhs, int i)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4817 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4818 int rhs_nr = rhs.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4819 int rhs_nc = rhs.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4820
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4821 if (indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4822 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4823 maybe_resize (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4824 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4825 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4826
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4827 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4828 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4829
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4830 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4831 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4832 REP_ELEM_ASSIGN (0, i, rhs.double_value (), rhs.complex_value (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4833 rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4834 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4835 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4836 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4837 REP_ELEM_ASSIGN (i, 0, rhs.double_value (), rhs.complex_value (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4838 rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4839 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4840 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4841 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4842 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4843 else if (rhs_nr == 0 && rhs_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4844 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4845 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4846 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4847
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4848 int len = MAX (nr, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4849
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4850 if (i < 0 || i >= len || (nr == 0 && nc == 0))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4851 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4852 ::error ("A(int) = []: index out of range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4853 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4854 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4855
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4856 if (nr == 0 && nc > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4857 resize (0, nc - 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4858 else if (nc == 0 && nr > 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4859 resize (nr - 1, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4860 else if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4861 delete_column (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4862 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4863 delete_row (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4864 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4865 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4866 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4867 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4868 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4869 ::error ("for A(int) = X: X must be a scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4870 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4871 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4872 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4873
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4874 // Assignment to a vector with a vector index.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4875
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4876 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4877 TC_REP::do_vector_assign (const tree_constant& rhs, idx_vector& iv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4878 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4879 if (rhs.is_zero_by_zero ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4880 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4881 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4882 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4883
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4884 int len = MAX (nr, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4885
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4886 if (iv.max () >= len)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4887 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4888 ::error ("A(matrix) = []: index out of range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4889 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4890 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4891
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4892 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4893 delete_columns (iv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4894 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4895 delete_rows (iv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4896 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4897 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4898 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4899 else if (rhs.is_scalar_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4900 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4901 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4902 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4903
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4904 if (iv.capacity () == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4905 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4906 int idx = iv.elem (0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4907
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4908 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4909 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4910 REP_ELEM_ASSIGN (0, idx, rhs.double_value (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4911 rhs.complex_value (), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4912 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4913 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4914 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4915 REP_ELEM_ASSIGN (idx, 0, rhs.double_value (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4916 rhs.complex_value (), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4917 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4918 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4919 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4920 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4921 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4922 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4923 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4924 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4925 ::error ("A(matrix) = X: where A is a row vector, X must also be a");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4926 ::error ("row vector with the same number of elements as matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4927 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4928 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4929 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4930 ::error ("A(matrix) = X: where A is a column vector, X must also be a");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4931 ::error ("column vector with the same number of elements as matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4932 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4933 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4934 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4935 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4936 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4937 else if (rhs.is_matrix_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4938 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4939 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4940
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4941 int ilen = iv.capacity ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4942 check_vector_assign (rhs_nr, rhs_nc, ilen, "matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4943 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4944 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4945
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4946 force_orient f_orient = no_orient;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4947 if (rhs_nr == 1 && rhs_nc != 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4948 f_orient = row_orient;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4949 else if (rhs_nc == 1 && rhs_nr != 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4950 f_orient = column_orient;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4951
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4952 maybe_resize (iv.max (), f_orient);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4953 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4954 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4955
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4956 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4957 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4958
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4959 if (nr == 1 && rhs_nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4960 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4961 for (int i = 0; i < iv.capacity (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4962 REP_ELEM_ASSIGN (0, iv.elem (i), rhs_m.elem (0, i),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4963 rhs_cm.elem (0, i), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4964 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4965 else if (nc == 1 && rhs_nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4966 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4967 for (int i = 0; i < iv.capacity (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4968 REP_ELEM_ASSIGN (iv.elem (i), 0, rhs_m.elem (i, 0),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4969 rhs_cm.elem (i, 0), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4970 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4971 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4972 ::error ("A(vector) = X: X must be the same size as vector");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4973 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4974 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4975 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4976 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4977
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4978 // Assignment to a vector with a range index.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4979
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4980 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4981 TC_REP::do_vector_assign (const tree_constant& rhs, Range& ri)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4982 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4983 if (rhs.is_zero_by_zero ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4984 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4985 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4986 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4987
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4988 int len = MAX (nr, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4989
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4990 int b = tree_to_mat_idx (ri.min ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4991 int l = tree_to_mat_idx (ri.max ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4992 if (b < 0 || l >= len)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4993 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4994 ::error ("A(range) = []: index out of range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4995 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4996 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4997
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4998 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
4999 delete_columns (ri);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5000 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5001 delete_rows (ri);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5002 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5003 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5004 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5005 else if (rhs.is_scalar_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5006 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5007 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5008 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5009
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5010 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5011 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5012 ::error ("A(range) = X: where A is a row vector, X must also be a");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5013 ::error ("row vector with the same number of elements as range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5014 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5015 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5016 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5017 ::error ("A(range) = X: where A is a column vector, X must also be a");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5018 ::error ("column vector with the same number of elements as range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5019 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5020 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5021 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5022 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5023 else if (rhs.is_matrix_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5024 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5025 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5026
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5027 int ilen = ri.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5028 check_vector_assign (rhs_nr, rhs_nc, ilen, "range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5029 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5030 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5031
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5032 force_orient f_orient = no_orient;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5033 if (rhs_nr == 1 && rhs_nc != 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5034 f_orient = row_orient;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5035 else if (rhs_nc == 1 && rhs_nr != 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5036 f_orient = column_orient;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5037
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5038 maybe_resize (tree_to_mat_idx (ri.max ()), f_orient);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5039 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5040 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5041
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5042 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5043 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5044
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5045 double b = ri.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5046 double increment = ri.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5047
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5048 if (nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5049 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5050 for (int i = 0; i < ri.nelem (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5051 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5052 double tmp = b + i * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5053 int col = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5054 REP_ELEM_ASSIGN (0, col, rhs_m.elem (0, i), rhs_cm.elem (0, i),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5055 rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5056 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5057 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5058 else if (nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5059 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5060 for (int i = 0; i < ri.nelem (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5061 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5062 double tmp = b + i * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5063 int row = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5064 REP_ELEM_ASSIGN (row, 0, rhs_m.elem (i, 0), rhs_cm.elem (i, 0),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5065 rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5066 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5067 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5068 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5069 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5070 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5071 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5072 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5073 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5074
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5075 // Matrix assignment indexed by two values. This function determines
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5076 // the type of the first arugment, checks as much as possible, and
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5077 // then calls one of a set of functions to handle the specific cases:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5078 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5079 // M (integer, arg2) = RHS (MA1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5080 // M (vector, arg2) = RHS (MA2)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5081 // M (range, arg2) = RHS (MA3)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5082 // M (colon, arg2) = RHS (MA4)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5083 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5084 // Each of those functions determines the type of the second argument
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5085 // and calls another function to handle the real work of doing the
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5086 // assignment.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5087
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5088 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5089 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5090 const tree_constant& i_arg,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5091 const tree_constant& j_arg)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5092 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5093 tree_constant tmp_i = i_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5094
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5095 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5096 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5097
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5098 TC_REP::constant_type itype = tmp_i.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5099
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5100 switch (itype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5101 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5102 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5103 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5104 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5105 int i = tree_to_mat_idx (tmp_i.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5106 do_matrix_assignment (rhs, i, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5107 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5108 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5109
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5110 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5111 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5112 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5113 Matrix mi = tmp_i.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5114 idx_vector iv (mi, user_pref.do_fortran_indexing, "row", rows ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5115 if (! iv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5116 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5117
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5118 do_matrix_assignment (rhs, iv, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5119 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5120 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5121
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5122 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5123 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5124 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5125
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5126 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5127 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5128 Range ri = tmp_i.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5129 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5130 if (nr == 2 && is_zero_one (ri))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5131 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5132 do_matrix_assignment (rhs, 1, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5133 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5134 else if (nr == 2 && is_one_zero (ri))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5135 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5136 do_matrix_assignment (rhs, 0, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5137 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5138 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5139 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5140 if (index_check (ri, "row") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5141 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5142 do_matrix_assignment (rhs, ri, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5143 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5144 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5145 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5146
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5147 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5148 do_matrix_assignment (rhs, magic_colon, j_arg);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5149 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5150
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5151 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5152 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5153 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5154 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5155 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5156
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5157 /* MA1 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5158 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5159 TC_REP::do_matrix_assignment (const tree_constant& rhs, int i,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5160 const tree_constant& j_arg)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5161 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5162 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5163
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5164 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5165 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5166
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5167 TC_REP::constant_type jtype = tmp_j.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5168
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5169 int rhs_nr = rhs.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5170 int rhs_nc = rhs.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5171
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5172 switch (jtype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5173 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5174 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5175 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5176 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5177 if (index_check (i, "row") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5178 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5179 int j = tree_to_mat_idx (tmp_j.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5180 if (index_check (j, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5181 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5182 if (! indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5183 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5184 ::error ("A(int,int) = X, X must be a scalar");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5185 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5186 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5187 maybe_resize (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5188 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5189 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5190
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5191 do_matrix_assignment (rhs, i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5192 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5193 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5194
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5195 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5196 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5197 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5198 if (index_check (i, "row") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5199 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5200 Matrix mj = tmp_j.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5201 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5202 columns ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5203 if (! jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5204 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5205
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5206 if (! indexed_assign_conforms (1, jv.capacity (), rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5207 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5208 ::error ("A(int,matrix) = X: X must be a row vector with the same");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5209 ::error ("number of elements as matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5210 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5211 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5212 maybe_resize (i, jv.max ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5213 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5214 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5215
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5216 do_matrix_assignment (rhs, i, jv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5217 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5218 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5219
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5220 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5221 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5222 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5223
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5224 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5225 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5226 if (index_check (i, "row") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5227 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5228 Range rj = tmp_j.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5229 if (! indexed_assign_conforms (1, rj.nelem (), rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5230 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5231 ::error ("A(int,range) = X: X must be a row vector with the same");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5232 ::error ("number of elements as range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5233 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5234 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5235
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5236 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5237 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5238 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5239 do_matrix_assignment (rhs, i, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5240 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5241 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5242 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5243 do_matrix_assignment (rhs, i, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5244 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5245 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5246 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5247 if (index_check (rj, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5248 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5249 maybe_resize (i, tree_to_mat_idx (rj.max ()));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5250 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5251 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5252
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5253 do_matrix_assignment (rhs, i, rj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5254 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5255 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5256 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5257
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5258 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5259 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5260 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5261 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5262 if (i == -1 && nr == 1 && rhs_nr == 0 && rhs_nc == 0
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5263 || index_check (i, "row") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5264 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5265 else if (nc == 0 && nr == 0 && rhs_nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5266 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5267 if (rhs.is_complex_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5268 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5269 complex_matrix = new ComplexMatrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5270 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5271 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5272 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5273 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5274 matrix = new Matrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5275 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5276 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5277 maybe_resize (i, rhs_nc-1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5278 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5279 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5280 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5281 else if (indexed_assign_conforms (1, nc, rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5282 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5283 maybe_resize (i, nc-1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5284 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5285 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5286 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5287 else if (rhs_nr == 0 && rhs_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5288 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5289 if (i < 0 || i >= nr)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5290 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5291 ::error ("A(int,:) = []: row index out of range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5292 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5293 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5294 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5295 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5296 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5297 ::error ("A(int,:) = X: X must be a row vector with the same");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5298 ::error ("number of columns as A");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5299 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5300 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5301
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5302 do_matrix_assignment (rhs, i, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5303 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5304 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5305
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5306 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5307 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5308 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5309 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5310 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5311
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5312 /* MA2 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5313 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5314 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5315 idx_vector& iv, const tree_constant& j_arg)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5316 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5317 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5318
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5319 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5320 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5321
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5322 TC_REP::constant_type jtype = tmp_j.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5323
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5324 int rhs_nr = rhs.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5325 int rhs_nc = rhs.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5326
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5327 switch (jtype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5328 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5329 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5330 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5331 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5332 int j = tree_to_mat_idx (tmp_j.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5333 if (index_check (j, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5334 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5335 if (! indexed_assign_conforms (iv.capacity (), 1, rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5336 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5337 ::error ("A(matrix,int) = X: X must be a column vector with the");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5338 ::error ("same number of elements as matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5339 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5340 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5341 maybe_resize (iv.max (), j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5342 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5343 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5344
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5345 do_matrix_assignment (rhs, iv, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5346 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5347 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5348
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5349 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5350 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5351 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5352 Matrix mj = tmp_j.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5353 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5354 columns ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5355 if (! jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5356 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5357
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5358 if (! indexed_assign_conforms (iv.capacity (), jv.capacity (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5359 rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5360 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5361 ::error ("A(r_mat,c_mat) = X: the number of rows in X must match");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5362 ::error ("the number of elements in r_mat and the number of");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5363 ::error ("columns in X must match the number of elements in c_mat");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5364 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5365 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5366 maybe_resize (iv.max (), jv.max ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5367 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5368 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5369
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5370 do_matrix_assignment (rhs, iv, jv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5371 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5372 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5373
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5374 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5375 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5376 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5377
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5378 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5379 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5380 Range rj = tmp_j.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5381 if (! indexed_assign_conforms (iv.capacity (), rj.nelem (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5382 rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5383 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5384 ::error ("A(matrix,range) = X: the number of rows in X must match");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5385 ::error ("the number of elements in matrix and the number of");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5386 ::error ("columns in X must match the number of elements in range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5387 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5388 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5389
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5390 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5391 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5392 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5393 do_matrix_assignment (rhs, iv, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5394 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5395 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5396 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5397 do_matrix_assignment (rhs, iv, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5398 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5399 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5400 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5401 if (index_check (rj, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5402 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5403 maybe_resize (iv.max (), tree_to_mat_idx (rj.max ()));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5404 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5405 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5406
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5407 do_matrix_assignment (rhs, iv, rj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5408 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5409 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5410 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5411
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5412 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5413 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5414 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5415 int new_nc = nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5416 if (nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5417 new_nc = rhs_nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5418
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5419 if (indexed_assign_conforms (iv.capacity (), new_nc,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5420 rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5421 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5422 maybe_resize (iv.max (), new_nc-1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5423 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5424 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5425 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5426 else if (rhs_nr == 0 && rhs_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5427 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5428 if (iv.max () >= rows ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5429 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5430 ::error ("A(matrix,:) = []: row index out of range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5431 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5432 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5433 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5434 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5435 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5436 ::error ("A(matrix,:) = X: the number of rows in X must match the");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5437 ::error ("number of elements in matrix, and the number of columns");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5438 ::error ("in X must match the number of columns in A");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5439 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5440 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5441
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5442 do_matrix_assignment (rhs, iv, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5443 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5444 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5445
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5446 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5447 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5448 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5449 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5450 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5451
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5452 /* MA3 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5453 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5454 TC_REP::do_matrix_assignment (const tree_constant& rhs, Range& ri,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5455 const tree_constant& j_arg)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5456 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5457 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5458
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5459 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5460 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5461
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5462 TC_REP::constant_type jtype = tmp_j.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5463
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5464 int rhs_nr = rhs.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5465 int rhs_nc = rhs.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5466
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5467 switch (jtype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5468 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5469 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5470 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5471 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5472 int j = tree_to_mat_idx (tmp_j.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5473 if (index_check (j, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5474 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5475 if (! indexed_assign_conforms (ri.nelem (), 1, rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5476 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5477 ::error ("A(range,int) = X: X must be a column vector with the");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5478 ::error ("same number of elements as range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5479 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5480 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5481 maybe_resize (tree_to_mat_idx (ri.max ()), j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5482 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5483 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5484
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5485 do_matrix_assignment (rhs, ri, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5486 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5487 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5488
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5489 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5490 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5491 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5492 Matrix mj = tmp_j.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5493 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5494 columns ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5495 if (! jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5496 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5497
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5498 if (! indexed_assign_conforms (ri.nelem (), jv.capacity (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5499 rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5500 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5501 ::error ("A(range,matrix) = X: the number of rows in X must match");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5502 ::error ("the number of elements in range and the number of");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5503 ::error ("columns in X must match the number of elements in matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5504 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5505 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5506 maybe_resize (tree_to_mat_idx (ri.max ()), jv.max ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5507 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5508 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5509
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5510 do_matrix_assignment (rhs, ri, jv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5511 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5512 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5513
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5514 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5515 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5516 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5517
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5518 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5519 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5520 Range rj = tmp_j.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5521 if (! indexed_assign_conforms (ri.nelem (), rj.nelem (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5522 rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5523 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5524 ::error ("A(r_range,c_range) = X: the number of rows in X must");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5525 ::error ("match the number of elements in r_range and the number");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5526 ::error ("of columns in X must match the number of elements in");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5527 ::error ("c_range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5528 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5529 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5530
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5531 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5532 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5533 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5534 do_matrix_assignment (rhs, ri, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5535 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5536 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5537 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5538 do_matrix_assignment (rhs, ri, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5539 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5540 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5541 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5542 if (index_check (rj, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5543 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5544
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5545 maybe_resize (tree_to_mat_idx (ri.max ()),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5546 tree_to_mat_idx (rj.max ()));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5547
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5548 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5549 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5550
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5551 do_matrix_assignment (rhs, ri, rj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5552 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5553 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5554 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5555
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5556 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5557 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5558 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5559 int new_nc = nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5560 if (nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5561 new_nc = rhs_nc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5562
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5563 if (indexed_assign_conforms (ri.nelem (), new_nc, rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5564 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5565 maybe_resize (tree_to_mat_idx (ri.max ()), new_nc-1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5566 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5567 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5568 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5569 else if (rhs_nr == 0 && rhs_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5570 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5571 int b = tree_to_mat_idx (ri.min ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5572 int l = tree_to_mat_idx (ri.max ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5573 if (b < 0 || l >= rows ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5574 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5575 ::error ("A(range,:) = []: row index out of range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5576 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5577 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5578 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5579 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5580 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5581 ::error ("A(range,:) = X: the number of rows in X must match the");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5582 ::error ("number of elements in range, and the number of columns");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5583 ::error ("in X must match the number of columns in A");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5584 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5585 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5586
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5587 do_matrix_assignment (rhs, ri, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5588 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5589 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5590
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5591 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5592 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5593 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5594 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5595 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5596
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5597 /* MA4 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5598 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5599 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5600 TC_REP::constant_type i,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5601 const tree_constant& j_arg)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5602 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5603 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5604
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5605 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5606 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5607
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5608 TC_REP::constant_type jtype = tmp_j.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5609
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5610 int rhs_nr = rhs.rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5611 int rhs_nc = rhs.columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5612
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5613 switch (jtype)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5614 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5615 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5616 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5617 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5618 int j = tree_to_mat_idx (tmp_j.double_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5619 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5620 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5621 if (j == -1 && nc == 1 && rhs_nr == 0 && rhs_nc == 0
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5622 || index_check (j, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5623 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5624 if (nr == 0 && nc == 0 && rhs_nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5625 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5626 if (rhs.is_complex_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5627 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5628 complex_matrix = new ComplexMatrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5629 type_tag = complex_matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5630 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5631 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5632 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5633 matrix = new Matrix ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5634 type_tag = matrix_constant;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5635 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5636 maybe_resize (rhs_nr-1, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5637 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5638 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5639 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5640 else if (indexed_assign_conforms (nr, 1, rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5641 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5642 maybe_resize (nr-1, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5643 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5644 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5645 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5646 else if (rhs_nr == 0 && rhs_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5647 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5648 if (j < 0 || j >= nc)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5649 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5650 ::error ("A(:,int) = []: column index out of range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5651 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5652 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5653 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5654 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5655 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5656 ::error ("A(:,int) = X: X must be a column vector with the same");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5657 ::error ("number of rows as A");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5658 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5659 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5660
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5661 do_matrix_assignment (rhs, magic_colon, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5662 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5663 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5664
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5665 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5666 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5667 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5668 Matrix mj = tmp_j.matrix_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5669 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5670 columns ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5671 if (! jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5672 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5673
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5674 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5675 int new_nr = nr;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5676 if (nr == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5677 new_nr = rhs_nr;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5678
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5679 if (indexed_assign_conforms (new_nr, jv.capacity (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5680 rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5681 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5682 maybe_resize (new_nr-1, jv.max ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5683 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5684 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5685 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5686 else if (rhs_nr == 0 && rhs_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5687 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5688 if (jv.max () >= columns ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5689 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5690 ::error ("A(:,matrix) = []: column index out of range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5691 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5692 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5693 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5694 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5695 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5696 ::error ("A(:,matrix) = X: the number of rows in X must match the");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5697 ::error ("number of rows in A, and the number of columns in X must");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5698 ::error ("match the number of elements in matrix");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5699 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5700 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5701
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5702 do_matrix_assignment (rhs, magic_colon, jv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5703 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5704 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5705
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5706 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5707 gripe_string_invalid ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5708 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5709
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5710 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5711 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5712 Range rj = tmp_j.range_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5713 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5714 int new_nr = nr;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5715 if (nr == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5716 new_nr = rhs_nr;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5717
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5718 if (indexed_assign_conforms (new_nr, rj.nelem (), rhs_nr, rhs_nc))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5719 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5720 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5721 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5722 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5723 do_matrix_assignment (rhs, magic_colon, 1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5724 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5725 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5726 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5727 do_matrix_assignment (rhs, magic_colon, 0);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5728 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5729 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5730 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5731 if (index_check (rj, "column") < 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5732 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5733 maybe_resize (new_nr-1, tree_to_mat_idx (rj.max ()));
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5734 if (error_state)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5735 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5736 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5737 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5738 else if (rhs_nr == 0 && rhs_nc == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5739 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5740 int b = tree_to_mat_idx (rj.min ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5741 int l = tree_to_mat_idx (rj.max ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5742 if (b < 0 || l >= columns ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5743 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5744 ::error ("A(:,range) = []: column index out of range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5745 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5746 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5747 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5748 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5749 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5750 ::error ("A(:,range) = X: the number of rows in X must match the");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5751 ::error ("number of rows in A, and the number of columns in X");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5752 ::error ("must match the number of elements in range");
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5753 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5754 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5755
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5756 do_matrix_assignment (rhs, magic_colon, rj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5757 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5758 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5759
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5760 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5761 // a(:,:) = foo is equivalent to a = foo.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5762 do_matrix_assignment (rhs, magic_colon, magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5763 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5764
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5765 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5766 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5767 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5768 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5769 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5770
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5771 // Functions that actually handle assignment to a matrix using two
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5772 // index values.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5773 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5774 // idx2
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5775 // +---+---+----+----+
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5776 // idx1 | i | v | r | c |
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5777 // ---------+---+---+----+----+
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5778 // integer | 1 | 5 | 9 | 13 |
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5779 // ---------+---+---+----+----+
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5780 // vector | 2 | 6 | 10 | 14 |
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5781 // ---------+---+---+----+----+
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5782 // range | 3 | 7 | 11 | 15 |
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5783 // ---------+---+---+----+----+
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5784 // colon | 4 | 8 | 12 | 16 |
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5785 // ---------+---+---+----+----+
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5786
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5787 /* 1 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5788 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5789 TC_REP::do_matrix_assignment (const tree_constant& rhs, int i, int j)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5790 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5791 REP_ELEM_ASSIGN (i, j, rhs.double_value (), rhs.complex_value (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5792 rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5793 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5794
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5795 /* 2 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5796 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5797 TC_REP::do_matrix_assignment (const tree_constant& rhs, int i, idx_vector& jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5798 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5799 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5800
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5801 for (int j = 0; j < jv.capacity (); j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5802 REP_ELEM_ASSIGN (i, jv.elem (j), rhs_m.elem (0, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5803 rhs_cm.elem (0, j), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5804 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5805
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5806 /* 3 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5807 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5808 TC_REP::do_matrix_assignment (const tree_constant& rhs, int i, Range& rj)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5809 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5810 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5811
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5812 double b = rj.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5813 double increment = rj.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5814
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5815 for (int j = 0; j < rj.nelem (); j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5816 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5817 double tmp = b + j * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5818 int col = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5819 REP_ELEM_ASSIGN (i, col, rhs_m.elem (0, j), rhs_cm.elem (0, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5820 rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5821 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5822 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5823
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5824 /* 4 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5825 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5826 TC_REP::do_matrix_assignment (const tree_constant& rhs, int i,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5827 TC_REP::constant_type mcj)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5828 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5829 assert (mcj == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5830
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5831 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5832
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5833 if (rhs.is_zero_by_zero ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5834 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5835 delete_row (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5836 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5837 else if (rhs.is_matrix_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5838 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5839 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5840
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5841 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5842 REP_ELEM_ASSIGN (i, j, rhs_m.elem (0, j), rhs_cm.elem (0, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5843 rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5844 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5845 else if (rhs.is_scalar_type () && nc == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5846 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5847 REP_ELEM_ASSIGN (i, 0, rhs.double_value (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5848 rhs.complex_value (), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5849 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5850 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5851 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5852 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5853
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5854 /* 5 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5855 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5856 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5857 idx_vector& iv, int j)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5858 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5859 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5860
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5861 for (int i = 0; i < iv.capacity (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5862 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5863 int row = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5864 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, 0),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5865 rhs_cm.elem (i, 0), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5866 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5867 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5868
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5869 /* 6 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5870 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5871 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5872 idx_vector& iv, idx_vector& jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5873 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5874 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5875
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5876 for (int i = 0; i < iv.capacity (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5877 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5878 int row = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5879 for (int j = 0; j < jv.capacity (); j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5880 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5881 int col = jv.elem (j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5882 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5883 rhs_cm.elem (i, j), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5884 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5885 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5886 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5887
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5888 /* 7 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5889 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5890 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5891 idx_vector& iv, Range& rj)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5892 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5893 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5894
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5895 double b = rj.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5896 double increment = rj.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5897
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5898 for (int i = 0; i < iv.capacity (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5899 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5900 int row = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5901 for (int j = 0; j < rj.nelem (); j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5902 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5903 double tmp = b + j * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5904 int col = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5905 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5906 rhs_cm.elem (i, j), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5907 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5908 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5909 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5910
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5911 /* 8 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5912 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5913 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5914 idx_vector& iv, TC_REP::constant_type mcj)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5915 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5916 assert (mcj == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5917
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5918 if (rhs.is_zero_by_zero ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5919 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5920 delete_rows (iv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5921 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5922 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5923 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5924 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5925
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5926 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5927
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5928 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5929 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5930 for (int i = 0; i < iv.capacity (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5931 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5932 int row = iv.elem (i);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5933 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5934 rhs_cm.elem (i, j), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5935 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5936 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5937 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5938 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5939
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5940 /* 9 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5941 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5942 TC_REP::do_matrix_assignment (const tree_constant& rhs, Range& ri, int j)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5943 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5944 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5945
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5946 double b = ri.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5947 double increment = ri.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5948
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5949 for (int i = 0; i < ri.nelem (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5950 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5951 double tmp = b + i * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5952 int row = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5953 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, 0),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5954 rhs_cm.elem (i, 0), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5955 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5956 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5957
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5958 /* 10 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5959 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5960 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5961 Range& ri, idx_vector& jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5962 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5963 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5964
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5965 double b = ri.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5966 double increment = ri.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5967
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5968 for (int j = 0; j < jv.capacity (); j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5969 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5970 int col = jv.elem (j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5971 for (int i = 0; i < ri.nelem (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5972 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5973 double tmp = b + i * increment;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5974 int row = tree_to_mat_idx (tmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5975 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5976 rhs_m.elem (i, j), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5977 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5978 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5979 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5980
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5981 /* 11 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5982 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5983 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5984 Range& ri, Range& rj)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5985 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5986 double ib = ri.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5987 double iinc = ri.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5988 double jb = rj.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5989 double jinc = rj.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5990
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5991 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5992
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5993 for (int i = 0; i < ri.nelem (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5994 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5995 double itmp = ib + i * iinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5996 int row = tree_to_mat_idx (itmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5997 for (int j = 0; j < rj.nelem (); j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5998 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
5999 double jtmp = jb + j * jinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6000 int col = tree_to_mat_idx (jtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6001 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6002 rhs_cm.elem (i, j), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6003 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6004 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6005 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6006
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6007 /* 12 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6008 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6009 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6010 Range& ri, TC_REP::constant_type mcj)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6011 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6012 assert (mcj == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6013
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6014 if (rhs.is_zero_by_zero ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6015 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6016 delete_rows (ri);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6017 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6018 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6019 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6020 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6021
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6022 double ib = ri.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6023 double iinc = ri.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6024
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6025 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6026
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6027 for (int i = 0; i < ri.nelem (); i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6028 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6029 double itmp = ib + i * iinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6030 int row = tree_to_mat_idx (itmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6031 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6032 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6033 rhs_cm.elem (i, j), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6034 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6035 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6036 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6037
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6038 /* 13 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6039 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6040 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6041 TC_REP::constant_type mci, int j)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6042 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6043 assert (mci == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6044
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6045 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6046
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6047 if (rhs.is_zero_by_zero ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6048 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6049 delete_column (j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6050 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6051 else if (rhs.is_matrix_type ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6052 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6053 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6054
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6055 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6056 REP_ELEM_ASSIGN (i, j, rhs_m.elem (i, 0),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6057 rhs_cm.elem (i, 0), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6058 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6059 else if (rhs.is_scalar_type () && nr == 1)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6060 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6061 REP_ELEM_ASSIGN (0, j, rhs.double_value (),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6062 rhs.complex_value (), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6063 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6064 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6065 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6066 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6067
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6068 /* 14 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6069 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6070 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6071 TC_REP::constant_type mci, idx_vector& jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6072 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6073 assert (mci == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6074
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6075 if (rhs.is_zero_by_zero ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6076 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6077 delete_columns (jv);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6078 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6079 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6080 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6081 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6082
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6083 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6084
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6085 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6086 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6087 for (int j = 0; j < jv.capacity (); j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6088 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6089 int col = jv.elem (j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6090 REP_ELEM_ASSIGN (i, col, rhs_m.elem (i, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6091 rhs_cm.elem (i, j), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6092 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6093 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6094 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6095 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6096
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6097 /* 15 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6098 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6099 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6100 TC_REP::constant_type mci, Range& rj)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6101 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6102 assert (mci == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6103
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6104 if (rhs.is_zero_by_zero ())
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6105 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6106 delete_columns (rj);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6107 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6108 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6109 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6110 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6111
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6112 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6113
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6114 double jb = rj.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6115 double jinc = rj.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6116
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6117 for (int j = 0; j < rj.nelem (); j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6118 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6119 double jtmp = jb + j * jinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6120 int col = tree_to_mat_idx (jtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6121 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6122 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6123 REP_ELEM_ASSIGN (i, col, rhs_m.elem (i, j),
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6124 rhs_cm.elem (i, j), rhs.is_real_type ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6125 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6126 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6127 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6128 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6129
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6130 /* 16 */
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6131 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6132 TC_REP::do_matrix_assignment (const tree_constant& rhs,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6133 TC_REP::constant_type mci,
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6134 TC_REP::constant_type mcj)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6135 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6136 assert (mci == magic_colon && mcj == magic_colon);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6137
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6138 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6139 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6140 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6141 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6142
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6143 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6144 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6145 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6146
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6147 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6148 delete complex_scalar;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6149 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6150
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6151 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6152 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6153 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6154
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6155 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6156 delete [] string;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6157 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6158
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6159 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6160 delete range;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6161 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6162
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6163 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6164 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6165 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6166 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6167 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6168
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6169 type_tag = rhs.const_type ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6170
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6171 switch (type_tag)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6172 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6173 case scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6174 scalar = rhs.double_value ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6175 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6176
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6177 case matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6178 matrix = new Matrix (rhs.matrix_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6179 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6180
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6181 case string_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6182 string = strsave (rhs.string_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6183 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6184
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6185 case complex_matrix_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6186 complex_matrix = new ComplexMatrix (rhs.complex_matrix_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6187 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6188
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6189 case complex_scalar_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6190 complex_scalar = new Complex (rhs.complex_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6191 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6192
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6193 case range_constant:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6194 range = new Range (rhs.range_value ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6195 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6196
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6197 case magic_colon:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6198 default:
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6199 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6200 break;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6201 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6202 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6203
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6204 // Functions for deleting rows or columns of a matrix. These are used
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6205 // to handle statements like
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6206 //
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6207 // M (i, j) = []
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6208
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6209 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6210 TC_REP::delete_row (int idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6211 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6212 if (type_tag == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6213 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6214 int nr = matrix->rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6215 int nc = matrix->columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6216 Matrix *new_matrix = new Matrix (nr-1, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6217 int ii = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6218 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6219 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6220 if (i != idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6221 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6222 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6223 new_matrix->elem (ii, j) = matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6224 ii++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6225 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6226 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6227 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6228 matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6229 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6230 else if (type_tag == complex_matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6231 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6232 int nr = complex_matrix->rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6233 int nc = complex_matrix->columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6234 ComplexMatrix *new_matrix = new ComplexMatrix (nr-1, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6235 int ii = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6236 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6237 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6238 if (i != idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6239 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6240 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6241 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6242 ii++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6243 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6244 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6245 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6246 complex_matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6247 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6248 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6249 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6250 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6251
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6252 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6253 TC_REP::delete_rows (idx_vector& iv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6254 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6255 iv.sort_uniq ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6256 int num_to_delete = iv.length ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6257
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6258 if (num_to_delete == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6259 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6260
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6261 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6262 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6263
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6264 // If deleting all rows of a column vector, make result 0x0.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6265 if (nc == 1 && num_to_delete == nr)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6266 nc = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6267
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6268 if (type_tag == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6269 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6270 Matrix *new_matrix = new Matrix (nr-num_to_delete, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6271 if (nr > num_to_delete)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6272 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6273 int ii = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6274 int idx = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6275 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6276 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6277 if (i == iv.elem (idx))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6278 idx++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6279 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6280 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6281 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6282 new_matrix->elem (ii, j) = matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6283 ii++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6284 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6285 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6286 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6287 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6288 matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6289 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6290 else if (type_tag == complex_matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6291 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6292 ComplexMatrix *new_matrix = new ComplexMatrix (nr-num_to_delete, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6293 if (nr > num_to_delete)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6294 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6295 int ii = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6296 int idx = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6297 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6298 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6299 if (i == iv.elem (idx))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6300 idx++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6301 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6302 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6303 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6304 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6305 ii++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6306 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6307 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6308 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6309 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6310 complex_matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6311 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6312 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6313 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6314 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6315
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6316 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6317 TC_REP::delete_rows (Range& ri)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6318 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6319 ri.sort ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6320 int num_to_delete = ri.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6321
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6322 if (num_to_delete == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6323 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6324
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6325 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6326 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6327
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6328 // If deleting all rows of a column vector, make result 0x0.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6329 if (nc == 1 && num_to_delete == nr)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6330 nc = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6331
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6332 double ib = ri.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6333 double iinc = ri.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6334
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6335 int max_idx = tree_to_mat_idx (ri.max ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6336
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6337 if (type_tag == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6338 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6339 Matrix *new_matrix = new Matrix (nr-num_to_delete, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6340 if (nr > num_to_delete)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6341 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6342 int ii = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6343 int idx = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6344 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6345 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6346 double itmp = ib + idx * iinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6347 int row = tree_to_mat_idx (itmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6348
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6349 if (i == row && row <= max_idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6350 idx++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6351 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6352 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6353 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6354 new_matrix->elem (ii, j) = matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6355 ii++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6356 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6357 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6358 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6359 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6360 matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6361 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6362 else if (type_tag == complex_matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6363 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6364 ComplexMatrix *new_matrix = new ComplexMatrix (nr-num_to_delete, nc);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6365 if (nr > num_to_delete)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6366 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6367 int ii = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6368 int idx = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6369 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6370 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6371 double itmp = ib + idx * iinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6372 int row = tree_to_mat_idx (itmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6373
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6374 if (i == row && row <= max_idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6375 idx++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6376 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6377 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6378 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6379 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6380 ii++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6381 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6382 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6383 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6384 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6385 complex_matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6386 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6387 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6388 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6389 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6390
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6391 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6392 TC_REP::delete_column (int idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6393 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6394 if (type_tag == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6395 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6396 int nr = matrix->rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6397 int nc = matrix->columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6398 Matrix *new_matrix = new Matrix (nr, nc-1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6399 int jj = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6400 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6401 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6402 if (j != idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6403 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6404 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6405 new_matrix->elem (i, jj) = matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6406 jj++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6407 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6408 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6409 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6410 matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6411 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6412 else if (type_tag == complex_matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6413 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6414 int nr = complex_matrix->rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6415 int nc = complex_matrix->columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6416 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-1);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6417 int jj = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6418 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6419 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6420 if (j != idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6421 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6422 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6423 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6424 jj++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6425 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6426 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6427 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6428 complex_matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6429 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6430 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6431 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6432 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6433
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6434 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6435 TC_REP::delete_columns (idx_vector& jv)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6436 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6437 jv.sort_uniq ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6438 int num_to_delete = jv.length ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6439
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6440 if (num_to_delete == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6441 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6442
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6443 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6444 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6445
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6446 // If deleting all columns of a row vector, make result 0x0.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6447 if (nr == 1 && num_to_delete == nc)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6448 nr = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6449
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6450 if (type_tag == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6451 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6452 Matrix *new_matrix = new Matrix (nr, nc-num_to_delete);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6453 if (nc > num_to_delete)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6454 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6455 int jj = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6456 int idx = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6457 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6458 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6459 if (j == jv.elem (idx))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6460 idx++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6461 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6462 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6463 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6464 new_matrix->elem (i, jj) = matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6465 jj++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6466 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6467 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6468 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6469 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6470 matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6471 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6472 else if (type_tag == complex_matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6473 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6474 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-num_to_delete);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6475 if (nc > num_to_delete)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6476 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6477 int jj = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6478 int idx = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6479 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6480 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6481 if (j == jv.elem (idx))
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6482 idx++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6483 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6484 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6485 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6486 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6487 jj++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6488 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6489 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6490 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6491 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6492 complex_matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6493 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6494 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6495 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6496 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6497
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6498 void
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6499 TC_REP::delete_columns (Range& rj)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6500 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6501 rj.sort ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6502 int num_to_delete = rj.nelem ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6503
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6504 if (num_to_delete == 0)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6505 return;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6506
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6507 int nr = rows ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6508 int nc = columns ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6509
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6510 // If deleting all columns of a row vector, make result 0x0.
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6511 if (nr == 1 && num_to_delete == nc)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6512 nr = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6513
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6514 double jb = rj.base ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6515 double jinc = rj.inc ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6516
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6517 int max_idx = tree_to_mat_idx (rj.max ());
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6518
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6519 if (type_tag == matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6520 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6521 Matrix *new_matrix = new Matrix (nr, nc-num_to_delete);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6522 if (nc > num_to_delete)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6523 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6524 int jj = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6525 int idx = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6526 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6527 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6528 double jtmp = jb + idx * jinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6529 int col = tree_to_mat_idx (jtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6530
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6531 if (j == col && col <= max_idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6532 idx++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6533 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6534 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6535 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6536 new_matrix->elem (i, jj) = matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6537 jj++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6538 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6539 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6540 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6541 delete matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6542 matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6543 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6544 else if (type_tag == complex_matrix_constant)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6545 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6546 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-num_to_delete);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6547 if (nc > num_to_delete)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6548 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6549 int jj = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6550 int idx = 0;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6551 for (int j = 0; j < nc; j++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6552 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6553 double jtmp = jb + idx * jinc;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6554 int col = tree_to_mat_idx (jtmp);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6555
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6556 if (j == col && col <= max_idx)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6557 idx++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6558 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6559 {
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6560 for (int i = 0; i < nr; i++)
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6561 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6562 jj++;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6563 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6564 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6565 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6566 delete complex_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6567 complex_matrix = new_matrix;
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6568 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6569 else
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6570 panic_impossible ();
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6571 }
484e94579182 [project @ 1995-05-01 18:50:20 by jwe]
jwe
parents: 1277
diff changeset
6572
96
36ff440553cd [project @ 1993-09-13 02:48:39 by jwe]
jwe
parents: 1
diff changeset
6573 /*
1
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
6574 ;;; Local Variables: ***
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
6575 ;;; mode: C++ ***
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
6576 ;;; page-delimiter: "^/\\*" ***
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
6577 ;;; End: ***
78fd87e624cb [project @ 1993-08-08 01:13:40 by jwe]
jwe
parents:
diff changeset
6578 */