annotate libinterp/parse-tree/pt-tm-const.cc @ 23435:c452180ab672

begin refactoring parse tree evaluator * libinterp/parse-tree/pt-tm-const.cc, libinterp/parse-tree/pt-tm-const.h: New files, extracted from pt-mat.h and pt-mat.cc. * libinterp/parse-tree/module.mk: Update. * interpreter.cc, ov-class.cc, ov-classdef.cc, ov-classdef.h, ov-fcn-handle.cc, ov-fcn-handle.h, ov-usr-fcn.cc, oct-parse.in.yy, pt-arg-list.cc, pt-arg-list.h, pt-array-list.h, pt-assign.cc, pt-assign.h, pt-binop.cc, pt-binop.h, pt-cbinop.cc, pt-cbinop.h, pt-cell.cc, pt-cell.h, pt-classdef.cc, pt-classdef.h, pt-cmd.cc, pt-cmd.h, pt-colon.cc, pt-colon.h, pt-const.cc, pt-const.h, pt-decl.cc, pt-decl.h, pt-eval.cc, pt-eval.h, pt-except.cc, pt-except.h, pt-exp.cc, pt-exp.h, pt-fcn-handle.cc, pt-fcn-handle.h, pt-funcall.cc, pt-funcall.h, pt-id.cc, pt-id.h, pt-idx.cc, pt-idx.h, pt-jit.cc, pt-jump.cc, pt-jump.h, pt-loop.cc, pt-loop.h, pt-mat.cc, pt-mat.h, pt-misc.cc, pt-misc.h, pt-select.cc, pt-select.h, pt-stmt.cc, pt-stmt.h, pt-unop.cc, pt-unop.h: Use tree_evaluator class to walk the parse tree instead of rvalue methods in the parse tree classes. Maintain a stack in the evaluator class to accumulate results. Pass pointer to evaluator to function objects and other classes as needed for evaluation. This is a work in progress that is not yet complete. The ultimate goal is to move all evaluation into the tree_evaluator class instead of spreading that work among many different classes. The global pointer to the current evaluator should also be eliminated.
author John W. Eaton <jwe@octave.org>
date Fri, 21 Apr 2017 18:07:40 -0400
parents
children 4d7928872999
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1 /*
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
3 Copyright (C) 1996-2017 John W. Eaton
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
5 This file is part of Octave.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
6
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
8 under the terms of the GNU General Public License as published by
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
9 the Free Software Foundation; either version 3 of the License, or
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
10 (at your option) any later version.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
11
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
12 Octave is distributed in the hope that it will be useful, but
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
13 WITHOUT ANY WARRANTY; without even the implied warranty of
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
15 GNU General Public License for more details.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
16
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, see
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
20
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
21 */
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
22
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
23 #if defined (HAVE_CONFIG_H)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
24 # include "config.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
25 #endif
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
26
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
27 #include <iostream>
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
28
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
29 #include "oct-locbuf.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
30 #include "quit.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
31
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
32 #include "data.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
33 #include "defun.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
34 #include "error.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
35 #include "errwarn.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
36 #include "oct-map.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
37 #include "ovl.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
38 #include "pt-arg-list.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
39 #include "pt-bp.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
40 #include "pt-eval.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
41 #include "pt-exp.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
42 #include "pt-mat.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
43 #include "pt-tm-const.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
44 #include "utils.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
45 #include "ov.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
46 #include "variables.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
47
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
48 #include "ov-cx-mat.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
49 #include "ov-flt-cx-mat.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
50 #include "ov-re-sparse.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
51 #include "ov-cx-sparse.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
52
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
53 OCTAVE_NORETURN static
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
54 void
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
55 eval_error (const char *msg, const dim_vector& x, const dim_vector& y)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
56 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
57 error ("%s (%s vs %s)", msg, x.str ().c_str (), y.str ().c_str ());
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
58 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
59
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
60 namespace octave
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
61 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
62 void
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
63 tm_row_const::tm_row_const_rep::do_init_element (const octave_value& val,
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
64 bool& first_elem)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
65 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
66 std::string this_elt_class_nm
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
67 = val.is_object () ? std::string ("class") : val.class_name ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
68
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
69 class_nm = get_concat_class (class_nm, this_elt_class_nm);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
70
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
71 dim_vector this_elt_dv = val.dims ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
72
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
73 if (! this_elt_dv.zero_by_zero ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
74 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
75 all_mt = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
76
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
77 if (first_elem)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
78 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
79 if (val.is_map ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
80 first_elem_is_struct = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
81
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
82 first_elem = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
83 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
84 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
85
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
86 append (val);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
87
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
88 if (all_str && ! val.is_string ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
89 all_str = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
90
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
91 if (all_sq_str && ! val.is_sq_string ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
92 all_sq_str = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
93
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
94 if (all_dq_str && ! val.is_dq_string ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
95 all_dq_str = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
96
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
97 if (! some_str && val.is_string ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
98 some_str = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
99
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
100 if (all_real && ! val.is_real_type ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
101 all_real = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
102
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
103 if (all_cmplx && ! (val.is_complex_type () || val.is_real_type ()))
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
104 all_cmplx = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
105
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
106 if (! any_cell && val.is_cell ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
107 any_cell = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
108
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
109 if (! any_sparse && val.is_sparse_type ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
110 any_sparse = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
111
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
112 if (! any_class && val.is_object ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
113 any_class = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
114
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
115 // Special treatment of sparse matrices to avoid out-of-memory error
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
116 all_1x1 = all_1x1 && ! val.is_sparse_type () && val.numel () == 1;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
117 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
118
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
119 void
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
120 tm_row_const::tm_row_const_rep::init (const tree_argument_list& row,
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
121 tree_evaluator *tw)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
122 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
123 all_str = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
124 all_sq_str = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
125 all_dq_str = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
126 all_real = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
127 all_cmplx = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
128 any_cell = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
129 any_sparse = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
130 any_class = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
131
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
132 bool first_elem = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
133
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
134 for (tree_expression* elt : row)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
135 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
136 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
137
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
138 octave_value tmp = tw->evaluate (elt);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
139
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
140 if (tmp.is_undefined ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
141 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
142 ok = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
143 return;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
144 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
145 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
146 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
147 if (tmp.is_cs_list ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
148 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
149 octave_value_list tlst = tmp.list_value ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
150
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
151 for (octave_idx_type i = 0; i < tlst.length (); i++)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
152 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
153 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
154
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
155 do_init_element (tlst(i), first_elem);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
156 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
157 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
158 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
159 do_init_element (tmp, first_elem);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
160 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
161 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
162
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
163 if (any_cell && ! any_class && ! first_elem_is_struct)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
164 cellify ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
165
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
166 first_elem = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
167
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
168 for (const octave_value& val : *this)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
169 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
170 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
171
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
172 dim_vector this_elt_dv = val.dims ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
173
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
174 if (! this_elt_dv.zero_by_zero ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
175 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
176 all_mt = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
177
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
178 if (first_elem)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
179 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
180 first_elem = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
181 dv = this_elt_dv;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
182 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
183 else if ((! any_class) && (! dv.hvcat (this_elt_dv, 1)))
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
184 eval_error ("horizontal dimensions mismatch", dv, this_elt_dv);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
185 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
186 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
187
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
188 ok = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
189 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
190
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
191 void
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
192 tm_row_const::tm_row_const_rep::cellify (void)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
193 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
194 bool elt_changed = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
195
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
196 for (auto& elt : *this)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
197 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
198 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
199
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
200 if (! elt.is_cell ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
201 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
202 elt_changed = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
203
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
204 if (elt.is_empty ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
205 elt = Cell ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
206 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
207 elt = Cell (elt);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
208 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
209 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
210
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
211 if (elt_changed)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
212 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
213 bool first_elem = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
214
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
215 for (const octave_value& val : *this)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
216 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
217 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
218
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
219 dim_vector this_elt_dv = val.dims ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
220
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
221 if (! this_elt_dv.zero_by_zero ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
222 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
223 if (first_elem)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
224 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
225 first_elem = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
226 dv = this_elt_dv;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
227 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
228 else if (! dv.hvcat (this_elt_dv, 1))
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
229 eval_error ("horizontal dimensions mismatch", dv, this_elt_dv);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
230 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
231 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
232 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
233 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
234
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
235 void
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
236 tm_const::init (const tree_matrix& tm, tree_evaluator *tw)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
237 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
238 all_str = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
239 all_sq_str = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
240 all_dq_str = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
241 all_real = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
242 all_cmplx = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
243 any_cell = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
244 any_sparse = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
245 any_class = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
246 all_1x1 = ! tm.empty ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
247
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
248 bool first_elem = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
249 bool first_elem_is_struct = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
250
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
251 // Just eval and figure out if what we have is complex or all strings.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
252 // We can't check columns until we know that this is a numeric matrix --
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
253 // collections of strings can have elements of different lengths.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
254 for (const tree_argument_list* elt : tm)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
255 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
256 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
257
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
258 tm_row_const tmp (*elt, tw);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
259
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
260 if (first_elem)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
261 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
262 first_elem_is_struct = tmp.first_elem_struct_p ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
263
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
264 first_elem = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
265 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
266
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
267 if (tmp && ! tmp.empty ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
268 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
269 if (all_str && ! tmp.all_strings_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
270 all_str = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
271
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
272 if (all_sq_str && ! tmp.all_sq_strings_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
273 all_sq_str = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
274
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
275 if (all_dq_str && ! tmp.all_dq_strings_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
276 all_dq_str = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
277
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
278 if (! some_str && tmp.some_strings_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
279 some_str = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
280
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
281 if (all_real && ! tmp.all_real_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
282 all_real = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
283
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
284 if (all_cmplx && ! tmp.all_complex_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
285 all_cmplx = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
286
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
287 if (all_mt && ! tmp.all_empty_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
288 all_mt = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
289
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
290 if (! any_cell && tmp.any_cell_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
291 any_cell = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
292
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
293 if (! any_sparse && tmp.any_sparse_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
294 any_sparse = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
295
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
296 if (! any_class && tmp.any_class_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
297 any_class = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
298
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
299 all_1x1 = all_1x1 && tmp.all_1x1_p ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
300
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
301 append (tmp);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
302 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
303 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
304 break;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
305 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
306
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
307 if (any_cell && ! any_class && ! first_elem_is_struct)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
308 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
309 for (auto& elt : *this)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
310 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
311 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
312
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
313 elt.cellify ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
314 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
315 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
316
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
317 first_elem = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
318
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
319 for (tm_row_const& elt : *this)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
320 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
321 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
322
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
323 octave_idx_type this_elt_nr = elt.rows ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
324 octave_idx_type this_elt_nc = elt.cols ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
325
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
326 std::string this_elt_class_nm = elt.class_name ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
327 class_nm = get_concat_class (class_nm, this_elt_class_nm);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
328
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
329 dim_vector this_elt_dv = elt.dims ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
330
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
331 all_mt = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
332
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
333 if (first_elem)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
334 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
335 first_elem = false;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
336
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
337 dv = this_elt_dv;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
338 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
339 else if (all_str && dv.ndims () == 2
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
340 && this_elt_dv.ndims () == 2)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
341 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
342 // FIXME: this is Octave's specialty.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
343 // Character matrices allow rows of unequal length.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
344 if (this_elt_nc > cols ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
345 dv(1) = this_elt_nc;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
346 dv(0) += this_elt_nr;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
347 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
348 else if ((! any_class) && (! dv.hvcat (this_elt_dv, 0)))
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
349 eval_error ("vertical dimensions mismatch", dv, this_elt_dv);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
350 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
351
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
352 ok = true;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
353 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
354
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
355 template <>
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
356 octave_value
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
357 do_single_type_concat<octave_map> (const dim_vector& dv,
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
358 octave::tm_const& tmp)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
359 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
360 octave_map result;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
361
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
362 if (tmp.all_1x1_p ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
363 single_type_concat<octave_scalar_map> (result, dv, tmp);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
364 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
365 single_type_concat<octave_map> (result, dv, tmp);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
366
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
367 return result;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
368 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
369
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
370 octave_value do_class_concat (octave::tm_const& tmc)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
371 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
372 octave_value retval;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
373
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
374 octave_value_list rows (tmc.length (), octave_value ());
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
375
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
376 octave_idx_type j = 0;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
377 for (octave::tm_row_const& tmrc : tmc)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
378 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
379 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
380
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
381 if (tmrc.length () == 1)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
382 rows(j++) = *(tmrc.begin ());
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
383 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
384 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
385 octave_value_list row (tmrc.length (), octave_value ());
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
386
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
387 octave_idx_type i = 0;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
388 for (auto& elt : tmrc)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
389 row(i++) = elt;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
390
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
391 rows(j++) = do_class_concat (row, "horzcat", 1);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
392 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
393 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
394
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
395 if (rows.length () == 1)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
396 retval = rows(0);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
397 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
398 retval = do_class_concat (rows, "vertcat", 0);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
399
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
400 return retval;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
401 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
402 }