annotate libinterp/parse-tree/pt-tm-const.h @ 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 53f5f8231c37
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 (octave_pt_tm_const_h)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
24 #define octave_pt_tm_const_h 1
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
25
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
26 #include "octave-config.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
27
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
28 #include <string>
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
29
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
30 #include "Array.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
31 #include "Sparse.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
32 #include "base-list.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
33
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
34 #include "data.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
35 #include "dim-vector.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 "ov.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
38 #include "ovl.h"
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
39
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
40 namespace octave
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
41 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
42 class tree_evaluator;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
43
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
44 // General matrices. This list type is much more work to handle than
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
45 // constant matrices, but it allows us to construct matrices from
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
46 // other matrices, variables, and functions.
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 // But first, some internal classes that make our job much easier.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
49
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
50 class
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
51 tm_row_const
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 private:
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
54
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
55 class
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
56 tm_row_const_rep : public octave::base_list<octave_value>
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
57 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
58 public:
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 tm_row_const_rep (void)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
61 : count (1), dv (0, 0), all_str (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
62 all_sq_str (false), all_dq_str (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
63 some_str (false), all_real (false), all_cmplx (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
64 all_mt (true), any_cell (false), any_sparse (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
65 any_class (false), all_1x1 (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
66 first_elem_is_struct (false), class_nm (), ok (false)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
67 { }
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 tm_row_const_rep (const tree_argument_list& row, tree_evaluator *tw)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
70 : count (1), dv (0, 0), all_str (false), all_sq_str (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
71 some_str (false), all_real (false), all_cmplx (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
72 all_mt (true), any_cell (false), any_sparse (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
73 any_class (false), all_1x1 (! row.empty ()),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
74 first_elem_is_struct (false), class_nm (), ok (false)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
75 { init (row, tw); }
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 ~tm_row_const_rep (void) = default;
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 octave::refcount<int> count;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
80
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
81 dim_vector dv;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
82
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
83 bool all_str;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
84 bool all_sq_str;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
85 bool all_dq_str;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
86 bool some_str;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
87 bool all_real;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
88 bool all_cmplx;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
89 bool all_mt;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
90 bool any_cell;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
91 bool any_sparse;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
92 bool any_class;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
93 bool all_1x1;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
94 bool first_elem_is_struct;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
95
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
96 std::string class_nm;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
97
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
98 bool ok;
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 void do_init_element (const octave_value&, bool&);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
101
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
102 void init (const tree_argument_list&, tree_evaluator *tw);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
103
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
104 void cellify (void);
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 private:
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
107
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
108 tm_row_const_rep (const tm_row_const_rep&);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
109
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
110 tm_row_const_rep& operator = (const tm_row_const_rep&);
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 };
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
113
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
114 public:
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
115
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
116 typedef tm_row_const_rep::iterator iterator;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
117 typedef tm_row_const_rep::const_iterator const_iterator;
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 tm_row_const (void)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
120 : rep (0) { }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
121
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
122 tm_row_const (const tree_argument_list& row, tree_evaluator *tw)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
123 : rep (new tm_row_const_rep (row, tw)) { }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
124
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
125 tm_row_const (const tm_row_const& x)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
126 : rep (x.rep)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
127 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
128 if (rep)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
129 rep->count++;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
130 }
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 tm_row_const& operator = (const tm_row_const& x)
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 if (this != &x && rep != x.rep)
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 if (rep && --rep->count == 0)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
137 delete rep;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
138
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
139 rep = x.rep;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
140
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
141 if (rep)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
142 rep->count++;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
143 }
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 return *this;
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
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
148 ~tm_row_const (void)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
149 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
150 if (rep && --rep->count == 0)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
151 delete rep;
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
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
154 octave_idx_type rows (void) { return rep->dv(0); }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
155 octave_idx_type cols (void) { return rep->dv(1); }
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 bool empty (void) const { return rep->empty (); }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
158
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
159 size_t length (void) const { return rep->length (); }
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 dim_vector dims (void) { return rep->dv; }
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 bool all_strings_p (void) const { return rep->all_str; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
164 bool all_sq_strings_p (void) const { return rep->all_sq_str; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
165 bool all_dq_strings_p (void) const { return rep->all_dq_str; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
166 bool some_strings_p (void) const { return rep->some_str; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
167 bool all_real_p (void) const { return rep->all_real; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
168 bool all_complex_p (void) const { return rep->all_cmplx; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
169 bool all_empty_p (void) const { return rep->all_mt; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
170 bool any_cell_p (void) const { return rep->any_cell; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
171 bool any_sparse_p (void) const { return rep->any_sparse; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
172 bool any_class_p (void) const { return rep->any_class; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
173 bool all_1x1_p (void) const { return rep->all_1x1; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
174 bool first_elem_struct_p (void) const { return rep->first_elem_is_struct; }
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 std::string class_name (void) const { return rep->class_nm; }
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 void cellify (void) { rep->cellify (); }
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 operator bool () const { return (rep && rep->ok); }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
181
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
182 iterator begin (void) { return rep->begin (); }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
183 const_iterator begin (void) const { return rep->begin (); }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
184
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
185 iterator end (void) { return rep->end (); }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
186 const_iterator end (void) const { return rep->end (); }
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 private:
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 tm_row_const_rep *rep;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
191 };
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
192
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
193 class
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
194 tm_const : public octave::base_list<tm_row_const>
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 public:
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 tm_const (const tree_matrix& tm, tree_evaluator *tw = 0)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
199 : dv (0, 0), all_str (false), all_sq_str (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
200 all_dq_str (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
201 some_str (false), all_real (false), all_cmplx (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
202 all_mt (true), any_cell (false), any_sparse (false),
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
203 any_class (false), class_nm (), ok (false)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
204 { init (tm, tw); }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
205
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
206 ~tm_const (void) = default;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
207
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
208 octave_idx_type rows (void) const { return dv.elem (0); }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
209 octave_idx_type cols (void) const { return dv.elem (1); }
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 dim_vector dims (void) const { return dv; }
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 all_strings_p (void) const { return all_str; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
214 bool all_sq_strings_p (void) const { return all_sq_str; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
215 bool all_dq_strings_p (void) const { return all_dq_str; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
216 bool some_strings_p (void) const { return some_str; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
217 bool all_real_p (void) const { return all_real; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
218 bool all_complex_p (void) const { return all_cmplx; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
219 bool all_empty_p (void) const { return all_mt; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
220 bool any_cell_p (void) const { return any_cell; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
221 bool any_sparse_p (void) const { return any_sparse; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
222 bool any_class_p (void) const { return any_class; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
223 bool all_1x1_p (void) const { return all_1x1; }
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 std::string class_name (void) const { return class_nm; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
226
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
227 operator bool () const { return ok; }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
228
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
229 private:
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 dim_vector dv;
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 bool all_str;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
234 bool all_sq_str;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
235 bool all_dq_str;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
236 bool some_str;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
237 bool all_real;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
238 bool all_cmplx;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
239 bool all_mt;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
240 bool any_cell;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
241 bool any_sparse;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
242 bool any_class;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
243 bool all_1x1;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
244
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
245 std::string class_nm;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
246
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
247 bool ok;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
248
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
249 tm_const (void);
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 tm_const (const tm_const&);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
252
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
253 tm_const& operator = (const tm_const&);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
254
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
255 void init (const tree_matrix& tm, tree_evaluator *tw);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
256 };
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 template <typename TYPE, typename T>
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
259 void
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
260 single_type_concat (Array<T>& result, octave::tm_const& tmp)
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 octave_idx_type r = 0;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
263 octave_idx_type c = 0;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
264
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
265 for (octave::tm_row_const& row : tmp)
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 // Skip empty arrays to allow looser rules.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
268 if (row.dims ().any_zero ())
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
269 continue;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
270
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
271 for (auto& elt : row)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
272 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
273 octave_quit ();
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 TYPE ra = octave_value_extract<TYPE> (elt);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
276
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
277 // Skip empty arrays to allow looser rules.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
278
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
279 if (! ra.is_empty ())
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 result.insert (ra, r, c);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
282
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
283 c += ra.columns ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
284 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
285 }
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 r += row.rows ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
288 c = 0;
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 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
291
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
292 template <typename TYPE, typename T>
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
293 void
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
294 single_type_concat (Array<T>& result, const dim_vector& dv,
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
295 octave::tm_const& tmp)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
296 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
297 if (dv.any_zero ())
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 result = Array<T> (dv);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
300 return;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
301 }
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 if (tmp.length () == 1)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
304 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
305 // If possible, forward the operation to liboctave.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
306 // Single row.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
307 octave::tm_row_const& row = tmp.front ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
308 if (! (equal_types<T, char>::value || equal_types<T, octave_value>::value)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
309 && row.all_1x1_p ())
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 // Optimize all scalars case.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
312 result.clear (dv);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
313 assert (static_cast<size_t> (result.numel ()) == row.length ());
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
314 octave_idx_type i = 0;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
315 for (const auto& elt : row)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
316 result(i++) = octave_value_extract<T> (elt);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
317
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
318 return;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
319 }
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_idx_type ncols = row.length ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
322 octave_idx_type i = 0;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
323 OCTAVE_LOCAL_BUFFER (Array<T>, array_list, ncols);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
324
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
325 for (const auto& elt : row)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
326 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
327 octave_quit ();
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 array_list[i++] = octave_value_extract<TYPE> (elt);
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
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
332 result = Array<T>::cat (-2, ncols, array_list);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
333 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
334 else
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
335 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
336 result = Array<T> (dv);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
337 single_type_concat<TYPE> (result, tmp);
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 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
340
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
341 template <typename TYPE, typename T>
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
342 void
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
343 single_type_concat (Sparse<T>& result, const dim_vector& dv,
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
344 octave::tm_const& tmp)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
345 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
346 if (dv.any_zero ())
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 result = Sparse<T> (dv);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
349 return;
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 // Sparse matrices require preallocation for efficient indexing; besides,
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
353 // only horizontal concatenation can be efficiently handled by indexing.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
354 // So we just cat all rows through liboctave, then cat the final column.
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
355 octave_idx_type nrows = tmp.length ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
356 octave_idx_type j = 0;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
357 OCTAVE_LOCAL_BUFFER (Sparse<T>, sparse_row_list, nrows);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
358 for (octave::tm_row_const& row : 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_idx_type ncols = row.length ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
361 octave_idx_type i = 0;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
362 OCTAVE_LOCAL_BUFFER (Sparse<T>, sparse_list, ncols);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
363
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
364 for (auto& elt : row)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
365 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
366 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
367
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
368 sparse_list[i] = octave_value_extract<TYPE> (elt);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
369 i++;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
370 }
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 Sparse<T> stmp = Sparse<T>::cat (-2, ncols, sparse_list);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
373 sparse_row_list[j] = stmp;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
374 j++;
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
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
377 result = Sparse<T>::cat (-1, nrows, sparse_row_list);
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
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
380 template <typename MAP>
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
381 void
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
382 single_type_concat (octave_map& result, const dim_vector& dv,
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
383 octave::tm_const& tmp)
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 if (dv.any_zero ())
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 result = octave_map (dv);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
388 return;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
389 }
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 octave_idx_type nrows = tmp.length ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
392 octave_idx_type j = 0;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
393 OCTAVE_LOCAL_BUFFER (octave_map, map_row_list, nrows);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
394 for (octave::tm_row_const& row : tmp)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
395 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
396 octave_idx_type ncols = row.length ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
397 octave_idx_type i = 0;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
398 OCTAVE_LOCAL_BUFFER (MAP, map_list, ncols);
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 for (auto& elt : row)
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 octave_quit ();
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
403
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
404 map_list[i] = octave_value_extract<MAP> (elt);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
405 i++;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
406 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
407
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
408 octave_map mtmp = octave_map::cat (-2, ncols, map_list);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
409 map_row_list[j] = mtmp;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
410 j++;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
411 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
412
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
413 result = octave_map::cat (-1, nrows, map_row_list);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
414 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
415
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
416 template <typename TYPE>
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
417 octave_value
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
418 do_single_type_concat (const dim_vector& dv, octave::tm_const& tmp)
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
419 {
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
420 TYPE result;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
421
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
422 single_type_concat<TYPE> (result, dv, tmp);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
423
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
424 return result;
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
425 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
426
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
427 template <>
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
428 octave_value
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
429 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
430 octave::tm_const& tmp);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
431
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
432 extern octave_value do_class_concat (octave::tm_const& tmc);
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
433 }
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
434
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
diff changeset
435 #endif