comparison libinterp/octave-value/cdef-object.h @ 31607:aac27ad79be6 stable

maint: Re-indent code after switch to using namespace macros. * build-env.h, build-env.in.cc, Cell.h, __betainc__.cc, __eigs__.cc, __ftp__.cc, __ichol__.cc, __ilu__.cc, __isprimelarge__.cc, __magick_read__.cc, __pchip_deriv__.cc, amd.cc, base-text-renderer.cc, base-text-renderer.h, besselj.cc, bitfcns.cc, bsxfun.cc, c-file-ptr-stream.h, call-stack.cc, call-stack.h, ccolamd.cc, cellfun.cc, chol.cc, colamd.cc, dasrt.cc, data.cc, debug.cc, defaults.cc, defaults.h, det.cc, display.cc, display.h, dlmread.cc, dynamic-ld.cc, dynamic-ld.h, ellipj.cc, environment.cc, environment.h, error.cc, error.h, errwarn.h, event-manager.cc, event-manager.h, event-queue.cc, event-queue.h, fcn-info.cc, fcn-info.h, fft.cc, fft2.cc, file-io.cc, filter.cc, find.cc, ft-text-renderer.cc, ft-text-renderer.h, gcd.cc, gl-render.cc, gl-render.h, gl2ps-print.cc, gl2ps-print.h, graphics-toolkit.cc, graphics-toolkit.h, graphics.cc, gsvd.cc, gtk-manager.cc, gtk-manager.h, help.cc, help.h, hook-fcn.cc, hook-fcn.h, input.cc, input.h, interpreter-private.cc, interpreter-private.h, interpreter.cc, interpreter.h, inv.cc, jsondecode.cc, jsonencode.cc, latex-text-renderer.cc, latex-text-renderer.h, load-path.cc, load-path.h, load-save.cc, load-save.h, lookup.cc, ls-hdf5.cc, ls-mat4.cc, ls-mat5.cc, lsode.cc, lu.cc, mappers.cc, matrix_type.cc, max.cc, mex.cc, mexproto.h, mxarray.h, mxtypes.in.h, oct-errno.in.cc, oct-hdf5-types.cc, oct-hist.cc, oct-hist.h, oct-map.cc, oct-map.h, oct-opengl.h, oct-prcstrm.h, oct-process.cc, oct-process.h, oct-stdstrm.h, oct-stream.cc, oct-stream.h, oct-strstrm.h, octave-default-image.h, ordqz.cc, ordschur.cc, pager.cc, pager.h, pinv.cc, pow2.cc, pr-output.cc, psi.cc, qr.cc, quadcc.cc, rand.cc, regexp.cc, settings.cc, settings.h, sighandlers.cc, sighandlers.h, sparse-xpow.cc, sqrtm.cc, stack-frame.cc, stack-frame.h, stream-euler.cc, strfns.cc, svd.cc, syminfo.cc, syminfo.h, symrcm.cc, symrec.cc, symrec.h, symscope.cc, symscope.h, symtab.cc, symtab.h, sysdep.cc, sysdep.h, text-engine.cc, text-engine.h, text-renderer.cc, text-renderer.h, time.cc, toplev.cc, typecast.cc, url-handle-manager.cc, url-handle-manager.h, urlwrite.cc, utils.cc, utils.h, variables.cc, variables.h, xdiv.cc, __delaunayn__.cc, __init_fltk__.cc, __init_gnuplot__.cc, __ode15__.cc, __voronoi__.cc, audioread.cc, convhulln.cc, gzip.cc, cdef-class.cc, cdef-class.h, cdef-fwd.h, cdef-manager.cc, cdef-manager.h, cdef-method.cc, cdef-method.h, cdef-object.cc, cdef-object.h, cdef-package.cc, cdef-package.h, cdef-property.cc, cdef-property.h, cdef-utils.cc, cdef-utils.h, ov-base-diag.cc, ov-base-int.cc, ov-base-mat.cc, ov-base-mat.h, ov-base-scalar.cc, ov-base.cc, ov-base.h, ov-bool-mat.cc, ov-bool-mat.h, ov-bool-sparse.cc, ov-bool.cc, ov-builtin.h, ov-cell.cc, ov-ch-mat.cc, ov-class.cc, ov-class.h, ov-classdef.cc, ov-classdef.h, ov-complex.cc, ov-cx-diag.cc, ov-cx-mat.cc, ov-cx-sparse.cc, ov-dld-fcn.cc, ov-dld-fcn.h, ov-fcn-handle.cc, ov-fcn-handle.h, ov-fcn.h, ov-float.cc, ov-flt-complex.cc, ov-flt-cx-diag.cc, ov-flt-cx-mat.cc, ov-flt-re-diag.cc, ov-flt-re-mat.cc, ov-flt-re-mat.h, ov-intx.h, ov-java.cc, ov-lazy-idx.cc, ov-legacy-range.cc, ov-magic-int.cc, ov-mex-fcn.cc, ov-mex-fcn.h, ov-null-mat.cc, ov-perm.cc, ov-range.cc, ov-re-diag.cc, ov-re-mat.cc, ov-re-mat.h, ov-re-sparse.cc, ov-scalar.cc, ov-str-mat.cc, ov-struct.cc, ov-typeinfo.cc, ov-typeinfo.h, ov-usr-fcn.cc, ov-usr-fcn.h, ov.cc, ov.h, ovl.h, octave.cc, octave.h, op-b-sbm.cc, op-bm-sbm.cc, op-cs-scm.cc, op-fm-fcm.cc, op-fs-fcm.cc, op-s-scm.cc, op-scm-cs.cc, op-scm-s.cc, op-sm-cs.cc, ops.h, anon-fcn-validator.cc, anon-fcn-validator.h, bp-table.cc, bp-table.h, comment-list.cc, comment-list.h, filepos.h, lex.h, oct-lvalue.cc, oct-lvalue.h, parse.h, profiler.cc, profiler.h, pt-anon-scopes.cc, pt-anon-scopes.h, pt-arg-list.cc, pt-arg-list.h, pt-args-block.cc, pt-args-block.h, pt-array-list.cc, pt-array-list.h, pt-assign.cc, pt-assign.h, pt-binop.cc, pt-binop.h, pt-bp.cc, pt-bp.h, pt-cbinop.cc, pt-cbinop.h, pt-cell.cc, pt-cell.h, pt-check.cc, pt-check.h, pt-classdef.cc, pt-classdef.h, 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-id.cc, pt-id.h, pt-idx.cc, pt-idx.h, pt-jump.h, pt-loop.cc, pt-loop.h, pt-mat.cc, pt-mat.h, pt-misc.cc, pt-misc.h, pt-pr-code.cc, pt-pr-code.h, pt-select.cc, pt-select.h, pt-spmd.cc, pt-spmd.h, pt-stmt.cc, pt-stmt.h, pt-tm-const.cc, pt-tm-const.h, pt-unop.cc, pt-unop.h, pt-walk.cc, pt-walk.h, pt.cc, pt.h, token.cc, token.h, Range.cc, Range.h, idx-vector.cc, idx-vector.h, range-fwd.h, CollocWt.cc, CollocWt.h, aepbalance.cc, aepbalance.h, chol.cc, chol.h, gepbalance.cc, gepbalance.h, gsvd.cc, gsvd.h, hess.cc, hess.h, lo-mappers.cc, lo-mappers.h, lo-specfun.cc, lo-specfun.h, lu.cc, lu.h, oct-convn.cc, oct-convn.h, oct-fftw.cc, oct-fftw.h, oct-norm.cc, oct-norm.h, oct-rand.cc, oct-rand.h, oct-spparms.cc, oct-spparms.h, qr.cc, qr.h, qrp.cc, qrp.h, randgamma.cc, randgamma.h, randmtzig.cc, randmtzig.h, randpoisson.cc, randpoisson.h, schur.cc, schur.h, sparse-chol.cc, sparse-chol.h, sparse-lu.cc, sparse-lu.h, sparse-qr.cc, sparse-qr.h, svd.cc, svd.h, child-list.cc, child-list.h, dir-ops.cc, dir-ops.h, file-ops.cc, file-ops.h, file-stat.cc, file-stat.h, lo-sysdep.cc, lo-sysdep.h, lo-sysinfo.cc, lo-sysinfo.h, mach-info.cc, mach-info.h, oct-env.cc, oct-env.h, oct-group.cc, oct-group.h, oct-password.cc, oct-password.h, oct-syscalls.cc, oct-syscalls.h, oct-time.cc, oct-time.h, oct-uname.cc, oct-uname.h, action-container.cc, action-container.h, base-list.h, cmd-edit.cc, cmd-edit.h, cmd-hist.cc, cmd-hist.h, f77-fcn.h, file-info.cc, file-info.h, lo-array-errwarn.cc, lo-array-errwarn.h, lo-hash.cc, lo-hash.h, lo-ieee.h, lo-regexp.cc, lo-regexp.h, lo-utils.cc, lo-utils.h, oct-base64.cc, oct-base64.h, oct-glob.cc, oct-glob.h, oct-inttypes.h, oct-mutex.cc, oct-mutex.h, oct-refcount.h, oct-shlib.cc, oct-shlib.h, oct-sparse.cc, oct-sparse.h, oct-string.h, octave-preserve-stream-state.h, pathsearch.cc, pathsearch.h, quit.cc, quit.h, unwind-prot.cc, unwind-prot.h, url-transfer.cc, url-transfer.h: Re-indent code after switch to using namespace macros.
author Rik <rik@octave.org>
date Thu, 01 Dec 2022 18:02:15 -0800
parents e88a07dec498
children 597f3ee61a48
comparison
equal deleted inserted replaced
31605:e88a07dec498 31607:aac27ad79be6
39 #include "ov.h" 39 #include "ov.h"
40 #include "ovl.h" 40 #include "ovl.h"
41 41
42 OCTAVE_BEGIN_NAMESPACE(octave) 42 OCTAVE_BEGIN_NAMESPACE(octave)
43 43
44 // This is mainly a bootstrap class to declare the expected interface. 44 // This is mainly a bootstrap class to declare the expected interface.
45 // The actual base class is cdef_class_base, which is declared after 45 // The actual base class is cdef_class_base, which is declared after
46 // cdef_object, such that it can contain cdef_object objects. 46 // cdef_object, such that it can contain cdef_object objects.
47 47
48 class 48 class
49 OCTINTERP_API 49 OCTINTERP_API
50 cdef_object_rep 50 cdef_object_rep
51 { 51 {
52 public: 52 public:
53 53
54 friend class cdef_object; 54 friend class cdef_object;
55 55
56 cdef_object_rep (void) : m_count (1) { } 56 cdef_object_rep (void) : m_count (1) { }
57 57
58 cdef_object_rep& operator = (const cdef_object_rep&) = delete; 58 cdef_object_rep& operator = (const cdef_object_rep&) = delete;
59 59
60 virtual ~cdef_object_rep (void) = default; 60 virtual ~cdef_object_rep (void) = default;
61 61
62 virtual cdef_class get_class (void) const; 62 virtual cdef_class get_class (void) const;
63 63
64 virtual void set_class (const cdef_class&) 64 virtual void set_class (const cdef_class&)
65 { 65 {
66 err_invalid_object ("set_class"); 66 err_invalid_object ("set_class");
67 } 67 }
68 68
69 virtual cdef_object_rep * clone (void) const 69 virtual cdef_object_rep * clone (void) const
70 { 70 {
71 err_invalid_object ("clone"); 71 err_invalid_object ("clone");
72 } 72 }
73 73
74 virtual cdef_object_rep * empty_clone (void) const 74 virtual cdef_object_rep * empty_clone (void) const
75 { 75 {
76 err_invalid_object ("empty_clone"); 76 err_invalid_object ("empty_clone");
77 } 77 }
78 78
79 virtual cdef_object_rep * copy (void) const 79 virtual cdef_object_rep * copy (void) const
80 { 80 {
81 err_invalid_object ("copy"); 81 err_invalid_object ("copy");
82 } 82 }
83 83
84 virtual cdef_object_rep * make_array (void) const 84 virtual cdef_object_rep * make_array (void) const
85 { 85 {
86 err_invalid_object ("make_array"); 86 err_invalid_object ("make_array");
87 } 87 }
88 88
89 virtual bool is_array (void) const { return false; } 89 virtual bool is_array (void) const { return false; }
90 90
91 virtual bool is_value_object (void) const { return false; } 91 virtual bool is_value_object (void) const { return false; }
92 92
93 virtual bool is_handle_object (void) const { return false; } 93 virtual bool is_handle_object (void) const { return false; }
94 94
95 virtual bool is_meta_object (void) const { return false; } 95 virtual bool is_meta_object (void) const { return false; }
96 96
97 virtual Array<cdef_object> array_value (void) const 97 virtual Array<cdef_object> array_value (void) const
98 { 98 {
99 err_invalid_object ("array_value"); 99 err_invalid_object ("array_value");
100 } 100 }
101 101
102 virtual void put (const std::string&, const octave_value&) 102 virtual void put (const std::string&, const octave_value&)
103 { err_invalid_object ("put"); } 103 { err_invalid_object ("put"); }
104 104
105 virtual octave_value get (const std::string&) const 105 virtual octave_value get (const std::string&) const
106 { 106 {
107 err_invalid_object ("get"); 107 err_invalid_object ("get");
108 } 108 }
109 109
110 virtual void set_property (octave_idx_type, const std::string&, 110 virtual void set_property (octave_idx_type, const std::string&,
111 const octave_value&) 111 const octave_value&)
112 { 112 {
113 err_invalid_object ("set_property"); 113 err_invalid_object ("set_property");
114 } 114 }
115 115
116 virtual octave_value get_property (octave_idx_type, const std::string&) const 116 virtual octave_value get_property (octave_idx_type, const std::string&) const
117 { 117 {
118 err_invalid_object ("get_property"); 118 err_invalid_object ("get_property");
119 } 119 }
120 120
121 virtual void break_closure_cycles (const std::shared_ptr<stack_frame>&) 121 virtual void break_closure_cycles (const std::shared_ptr<stack_frame>&)
122 { 122 {
123 err_invalid_object ("break_closure_cycles"); 123 err_invalid_object ("break_closure_cycles");
124 } 124 }
125 125
126 virtual octave_value_list 126 virtual octave_value_list
127 subsref (const std::string&, const std::list<octave_value_list>&, 127 subsref (const std::string&, const std::list<octave_value_list>&,
128 int, std::size_t&, const cdef_class&, bool) 128 int, std::size_t&, const cdef_class&, bool)
129 { 129 {
130 err_invalid_object ("subsref"); 130 err_invalid_object ("subsref");
131 } 131 }
132 132
133 virtual octave_value 133 virtual octave_value
134 subsasgn (const std::string&, const std::list<octave_value_list>&, 134 subsasgn (const std::string&, const std::list<octave_value_list>&,
135 const octave_value&) 135 const octave_value&)
136 { 136 {
137 err_invalid_object ("subsasgn"); 137 err_invalid_object ("subsasgn");
138 } 138 }
139 139
140 virtual string_vector map_keys (void) const; 140 virtual string_vector map_keys (void) const;
141 141
142 virtual bool is_valid (void) const { return false; } 142 virtual bool is_valid (void) const { return false; }
143 143
144 OCTINTERP_API std::string class_name (void) const; 144 OCTINTERP_API std::string class_name (void) const;
145 145
146 virtual void mark_for_construction (const cdef_class&) 146 virtual void mark_for_construction (const cdef_class&)
147 { 147 {
148 err_invalid_object ("mark_for_construction"); 148 err_invalid_object ("mark_for_construction");
149 } 149 }
150 150
151 virtual bool is_constructed_for (const cdef_class&) const 151 virtual bool is_constructed_for (const cdef_class&) const
152 { 152 {
153 err_invalid_object ("is_constructed_for"); 153 err_invalid_object ("is_constructed_for");
154 } 154 }
155 155
156 virtual bool is_partially_constructed_for (const cdef_class&) const 156 virtual bool is_partially_constructed_for (const cdef_class&) const
157 { 157 {
158 err_invalid_object ("is_partially_constructed_for"); 158 err_invalid_object ("is_partially_constructed_for");
159 } 159 }
160 160
161 virtual void mark_as_constructed (void) 161 virtual void mark_as_constructed (void)
162 { 162 {
163 err_invalid_object ("mark_as_constructed"); 163 err_invalid_object ("mark_as_constructed");
164 } 164 }
165 165
166 virtual void mark_as_constructed (const cdef_class&) 166 virtual void mark_as_constructed (const cdef_class&)
167 { 167 {
168 err_invalid_object ("mark_as_constructed"); 168 err_invalid_object ("mark_as_constructed");
169 } 169 }
170 170
171 virtual bool is_constructed (void) const 171 virtual bool is_constructed (void) const
172 { 172 {
173 err_invalid_object ("is_constructed"); 173 err_invalid_object ("is_constructed");
174 } 174 }
175 175
176 virtual octave_idx_type static_count (void) const { return 0; } 176 virtual octave_idx_type static_count (void) const { return 0; }
177 177
178 virtual void destroy (void) { delete this; } 178 virtual void destroy (void) { delete this; }
179 179
180 OCTINTERP_API void release (const cdef_object& obj); 180 OCTINTERP_API void release (const cdef_object& obj);
181 181
182 virtual dim_vector dims (void) const { return dim_vector (); } 182 virtual dim_vector dims (void) const { return dim_vector (); }
183 183
184 protected: 184 protected:
185 185
186 // Reference count 186 // Reference count
187 refcount<octave_idx_type> m_count; 187 refcount<octave_idx_type> m_count;
188 188
189 // Restricted copying. 189 // Restricted copying.
190 190
191 cdef_object_rep (const cdef_object_rep&) : m_count (1) { } 191 cdef_object_rep (const cdef_object_rep&) : m_count (1) { }
192 192
193 private: 193 private:
194 194
195 OCTAVE_NORETURN void err_invalid_object (const char *who) const 195 OCTAVE_NORETURN void err_invalid_object (const char *who) const
196 { 196 {
197 error ("%s: invalid object", who); 197 error ("%s: invalid object", who);
198 } 198 }
199 }; 199 };
200 200
201 class 201 class
202 OCTINTERP_API 202 OCTINTERP_API
203 cdef_object 203 cdef_object
204 { 204 {
205 public: 205 public:
206 206
207 // FIXME: use a null object? 207 // FIXME: use a null object?
208 cdef_object (void) : m_rep (new cdef_object_rep ()) { } 208 cdef_object (void) : m_rep (new cdef_object_rep ()) { }
209 209
210 cdef_object (const cdef_object& obj) : m_rep (obj.m_rep) 210 cdef_object (const cdef_object& obj) : m_rep (obj.m_rep)
211 { m_rep->m_count++; } 211 { m_rep->m_count++; }
212 212
213 cdef_object (cdef_object_rep *r) : m_rep (r) { } 213 cdef_object (cdef_object_rep *r) : m_rep (r) { }
214 214
215 virtual ~cdef_object (void) { m_rep->release (*this); } 215 virtual ~cdef_object (void) { m_rep->release (*this); }
216 216
217 cdef_object& operator = (const cdef_object& obj) 217 cdef_object& operator = (const cdef_object& obj)
218 { 218 {
219 if (m_rep != obj.m_rep) 219 if (m_rep != obj.m_rep)
220 { 220 {
221 m_rep->release (*this); 221 m_rep->release (*this);
222 222
223 m_rep = obj.m_rep; 223 m_rep = obj.m_rep;
224 m_rep->m_count++; 224 m_rep->m_count++;
225 } 225 }
226 226
227 return *this; 227 return *this;
228 } 228 }
229 229
230 OCTINTERP_API cdef_class get_class (void) const; 230 OCTINTERP_API cdef_class get_class (void) const;
231 231
232 void set_class (const cdef_class& cls) { m_rep->set_class (cls); } 232 void set_class (const cdef_class& cls) { m_rep->set_class (cls); }
233 233
234 std::string class_name (void) const { return m_rep->class_name (); } 234 std::string class_name (void) const { return m_rep->class_name (); }
235 235
236 cdef_object clone (void) const { return cdef_object (m_rep->clone ()); } 236 cdef_object clone (void) const { return cdef_object (m_rep->clone ()); }
237 237
238 cdef_object empty_clone (void) const 238 cdef_object empty_clone (void) const
239 { 239 {
240 return cdef_object (m_rep->empty_clone ()); 240 return cdef_object (m_rep->empty_clone ());
241 } 241 }
242 242
243 dim_vector dims (void) const { return m_rep->dims (); } 243 dim_vector dims (void) const { return m_rep->dims (); }
244 244
245 cdef_object make_array (void) const 245 cdef_object make_array (void) const
246 { 246 {
247 return cdef_object (m_rep->make_array ()); 247 return cdef_object (m_rep->make_array ());
248 } 248 }
249 249
250 cdef_object copy (void) const { return cdef_object (m_rep->copy ()); } 250 cdef_object copy (void) const { return cdef_object (m_rep->copy ()); }
251 251
252 bool is_array (void) const { return m_rep->is_array (); } 252 bool is_array (void) const { return m_rep->is_array (); }
253 253
254 bool is_value_object (void) const { return m_rep->is_value_object (); } 254 bool is_value_object (void) const { return m_rep->is_value_object (); }
255 255
256 bool is_handle_object (void) const { return m_rep->is_handle_object (); } 256 bool is_handle_object (void) const { return m_rep->is_handle_object (); }
257 257
258 bool is_meta_object (void) const { return m_rep->is_meta_object (); } 258 bool is_meta_object (void) const { return m_rep->is_meta_object (); }
259 259
260 Array<cdef_object> array_value (void) const 260 Array<cdef_object> array_value (void) const
261 { return m_rep->array_value (); } 261 { return m_rep->array_value (); }
262 262
263 void put (const std::string& pname, const octave_value& val) 263 void put (const std::string& pname, const octave_value& val)
264 { 264 {
265 m_rep->put (pname, val); 265 m_rep->put (pname, val);
266 } 266 }
267 267
268 octave_value get (const std::string& pname) const 268 octave_value get (const std::string& pname) const
269 { 269 {
270 return m_rep->get (pname); 270 return m_rep->get (pname);
271 } 271 }
272 272
273 void set_property (octave_idx_type idx, const std::string& pname, 273 void set_property (octave_idx_type idx, const std::string& pname,
274 const octave_value& pval) 274 const octave_value& pval)
275 { 275 {
276 return m_rep->set_property (idx, pname, pval); 276 return m_rep->set_property (idx, pname, pval);
277 } 277 }
278 278
279 octave_value 279 octave_value
280 get_property (octave_idx_type idx, const std::string& pname) const 280 get_property (octave_idx_type idx, const std::string& pname) const
281 { 281 {
282 return m_rep->get_property (idx, pname); 282 return m_rep->get_property (idx, pname);
283 } 283 }
284 284
285 void break_closure_cycles (const std::shared_ptr<stack_frame>& frame) 285 void break_closure_cycles (const std::shared_ptr<stack_frame>& frame)
286 { 286 {
287 m_rep->break_closure_cycles (frame); 287 m_rep->break_closure_cycles (frame);
288 } 288 }
289 289
290 octave_value_list 290 octave_value_list
291 subsref (const std::string& type, const std::list<octave_value_list>& idx, 291 subsref (const std::string& type, const std::list<octave_value_list>& idx,
292 int nargout, std::size_t& skip, const cdef_class& context, 292 int nargout, std::size_t& skip, const cdef_class& context,
293 bool auto_add = false) 293 bool auto_add = false)
294 { 294 {
295 return m_rep->subsref (type, idx, nargout, skip, context, auto_add); 295 return m_rep->subsref (type, idx, nargout, skip, context, auto_add);
296 } 296 }
297 297
298 octave_value 298 octave_value
299 subsasgn (const std::string& type, const std::list<octave_value_list>& idx, 299 subsasgn (const std::string& type, const std::list<octave_value_list>& idx,
300 const octave_value& rhs, int ignore_copies = 0) 300 const octave_value& rhs, int ignore_copies = 0)
301 { 301 {
302 make_unique (ignore_copies); 302 make_unique (ignore_copies);
303 return m_rep->subsasgn (type, idx, rhs); 303 return m_rep->subsasgn (type, idx, rhs);
304 } 304 }
305 305
306 string_vector map_keys (void) const { return m_rep->map_keys (); } 306 string_vector map_keys (void) const { return m_rep->map_keys (); }
307 307
308 OCTINTERP_API octave_map map_value (void) const; 308 OCTINTERP_API octave_map map_value (void) const;
309 309
310 const cdef_object_rep * get_rep (void) const { return m_rep; } 310 const cdef_object_rep * get_rep (void) const { return m_rep; }
311 311
312 bool ok (void) const { return m_rep->is_valid (); } 312 bool ok (void) const { return m_rep->is_valid (); }
313 313
314 void mark_for_construction (const cdef_class& cls) 314 void mark_for_construction (const cdef_class& cls)
315 { 315 {
316 m_rep->mark_for_construction (cls); 316 m_rep->mark_for_construction (cls);
317 } 317 }
318 318
319 bool is_constructed (void) const { return m_rep->is_constructed (); } 319 bool is_constructed (void) const { return m_rep->is_constructed (); }
320 320
321 bool is_constructed_for (const cdef_class& cls) const 321 bool is_constructed_for (const cdef_class& cls) const
322 { 322 {
323 return m_rep->is_constructed_for (cls); 323 return m_rep->is_constructed_for (cls);
324 } 324 }
325 325
326 bool is_partially_constructed_for (const cdef_class& cls) const 326 bool is_partially_constructed_for (const cdef_class& cls) const
327 { 327 {
328 return m_rep->is_partially_constructed_for (cls); 328 return m_rep->is_partially_constructed_for (cls);
329 } 329 }
330 330
331 void mark_as_constructed (void) { m_rep->mark_as_constructed (); } 331 void mark_as_constructed (void) { m_rep->mark_as_constructed (); }
332 332
333 void mark_as_constructed (const cdef_class& cls) 333 void mark_as_constructed (const cdef_class& cls)
334 { m_rep->mark_as_constructed (cls); } 334 { m_rep->mark_as_constructed (cls); }
335 335
336 bool is (const cdef_object& obj) const { return m_rep == obj.m_rep; } 336 bool is (const cdef_object& obj) const { return m_rep == obj.m_rep; }
337 337
338 protected: 338 protected:
339 339
340 cdef_object_rep * get_rep (void) { return m_rep; } 340 cdef_object_rep * get_rep (void) { return m_rep; }
341 341
342 void make_unique (int ignore_copies) 342 void make_unique (int ignore_copies)
343 { 343 {
344 if (m_rep->m_count > ignore_copies + 1) 344 if (m_rep->m_count > ignore_copies + 1)
345 *this = clone (); 345 *this = clone ();
346 } 346 }
347 347
348 private: 348 private:
349 349
350 cdef_object_rep *m_rep; 350 cdef_object_rep *m_rep;
351 }; 351 };
352 352
353 class 353 class
354 OCTINTERP_API 354 OCTINTERP_API
355 cdef_object_base : public cdef_object_rep 355 cdef_object_base : public cdef_object_rep
356 { 356 {
357 public: 357 public:
358 358
359 cdef_object_base (void) 359 cdef_object_base (void)
360 : cdef_object_rep (), m_klass () 360 : cdef_object_rep (), m_klass ()
361 { } 361 { }
362 362
363 cdef_object_base& operator = (const cdef_object_base&) = delete; 363 cdef_object_base& operator = (const cdef_object_base&) = delete;
364 364
365 ~cdef_object_base (void) { } 365 ~cdef_object_base (void) { }
366 366
367 OCTINTERP_API cdef_class get_class (void) const; 367 OCTINTERP_API cdef_class get_class (void) const;
368 368
369 OCTINTERP_API void set_class (const cdef_class& cls); 369 OCTINTERP_API void set_class (const cdef_class& cls);
370 370
371 cdef_object_rep * empty_clone (void) const 371 cdef_object_rep * empty_clone (void) const
372 { 372 {
373 return new cdef_object_base (*this); 373 return new cdef_object_base (*this);
374 } 374 }
375 375
376 OCTINTERP_API cdef_object_rep * make_array (void) const; 376 OCTINTERP_API cdef_object_rep * make_array (void) const;
377 377
378 protected: 378 protected:
379 379
380 // Restricted copying! 380 // Restricted copying!
381 cdef_object_base (const cdef_object_base& obj) 381 cdef_object_base (const cdef_object_base& obj)
382 : cdef_object_rep (obj), m_klass (obj.m_klass) 382 : cdef_object_rep (obj), m_klass (obj.m_klass)
383 { } 383 { }
384 384
385 private: 385 private:
386 386
387 // The class of the object 387 // The class of the object
388 cdef_object m_klass; 388 cdef_object m_klass;
389 }; 389 };
390 390
391 class 391 class
392 OCTINTERP_API 392 OCTINTERP_API
393 cdef_object_array : public cdef_object_base 393 cdef_object_array : public cdef_object_base
394 { 394 {
395 public: 395 public:
396 396
397 cdef_object_array (void) : cdef_object_base () { } 397 cdef_object_array (void) : cdef_object_base () { }
398 398
399 cdef_object_array (const Array<cdef_object>& a) 399 cdef_object_array (const Array<cdef_object>& a)
400 : cdef_object_base (), m_array (a) 400 : cdef_object_base (), m_array (a)
401 { } 401 { }
402 402
403 cdef_object_array& operator = (const cdef_object_array&) = delete; 403 cdef_object_array& operator = (const cdef_object_array&) = delete;
404 404
405 ~cdef_object_array (void) = default; 405 ~cdef_object_array (void) = default;
406 406
407 cdef_object_rep * clone (void) const 407 cdef_object_rep * clone (void) const
408 { 408 {
409 return new cdef_object_array (*this); 409 return new cdef_object_array (*this);
410 } 410 }
411 411
412 dim_vector dims (void) const { return m_array.dims (); } 412 dim_vector dims (void) const { return m_array.dims (); }
413 413
414 bool is_valid (void) const { return true; } 414 bool is_valid (void) const { return true; }
415 415
416 bool is_array (void) const { return true; } 416 bool is_array (void) const { return true; }
417 417
418 Array<cdef_object> array_value (void) const { return m_array; } 418 Array<cdef_object> array_value (void) const { return m_array; }
419 419
420 OCTINTERP_API octave_value_list 420 OCTINTERP_API octave_value_list
421 subsref (const std::string& type, const std::list<octave_value_list>& idx, 421 subsref (const std::string& type, const std::list<octave_value_list>& idx,
422 int nargout, std::size_t& skip, const cdef_class& context, 422 int nargout, std::size_t& skip, const cdef_class& context,
423 bool auto_add); 423 bool auto_add);
424 424
425 OCTINTERP_API octave_value 425 OCTINTERP_API octave_value
426 subsasgn (const std::string& type, const std::list<octave_value_list>& idx, 426 subsasgn (const std::string& type, const std::list<octave_value_list>& idx,
427 const octave_value& rhs); 427 const octave_value& rhs);
428 428
429 void set_property (octave_idx_type idx, const std::string& pname, 429 void set_property (octave_idx_type idx, const std::string& pname,
430 const octave_value& pval) 430 const octave_value& pval)
431 { 431 {
432 cdef_object& tmp = m_array.elem (idx); 432 cdef_object& tmp = m_array.elem (idx);
433 433
434 return tmp.put (pname, pval); 434 return tmp.put (pname, pval);
435 } 435 }
436 436
437 octave_value 437 octave_value
438 get_property (octave_idx_type idx, const std::string& pname) const 438 get_property (octave_idx_type idx, const std::string& pname) const
439 { 439 {
440 cdef_object tmp = m_array.elem (idx); 440 cdef_object tmp = m_array.elem (idx);
441 441
442 return tmp.get (pname); 442 return tmp.get (pname);
443 } 443 }
444 444
445 private: 445 private:
446 446
447 Array<cdef_object> m_array; 447 Array<cdef_object> m_array;
448 448
449 void fill_empty_values (void) { fill_empty_values (m_array); } 449 void fill_empty_values (void) { fill_empty_values (m_array); }
450 450
451 OCTINTERP_API void fill_empty_values (Array<cdef_object>& arr); 451 OCTINTERP_API void fill_empty_values (Array<cdef_object>& arr);
452 452
453 // Private copying! 453 // Private copying!
454 cdef_object_array (const cdef_object_array& obj) 454 cdef_object_array (const cdef_object_array& obj)
455 : cdef_object_base (obj), m_array (obj.m_array) 455 : cdef_object_base (obj), m_array (obj.m_array)
456 { } 456 { }
457 }; 457 };
458 458
459 class 459 class
460 OCTINTERP_API 460 OCTINTERP_API
461 cdef_object_scalar : public cdef_object_base 461 cdef_object_scalar : public cdef_object_base
462 { 462 {
463 public: 463 public:
464 464
465 cdef_object_scalar (void) : cdef_object_base () { } 465 cdef_object_scalar (void) : cdef_object_base () { }
466 466
467 cdef_object_scalar& operator = (const cdef_object_scalar&) = delete; 467 cdef_object_scalar& operator = (const cdef_object_scalar&) = delete;
468 468
469 ~cdef_object_scalar (void) = default; 469 ~cdef_object_scalar (void) = default;
470 470
471 dim_vector dims (void) const { return dim_vector (1, 1); } 471 dim_vector dims (void) const { return dim_vector (1, 1); }
472 472
473 void break_closure_cycles (const std::shared_ptr<stack_frame>& frame); 473 void break_closure_cycles (const std::shared_ptr<stack_frame>& frame);
474 474
475 void put (const std::string& pname, const octave_value& val) 475 void put (const std::string& pname, const octave_value& val)
476 { 476 {
477 m_map.assign (pname, val); 477 m_map.assign (pname, val);
478 } 478 }
479 479
480 octave_value get (const std::string& pname) const 480 octave_value get (const std::string& pname) const
481 { 481 {
482 Cell val = m_map.contents (pname); 482 Cell val = m_map.contents (pname);
483 483
484 if (val.numel () < 1) 484 if (val.numel () < 1)
485 error ("get: unknown slot: %s", pname.c_str ()); 485 error ("get: unknown slot: %s", pname.c_str ());
486 486
487 return val(0, 0); 487 return val(0, 0);
488 } 488 }
489 489
490 void set_property (octave_idx_type idx, const std::string& pname, 490 void set_property (octave_idx_type idx, const std::string& pname,
491 const octave_value& pval) 491 const octave_value& pval)
492 { 492 {
493 if (idx != 0) 493 if (idx != 0)
494 error ("invalid index"); // FIXME 494 error ("invalid index"); // FIXME
495 495
496 put (pname, pval); 496 put (pname, pval);
497 } 497 }
498 498
499 octave_value 499 octave_value
500 get_property (octave_idx_type idx, const std::string& pname) const 500 get_property (octave_idx_type idx, const std::string& pname) const
501 { 501 {
502 if (idx != 0) 502 if (idx != 0)
503 error ("invalid index"); // FIXME 503 error ("invalid index"); // FIXME
504 504
505 return get (pname); 505 return get (pname);
506 } 506 }
507 507
508 OCTINTERP_API octave_value_list 508 OCTINTERP_API octave_value_list
509 subsref (const std::string& type, const std::list<octave_value_list>& idx, 509 subsref (const std::string& type, const std::list<octave_value_list>& idx,
510 int nargout, std::size_t& skip, const cdef_class& context, 510 int nargout, std::size_t& skip, const cdef_class& context,
511 bool auto_add); 511 bool auto_add);
512 512
513 OCTINTERP_API octave_value 513 OCTINTERP_API octave_value
514 subsasgn (const std::string& type, const std::list<octave_value_list>& idx, 514 subsasgn (const std::string& type, const std::list<octave_value_list>& idx,
515 const octave_value& rhs); 515 const octave_value& rhs);
516 516
517 OCTINTERP_API void mark_for_construction (const cdef_class&); 517 OCTINTERP_API void mark_for_construction (const cdef_class&);
518 518
519 OCTINTERP_API bool is_constructed_for (const cdef_class& cls) const; 519 OCTINTERP_API bool is_constructed_for (const cdef_class& cls) const;
520 520
521 OCTINTERP_API bool 521 OCTINTERP_API bool
522 is_partially_constructed_for (const cdef_class& cls) const; 522 is_partially_constructed_for (const cdef_class& cls) const;
523 523
524 void mark_as_constructed (void) { m_ctor_list.clear (); } 524 void mark_as_constructed (void) { m_ctor_list.clear (); }
525 525
526 OCTINTERP_API void mark_as_constructed (const cdef_class& cls); 526 OCTINTERP_API void mark_as_constructed (const cdef_class& cls);
527 527
528 bool is_constructed (void) const { return m_ctor_list.empty (); } 528 bool is_constructed (void) const { return m_ctor_list.empty (); }
529 529
530 protected: 530 protected:
531 531
532 // Object property values 532 // Object property values
533 octave_scalar_map m_map; 533 octave_scalar_map m_map;
534 534
535 // Internal/temporary structure used during object construction 535 // Internal/temporary structure used during object construction
536 std::map< cdef_class, std::list<cdef_class>> m_ctor_list; 536 std::map< cdef_class, std::list<cdef_class>> m_ctor_list;
537 537
538 protected: 538 protected:
539 539
540 // Restricted object copying! 540 // Restricted object copying!
541 cdef_object_scalar (const cdef_object_scalar& obj) 541 cdef_object_scalar (const cdef_object_scalar& obj)
542 : cdef_object_base (obj), m_map (obj.m_map), m_ctor_list (obj.m_ctor_list) 542 : cdef_object_base (obj), m_map (obj.m_map), m_ctor_list (obj.m_ctor_list)
543 { } 543 { }
544 }; 544 };
545 545
546 class 546 class
547 OCTINTERP_API 547 OCTINTERP_API
548 handle_cdef_object : public cdef_object_scalar 548 handle_cdef_object : public cdef_object_scalar
549 { 549 {
550 public: 550 public:
551 551
552 handle_cdef_object (void) : cdef_object_scalar () { } 552 handle_cdef_object (void) : cdef_object_scalar () { }
553 553
554 handle_cdef_object& operator = (const handle_cdef_object&) = delete; 554 handle_cdef_object& operator = (const handle_cdef_object&) = delete;
555 555
556 OCTINTERP_API ~handle_cdef_object (void); 556 OCTINTERP_API ~handle_cdef_object (void);
557 557
558 cdef_object_rep * clone (void) const 558 cdef_object_rep * clone (void) const
559 { 559 {
560 handle_cdef_object *obj = const_cast<handle_cdef_object *> (this); 560 handle_cdef_object *obj = const_cast<handle_cdef_object *> (this);
561 obj->m_count++; 561 obj->m_count++;
562 return obj; 562 return obj;
563 } 563 }
564 564
565 cdef_object_rep * copy (void) const 565 cdef_object_rep * copy (void) const
566 { 566 {
567 return new handle_cdef_object (*this); 567 return new handle_cdef_object (*this);
568 } 568 }
569 569
570 bool is_valid (void) const { return true; } 570 bool is_valid (void) const { return true; }
571 571
572 bool is_handle_object (void) const { return true; } 572 bool is_handle_object (void) const { return true; }
573 573
574 protected: 574 protected:
575 575
576 // Restricted copying! 576 // Restricted copying!
577 handle_cdef_object (const handle_cdef_object& obj) 577 handle_cdef_object (const handle_cdef_object& obj)
578 : cdef_object_scalar (obj) 578 : cdef_object_scalar (obj)
579 { } 579 { }
580 }; 580 };
581 581
582 class 582 class
583 OCTINTERP_API 583 OCTINTERP_API
584 value_cdef_object : public cdef_object_scalar 584 value_cdef_object : public cdef_object_scalar
585 { 585 {
586 public: 586 public:
587 587
588 value_cdef_object (void) : cdef_object_scalar () { } 588 value_cdef_object (void) : cdef_object_scalar () { }
589 589
590 value_cdef_object& operator = (const value_cdef_object&) = delete; 590 value_cdef_object& operator = (const value_cdef_object&) = delete;
591 591
592 OCTINTERP_API ~value_cdef_object (void); 592 OCTINTERP_API ~value_cdef_object (void);
593 593
594 cdef_object_rep * clone (void) const 594 cdef_object_rep * clone (void) const
595 { 595 {
596 return new value_cdef_object (*this); 596 return new value_cdef_object (*this);
597 } 597 }
598 598
599 cdef_object_rep * copy (void) const { return clone (); } 599 cdef_object_rep * copy (void) const { return clone (); }
600 600
601 bool is_valid (void) const { return true; } 601 bool is_valid (void) const { return true; }
602 602
603 bool is_value_object (void) const { return true; } 603 bool is_value_object (void) const { return true; }
604 604
605 private: 605 private:
606 606
607 // Private copying! 607 // Private copying!
608 value_cdef_object (const value_cdef_object& obj) 608 value_cdef_object (const value_cdef_object& obj)
609 : cdef_object_scalar (obj) 609 : cdef_object_scalar (obj)
610 { } 610 { }
611 }; 611 };
612 612
613 class 613 class
614 OCTINTERP_API 614 OCTINTERP_API
615 cdef_meta_object_rep : public handle_cdef_object 615 cdef_meta_object_rep : public handle_cdef_object
616 { 616 {
617 public: 617 public:
618 618
619 cdef_meta_object_rep (void) : handle_cdef_object () { } 619 cdef_meta_object_rep (void) : handle_cdef_object () { }
620 620
621 cdef_meta_object_rep& operator = (const cdef_meta_object_rep&) = delete; 621 cdef_meta_object_rep& operator = (const cdef_meta_object_rep&) = delete;
622 622
623 ~cdef_meta_object_rep (void) = default; 623 ~cdef_meta_object_rep (void) = default;
624 624
625 cdef_object_rep * copy (void) const 625 cdef_object_rep * copy (void) const
626 { return new cdef_meta_object_rep (*this); } 626 { return new cdef_meta_object_rep (*this); }
627 627
628 bool is_meta_object (void) const { return true; } 628 bool is_meta_object (void) const { return true; }
629 629
630 virtual bool is_class (void) const { return false; } 630 virtual bool is_class (void) const { return false; }
631 631
632 virtual bool is_property (void) const { return false; } 632 virtual bool is_property (void) const { return false; }
633 633
634 virtual bool is_method (void) const { return false; } 634 virtual bool is_method (void) const { return false; }
635 635
636 virtual bool is_package (void) const { return false; } 636 virtual bool is_package (void) const { return false; }
637 637
638 virtual octave_value_list 638 virtual octave_value_list
639 meta_subsref (const std::string& /* type */, 639 meta_subsref (const std::string& /* type */,
640 const std::list<octave_value_list>& /* idx */, 640 const std::list<octave_value_list>& /* idx */,
641 int /* nargout */) 641 int /* nargout */)
642 { 642 {
643 error ("subsref: invalid meta object"); 643 error ("subsref: invalid meta object");
644 } 644 }
645 645
646 virtual void meta_release (void) { } 646 virtual void meta_release (void) { }
647 647
648 virtual bool meta_accepts_postfix_index (char /* type */) const 648 virtual bool meta_accepts_postfix_index (char /* type */) const
649 { 649 {
650 return false; 650 return false;
651 } 651 }
652 652
653 protected: 653 protected:
654 654
655 // Restricted copying! 655 // Restricted copying!
656 cdef_meta_object_rep (const cdef_meta_object_rep& obj) 656 cdef_meta_object_rep (const cdef_meta_object_rep& obj)
657 : handle_cdef_object (obj) 657 : handle_cdef_object (obj)
658 { } 658 { }
659 }; 659 };
660 660
661 class 661 class
662 OCTINTERP_API 662 OCTINTERP_API
663 cdef_meta_object : public cdef_object 663 cdef_meta_object : public cdef_object
664 { 664 {
665 public: 665 public:
666 666
667 cdef_meta_object (void) : cdef_object () { } 667 cdef_meta_object (void) : cdef_object () { }
668 668
669 // Object consistency is checked in sub-classes. 669 // Object consistency is checked in sub-classes.
670 cdef_meta_object (const cdef_meta_object& obj) : cdef_object (obj) { } 670 cdef_meta_object (const cdef_meta_object& obj) : cdef_object (obj) { }
671 671
672 cdef_meta_object (cdef_meta_object_rep *r) : cdef_object (r) { } 672 cdef_meta_object (cdef_meta_object_rep *r) : cdef_object (r) { }
673 673
674 cdef_meta_object (const cdef_object& obj) : cdef_object (obj) { } 674 cdef_meta_object (const cdef_object& obj) : cdef_object (obj) { }
675 675
676 cdef_meta_object& operator = (const cdef_object&) = delete; 676 cdef_meta_object& operator = (const cdef_object&) = delete;
677 677
678 ~cdef_meta_object (void) = default; 678 ~cdef_meta_object (void) = default;
679 679
680 bool is_class (void) const { return get_rep ()->is_class (); } 680 bool is_class (void) const { return get_rep ()->is_class (); }
681 681
682 bool is_property (void) const { return get_rep ()->is_property (); } 682 bool is_property (void) const { return get_rep ()->is_property (); }
683 683
684 bool is_method (void) const { return get_rep ()->is_method (); } 684 bool is_method (void) const { return get_rep ()->is_method (); }
685 685
686 bool is_package (void) const { return get_rep ()->is_package (); } 686 bool is_package (void) const { return get_rep ()->is_package (); }
687 687
688 octave_value_list 688 octave_value_list
689 meta_subsref (const std::string& type, 689 meta_subsref (const std::string& type,
690 const std::list<octave_value_list>& idx, int nargout) 690 const std::list<octave_value_list>& idx, int nargout)
691 { 691 {
692 return get_rep ()->meta_subsref (type, idx, nargout); 692 return get_rep ()->meta_subsref (type, idx, nargout);
693 } 693 }
694 694
695 void meta_release (void) { get_rep ()->meta_release (); } 695 void meta_release (void) { get_rep ()->meta_release (); }
696 696
697 bool meta_accepts_postfix_index (char type) const 697 bool meta_accepts_postfix_index (char type) const
698 { 698 {
699 return get_rep ()->meta_accepts_postfix_index (type); 699 return get_rep ()->meta_accepts_postfix_index (type);
700 } 700 }
701 701
702 private: 702 private:
703 703
704 cdef_meta_object_rep * get_rep (void) 704 cdef_meta_object_rep * get_rep (void)
705 { 705 {
706 return dynamic_cast<cdef_meta_object_rep *> (cdef_object::get_rep ()); 706 return dynamic_cast<cdef_meta_object_rep *> (cdef_object::get_rep ());
707 } 707 }
708 708
709 const cdef_meta_object_rep * get_rep (void) const 709 const cdef_meta_object_rep * get_rep (void) const
710 { 710 {
711 return dynamic_cast<const cdef_meta_object_rep *> (cdef_object::get_rep ()); 711 return dynamic_cast<const cdef_meta_object_rep *> (cdef_object::get_rep ());
712 } 712 }
713 }; 713 };
714 714
715 OCTAVE_END_NAMESPACE(octave) 715 OCTAVE_END_NAMESPACE(octave)
716 716
717 #endif 717 #endif