Mercurial > octave
annotate libinterp/octave-value/ovl.h @ 22082:beac7654c86d
ovl: explicit conversion to appease Apple's clang 7.3.0.
author | Carnë Draug <carandraug@octave.org> |
---|---|
date | Sun, 10 Jul 2016 12:28:38 +0100 |
parents | 55c20a3e3e59 |
children | c88d2ecb721c |
rev | line source |
---|---|
498 | 1 /* |
2 | |
19697
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
19598
diff
changeset
|
3 Copyright (C) 1994-2015 John W. Eaton |
8580
188d38a553c7
further indexing optimization touches
Jaroslav Hajek <highegg@gmail.com>
parents:
8579
diff
changeset
|
4 Copyright (C) 2009 VZLU Prague |
498 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
498 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
498 | 21 |
22 */ | |
23 | |
20940
48b2ad5ee801
maint: Rename oct-obj.[cc|h] to ovl.[cc|h] for clarity.
Rik <rik@octave.org>
parents:
20830
diff
changeset
|
24 #if ! defined (octave_ovl_h) |
48b2ad5ee801
maint: Rename oct-obj.[cc|h] to ovl.[cc|h] for clarity.
Rik <rik@octave.org>
parents:
20830
diff
changeset
|
25 #define octave_ovl_h 1 |
504 | 26 |
21244
1473547f50f5
include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents:
21017
diff
changeset
|
27 #include "octave-config.h" |
1473547f50f5
include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents:
21017
diff
changeset
|
28 |
1968 | 29 #include <string> |
4591 | 30 #include <vector> |
22063
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
31 #include <initializer_list> |
1968 | 32 |
2943 | 33 #include "str-vec.h" |
8579
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
34 #include "Array.h" |
498 | 35 |
2369 | 36 #include "ov.h" |
8579
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
37 #include "Cell.h" |
498 | 38 |
737 | 39 class |
6109 | 40 OCTINTERP_API |
2872 | 41 octave_value_list |
508 | 42 { |
43 public: | |
44 | |
2086 | 45 octave_value_list (void) |
11581
6006ca07410d
another data member initialization fix
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
46 : data (), names () { } |
1968 | 47 |
9545
8670e55078fd
allow constructing octave_value_list from size
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
48 explicit octave_value_list (octave_idx_type n) |
11581
6006ca07410d
another data member initialization fix
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
49 : data (dim_vector (1, n)), names () { } |
9545
8670e55078fd
allow constructing octave_value_list from size
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
50 |
5275 | 51 octave_value_list (octave_idx_type n, const octave_value& val) |
11581
6006ca07410d
another data member initialization fix
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
52 : data (dim_vector (1, n), val), names () { } |
511 | 53 |
2086 | 54 octave_value_list (const octave_value& tc) |
11581
6006ca07410d
another data member initialization fix
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
55 : data (dim_vector (1, 1), tc), names () { } |
1968 | 56 |
8579
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
57 octave_value_list (const Array<octave_value>& d) |
11581
6006ca07410d
another data member initialization fix
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
58 : data (d.as_row ()), names () { } |
8579
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
59 |
22063
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
60 octave_value_list (const std::initializer_list<octave_value>& args) |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
61 : data (dim_vector (1, args.size ())), names () |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
62 { |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
63 octave_idx_type i = 0; |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
64 for (const octave_value& x : args) |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
65 data(i++) = x; |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
66 } |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
67 |
8579
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
68 octave_value_list (const Cell& tc) |
11581
6006ca07410d
another data member initialization fix
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
69 : data (tc.as_row ()), names () { } |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8523
diff
changeset
|
70 |
2086 | 71 octave_value_list (const octave_value_list& obj) |
4150 | 72 : data (obj.data), names (obj.names) { } |
508 | 73 |
8580
188d38a553c7
further indexing optimization touches
Jaroslav Hajek <highegg@gmail.com>
parents:
8579
diff
changeset
|
74 // Concatenation constructor. |
188d38a553c7
further indexing optimization touches
Jaroslav Hajek <highegg@gmail.com>
parents:
8579
diff
changeset
|
75 octave_value_list (const std::list<octave_value_list>&); |
188d38a553c7
further indexing optimization touches
Jaroslav Hajek <highegg@gmail.com>
parents:
8579
diff
changeset
|
76 |
4189 | 77 ~octave_value_list (void) { } |
78 | |
2086 | 79 octave_value_list& operator = (const octave_value_list& obj) |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
80 { |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
81 if (this != &obj) |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
82 { |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
83 data = obj.data; |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
84 names = obj.names; |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
85 } |
1968 | 86 |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
87 return *this; |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
88 } |
508 | 89 |
8579
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
90 Array<octave_value> array_value (void) const { return data; } |
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
91 |
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
92 Cell cell_value (void) const { return array_value (); } |
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
93 |
2872 | 94 // Assignment will resize on range errors. |
508 | 95 |
5275 | 96 octave_value& operator () (octave_idx_type n) { return elem (n); } |
1968 | 97 |
10075
84b0725f4b09
return class types by reference in const Array element access functions
Jaroslav Hajek <highegg@gmail.com>
parents:
9545
diff
changeset
|
98 const octave_value& operator () (octave_idx_type n) const { return elem (n); } |
526 | 99 |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
100 octave_idx_type length (void) const { return data.numel (); } |
2872 | 101 |
2951 | 102 bool empty (void) const { return length () == 0; } |
103 | |
14616
13cc11418393
improve handling of default resize fill value for arrays
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
104 void resize (octave_idx_type n, const octave_value& rfv = octave_value ()) |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
105 { |
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
106 data.resize (dim_vector (1, n), rfv); |
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
107 } |
2872 | 108 |
109 octave_value_list& prepend (const octave_value& val); | |
110 | |
111 octave_value_list& append (const octave_value& val); | |
112 | |
113 octave_value_list& append (const octave_value_list& lst); | |
114 | |
115 octave_value_list& reverse (void); | |
116 | |
6335 | 117 octave_value_list |
10659
8baff2aceabc
fix slicing value lists with name tags (bug #29960)
Jaroslav Hajek <highegg@gmail.com>
parents:
10350
diff
changeset
|
118 slice (octave_idx_type offset, octave_idx_type len, bool tags = false) const |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
119 { |
20940
48b2ad5ee801
maint: Rename oct-obj.[cc|h] to ovl.[cc|h] for clarity.
Rik <rik@octave.org>
parents:
20830
diff
changeset
|
120 // linear_slice uses begin/end indices instead of offset and length. |
48b2ad5ee801
maint: Rename oct-obj.[cc|h] to ovl.[cc|h] for clarity.
Rik <rik@octave.org>
parents:
20830
diff
changeset
|
121 // Avoid calling with upper bound out of range. |
18202
ec87e965c246
allow inputname to work correctly with feval (bug #35497)
John W. Eaton <jwe@octave.org>
parents:
17787
diff
changeset
|
122 // linear_slice handles the case of len < 0. |
ec87e965c246
allow inputname to work correctly with feval (bug #35497)
John W. Eaton <jwe@octave.org>
parents:
17787
diff
changeset
|
123 |
ec87e965c246
allow inputname to work correctly with feval (bug #35497)
John W. Eaton <jwe@octave.org>
parents:
17787
diff
changeset
|
124 octave_value_list retval |
ec87e965c246
allow inputname to work correctly with feval (bug #35497)
John W. Eaton <jwe@octave.org>
parents:
17787
diff
changeset
|
125 = data.linear_slice (offset, std::min (offset + len, length ())); |
ec87e965c246
allow inputname to work correctly with feval (bug #35497)
John W. Eaton <jwe@octave.org>
parents:
17787
diff
changeset
|
126 |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
127 if (tags && len > 0 && names.numel () > 0) |
18202
ec87e965c246
allow inputname to work correctly with feval (bug #35497)
John W. Eaton <jwe@octave.org>
parents:
17787
diff
changeset
|
128 retval.names = names.linear_slice (offset, std::min (offset + len, |
20232
a9574e3c6e9e
Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
129 names.numel ())); |
10659
8baff2aceabc
fix slicing value lists with name tags (bug #29960)
Jaroslav Hajek <highegg@gmail.com>
parents:
10350
diff
changeset
|
130 |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
131 return retval; |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
132 } |
8579
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
133 |
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
134 octave_value_list |
6335 | 135 splice (octave_idx_type offset, octave_idx_type len, |
10313 | 136 const octave_value_list& lst = octave_value_list ()) const; |
3195 | 137 |
2872 | 138 bool all_strings_p (void) const; |
1968 | 139 |
8455
fd11a08a9b31
disallow invalid {}-indexed assigments
Jaroslav Hajek <highegg@gmail.com>
parents:
8437
diff
changeset
|
140 bool all_scalars (void) const; |
fd11a08a9b31
disallow invalid {}-indexed assigments
Jaroslav Hajek <highegg@gmail.com>
parents:
8437
diff
changeset
|
141 |
10086
76df75b10c80
allow more cells in strfind/strrep + supply a general mechanism
Jaroslav Hajek <highegg@gmail.com>
parents:
10075
diff
changeset
|
142 bool any_cell (void) const; |
76df75b10c80
allow more cells in strfind/strrep + supply a general mechanism
Jaroslav Hajek <highegg@gmail.com>
parents:
10075
diff
changeset
|
143 |
5846 | 144 bool has_magic_colon (void) const; |
145 | |
21017
93748bcaec17
maint: Replace emtpy 'std::string ()' calls with "".
Rik <rik@octave.org>
parents:
20940
diff
changeset
|
146 string_vector make_argv (const std::string& = "") const; |
526 | 147 |
2943 | 148 void stash_name_tags (const string_vector& nm) { names = nm; } |
149 | |
150 string_vector name_tags (void) const { return names; } | |
151 | |
8523
ad3afaaa19c1
implement non-copying contiguous range indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
8455
diff
changeset
|
152 void make_storable_values (void); |
8150
283989f2da9b
make null assignment matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
8034
diff
changeset
|
153 |
20940
48b2ad5ee801
maint: Rename oct-obj.[cc|h] to ovl.[cc|h] for clarity.
Rik <rik@octave.org>
parents:
20830
diff
changeset
|
154 octave_value& xelem (octave_idx_type i) { return data.xelem (i); } |
10181
a668fbd32e34
improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
155 |
20940
48b2ad5ee801
maint: Rename oct-obj.[cc|h] to ovl.[cc|h] for clarity.
Rik <rik@octave.org>
parents:
20830
diff
changeset
|
156 void clear (void) { data.clear (); } |
10181
a668fbd32e34
improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
157 |
526 | 158 private: |
508 | 159 |
8579
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
160 Array<octave_value> data; |
2872 | 161 |
20940
48b2ad5ee801
maint: Rename oct-obj.[cc|h] to ovl.[cc|h] for clarity.
Rik <rik@octave.org>
parents:
20830
diff
changeset
|
162 // This list of strings can be used to tag each element of data with a name. |
48b2ad5ee801
maint: Rename oct-obj.[cc|h] to ovl.[cc|h] for clarity.
Rik <rik@octave.org>
parents:
20830
diff
changeset
|
163 // By default, it is empty. |
2943 | 164 string_vector names; |
165 | |
5275 | 166 octave_value& elem (octave_idx_type n) |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
167 { |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
168 if (n >= length ()) |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
169 resize (n + 1); |
4591 | 170 |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
171 return data(n); |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
172 } |
1968 | 173 |
10075
84b0725f4b09
return class types by reference in const Array element access functions
Jaroslav Hajek <highegg@gmail.com>
parents:
9545
diff
changeset
|
174 const octave_value& elem (octave_idx_type n) const |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
175 { return data(n); } |
13917
826f008c829b
* oct-obj.h, oct-obj.cc: Use macros to declare and define octave_allocator.
John W. Eaton <jwe@octave.org>
parents:
11586
diff
changeset
|
176 |
508 | 177 }; |
498 | 178 |
22063
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
179 //! Construct an octave_value_list with less typing. |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
180 /*! |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
181 Historically, this made it easier to create an octave_value_list |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
182 from multiple octave_value arguments. It is no longer useful since |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
183 octave_value_list has now a constructor accepting an initializer_list |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
184 so all it does is save some typing. The following are equivalent: |
15420
1249a615c91b
call built-in functions directly in GUI callbacks
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
185 |
22063
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
186 @code{.cc} |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
187 return octave_value_list ({ov0, ov1, ov2}); |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
188 return ovl (ov0, ov1, ov2); |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
189 @endcode |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
190 */ |
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
191 template<typename... OV_Args> |
15420
1249a615c91b
call built-in functions directly in GUI callbacks
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
192 inline octave_value_list |
22063
55c20a3e3e59
ovl: new constructor with initializer_list to reduce code duplication.
Carnë Draug <carandraug@octave.org>
parents:
21244
diff
changeset
|
193 ovl (const OV_Args&... args) |
15420
1249a615c91b
call built-in functions directly in GUI callbacks
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
194 { |
22082
beac7654c86d
ovl: explicit conversion to appease Apple's clang 7.3.0.
Carnë Draug <carandraug@octave.org>
parents:
22063
diff
changeset
|
195 return octave_value_list (std::initializer_list<octave_value> ({args...})); |
15420
1249a615c91b
call built-in functions directly in GUI callbacks
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
196 } |
1249a615c91b
call built-in functions directly in GUI callbacks
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
197 |
504 | 198 #endif |