comparison libinterp/octave-value/cdef-class.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
43 #include "ov.h" 43 #include "ov.h"
44 #include "ovl.h" 44 #include "ovl.h"
45 45
46 OCTAVE_BEGIN_NAMESPACE(octave) 46 OCTAVE_BEGIN_NAMESPACE(octave)
47 47
48 class interpreter; 48 class interpreter;
49 class tree_classdef; 49 class tree_classdef;
50
51 class
52 OCTINTERP_API
53 cdef_class : public cdef_meta_object
54 {
55 private:
50 56
51 class 57 class
52 OCTINTERP_API 58 cdef_class_rep : public cdef_meta_object_rep
53 cdef_class : public cdef_meta_object 59 {
54 {
55 private:
56
57 class
58 cdef_class_rep : public cdef_meta_object_rep
59 {
60 public:
61 cdef_class_rep (void)
62 : cdef_meta_object_rep (), m_member_count (0), m_handle_class (false),
63 m_meta (false)
64 { }
65
66 OCTINTERP_API cdef_class_rep (const std::list<cdef_class>& superclasses);
67
68 cdef_class_rep& operator = (const cdef_class_rep&) = delete;
69
70 ~cdef_class_rep (void) = default;
71
72 cdef_object_rep * copy (void) const { return new cdef_class_rep (*this); }
73
74 bool is_class (void) const { return true; }
75
76 std::string get_name (void) const
77 { return get ("Name").string_value (); }
78
79 void set_name (const std::string& nm) { put ("Name", nm); }
80
81 bool is_abstract (void) const { return get ("Abstract").bool_value (); }
82
83 bool is_sealed (void) const { return get ("Sealed").bool_value (); }
84
85 OCTINTERP_API cdef_method
86 find_method (const std::string& nm, bool local = false);
87
88 OCTINTERP_API void
89 install_method (const cdef_method& meth);
90
91 OCTINTERP_API Cell
92 get_methods (bool include_ctor);
93
94 OCTINTERP_API std::map<std::string, cdef_method>
95 get_method_map (bool only_inherited, bool include_ctor);
96
97 OCTINTERP_API cdef_property find_property (const std::string& nm);
98
99 OCTINTERP_API void install_property (const cdef_property& prop);
100
101 OCTINTERP_API Cell get_properties (int mode);
102
103 OCTINTERP_API std::map<std::string, cdef_property>
104 get_property_map (int mode);
105
106 OCTINTERP_API string_vector get_names (void);
107
108 void set_directory (const std::string& dir) { m_directory = dir; }
109
110 std::string get_directory (void) const { return m_directory; }
111
112 OCTINTERP_API void delete_object (const cdef_object& obj);
113
114 OCTINTERP_API octave_value_list
115 meta_subsref (const std::string& type,
116 const std::list<octave_value_list>& idx, int nargout);
117
118 OCTINTERP_API void meta_release (void);
119
120 bool meta_accepts_postfix_index (char type) const
121 {
122 return (type == '(' || type == '.');
123 }
124
125 OCTINTERP_API octave_value get_method (const std::string& name) const;
126
127 OCTINTERP_API octave_value construct (const octave_value_list& args);
128
129 OCTINTERP_API cdef_object
130 construct_object (const octave_value_list& args);
131
132 OCTINTERP_API void initialize_object (cdef_object& obj);
133
134 OCTINTERP_API void
135 run_constructor (cdef_object& obj, const octave_value_list& args);
136
137 void mark_as_handle_class (void) { m_handle_class = true; }
138
139 bool is_handle_class (void) const { return m_handle_class; }
140
141 octave_idx_type static_count (void) const { return m_member_count; }
142
143 void destroy (void)
144 {
145 if (m_member_count)
146 {
147 m_count++;
148 cdef_class lock (this);
149
150 m_member_count = 0;
151 m_method_map.clear ();
152 m_property_map.clear ();
153 }
154 else
155 delete this;
156 }
157
158 void mark_as_meta_class (void) { m_meta = true; }
159
160 bool is_meta_class (void) const { return m_meta; }
161
162 void doc_string (const std::string& txt) { m_doc_string = txt; }
163
164 std::string doc_string (void) const { return m_doc_string; }
165
166 void file_name (const std::string& nm) { m_file_name = nm; }
167
168 std::string file_name (void) const { return m_file_name; }
169
170 private:
171
172 OCTINTERP_API void load_all_methods (void);
173
174 OCTINTERP_API void find_names (std::set<std::string>& names, bool all);
175
176 OCTINTERP_API void
177 find_properties (std::map<std::string, cdef_property>& props,
178 int mode = 0);
179
180 OCTINTERP_API void
181 find_methods (std::map<std::string, cdef_method>& meths,
182 bool only_inherited, bool include_ctor = false);
183
184 cdef_class wrap (void)
185 {
186 m_count++;
187 return cdef_class (this);
188 }
189
190 // The @-directory were this class is loaded from.
191 // (not used yet)
192
193 std::string m_directory;
194
195 std::string m_doc_string;
196
197 std::string m_file_name;
198
199 // The methods defined by this class.
200
201 std::map<std::string, cdef_method> m_method_map;
202
203 // The properties defined by this class.
204
205 std::map<std::string, cdef_property> m_property_map;
206
207 // The number of members in this class (methods, properties...)
208
209 octave_idx_type m_member_count;
210
211 // TRUE if this class is a handle class. A class is a handle
212 // class when the abstract "handle" class is one of its superclasses.
213
214 bool m_handle_class;
215
216 // The list of super-class constructors that are called implicitly by the
217 // classdef engine when creating an object. These constructors are not
218 // called explicitly by the class constructor.
219
220 std::list<cdef_class> m_implicit_ctor_list;
221
222 // TRUE if this class is a built-in meta class.
223
224 bool m_meta;
225
226 // Utility iterator typedefs.
227
228 typedef std::map<std::string, cdef_method>::iterator method_iterator;
229 typedef std::map<std::string, cdef_method>::const_iterator method_const_iterator;
230 typedef std::map<std::string, cdef_property>::iterator property_iterator;
231 typedef std::map<std::string, cdef_property>::const_iterator property_const_iterator;
232
233 cdef_class_rep (const cdef_class_rep& c) = default;
234 };
235
236 public: 60 public:
237 61 cdef_class_rep (void)
238 // Create an invalid class object. 62 : cdef_meta_object_rep (), m_member_count (0), m_handle_class (false),
239 63 m_meta (false)
240 cdef_class (void) : cdef_meta_object () { } 64 { }
241 65
242 cdef_class (const std::string& nm, 66 OCTINTERP_API cdef_class_rep (const std::list<cdef_class>& superclasses);
243 const std::list<cdef_class>& superclasses) 67
244 : cdef_meta_object (new cdef_class_rep (superclasses)) 68 cdef_class_rep& operator = (const cdef_class_rep&) = delete;
245 { 69
246 get_rep ()->set_name (nm); 70 ~cdef_class_rep (void) = default;
247 } 71
248 72 cdef_object_rep * copy (void) const { return new cdef_class_rep (*this); }
249 cdef_class (const cdef_class& cls) : cdef_meta_object (cls) { } 73
250 74 bool is_class (void) const { return true; }
251 cdef_class (const cdef_object& obj) 75
252 : cdef_meta_object (obj) 76 std::string get_name (void) const
253 { 77 { return get ("Name").string_value (); }
254 // This should never happen... 78
255 if (! is_class ()) 79 void set_name (const std::string& nm) { put ("Name", nm); }
256 error ("internal error: invalid assignment from %s to meta.class object", 80
257 class_name ().c_str ()); 81 bool is_abstract (void) const { return get ("Abstract").bool_value (); }
258 } 82
259 83 bool is_sealed (void) const { return get ("Sealed").bool_value (); }
260 cdef_class& operator = (const cdef_class& cls)
261 {
262 cdef_object::operator = (cls);
263
264 return *this;
265 }
266
267 ~cdef_class (void) = default;
268 84
269 OCTINTERP_API cdef_method 85 OCTINTERP_API cdef_method
270 find_method (const std::string& nm, bool local = false); 86 find_method (const std::string& nm, bool local = false);
271 87
272 void install_method (const cdef_method& meth) 88 OCTINTERP_API void
89 install_method (const cdef_method& meth);
90
91 OCTINTERP_API Cell
92 get_methods (bool include_ctor);
93
94 OCTINTERP_API std::map<std::string, cdef_method>
95 get_method_map (bool only_inherited, bool include_ctor);
96
97 OCTINTERP_API cdef_property find_property (const std::string& nm);
98
99 OCTINTERP_API void install_property (const cdef_property& prop);
100
101 OCTINTERP_API Cell get_properties (int mode);
102
103 OCTINTERP_API std::map<std::string, cdef_property>
104 get_property_map (int mode);
105
106 OCTINTERP_API string_vector get_names (void);
107
108 void set_directory (const std::string& dir) { m_directory = dir; }
109
110 std::string get_directory (void) const { return m_directory; }
111
112 OCTINTERP_API void delete_object (const cdef_object& obj);
113
114 OCTINTERP_API octave_value_list
115 meta_subsref (const std::string& type,
116 const std::list<octave_value_list>& idx, int nargout);
117
118 OCTINTERP_API void meta_release (void);
119
120 bool meta_accepts_postfix_index (char type) const
273 { 121 {
274 get_rep ()->install_method (meth); 122 return (type == '(' || type == '.');
275 } 123 }
276 124
277 Cell get_methods (bool include_ctor = false) 125 OCTINTERP_API octave_value get_method (const std::string& name) const;
126
127 OCTINTERP_API octave_value construct (const octave_value_list& args);
128
129 OCTINTERP_API cdef_object
130 construct_object (const octave_value_list& args);
131
132 OCTINTERP_API void initialize_object (cdef_object& obj);
133
134 OCTINTERP_API void
135 run_constructor (cdef_object& obj, const octave_value_list& args);
136
137 void mark_as_handle_class (void) { m_handle_class = true; }
138
139 bool is_handle_class (void) const { return m_handle_class; }
140
141 octave_idx_type static_count (void) const { return m_member_count; }
142
143 void destroy (void)
278 { 144 {
279 return get_rep ()->get_methods (include_ctor); 145 if (m_member_count)
146 {
147 m_count++;
148 cdef_class lock (this);
149
150 m_member_count = 0;
151 m_method_map.clear ();
152 m_property_map.clear ();
153 }
154 else
155 delete this;
280 } 156 }
281 157
282 std::map<std::string, cdef_method> 158 void mark_as_meta_class (void) { m_meta = true; }
283 get_method_map (bool only_inherited = false, bool include_ctor = false) 159
160 bool is_meta_class (void) const { return m_meta; }
161
162 void doc_string (const std::string& txt) { m_doc_string = txt; }
163
164 std::string doc_string (void) const { return m_doc_string; }
165
166 void file_name (const std::string& nm) { m_file_name = nm; }
167
168 std::string file_name (void) const { return m_file_name; }
169
170 private:
171
172 OCTINTERP_API void load_all_methods (void);
173
174 OCTINTERP_API void find_names (std::set<std::string>& names, bool all);
175
176 OCTINTERP_API void
177 find_properties (std::map<std::string, cdef_property>& props,
178 int mode = 0);
179
180 OCTINTERP_API void
181 find_methods (std::map<std::string, cdef_method>& meths,
182 bool only_inherited, bool include_ctor = false);
183
184 cdef_class wrap (void)
284 { 185 {
285 return get_rep ()->get_method_map (only_inherited, include_ctor); 186 m_count++;
187 return cdef_class (this);
286 } 188 }
287 189
288 OCTINTERP_API cdef_property find_property (const std::string& nm); 190 // The @-directory were this class is loaded from.
289 191 // (not used yet)
290 void install_property (const cdef_property& prop) 192
291 { 193 std::string m_directory;
292 get_rep ()->install_property (prop); 194
293 } 195 std::string m_doc_string;
294 196
295 Cell get_properties (int mode = property_normal) 197 std::string m_file_name;
296 { 198
297 return get_rep ()->get_properties (mode); 199 // The methods defined by this class.
298 } 200
299 201 std::map<std::string, cdef_method> m_method_map;
300 std::map<std::string, cdef_property> 202
301 get_property_map (int mode = property_normal) 203 // The properties defined by this class.
302 { 204
303 return get_rep ()->get_property_map (mode); 205 std::map<std::string, cdef_property> m_property_map;
304 } 206
305 207 // The number of members in this class (methods, properties...)
306 string_vector get_names (void) { return get_rep ()->get_names (); } 208
307 209 octave_idx_type m_member_count;
308 bool is_abstract (void) const { return get_rep ()->is_abstract (); } 210
309 211 // TRUE if this class is a handle class. A class is a handle
310 bool is_sealed (void) const { return get_rep ()->is_sealed (); } 212 // class when the abstract "handle" class is one of its superclasses.
311 213
312 void set_directory (const std::string& dir) 214 bool m_handle_class;
313 { 215
314 get_rep ()->set_directory (dir); 216 // The list of super-class constructors that are called implicitly by the
315 } 217 // classdef engine when creating an object. These constructors are not
316 218 // called explicitly by the class constructor.
317 std::string get_directory (void) const 219
318 { 220 std::list<cdef_class> m_implicit_ctor_list;
319 return get_rep ()->get_directory (); 221
320 } 222 // TRUE if this class is a built-in meta class.
321 223
322 std::string get_name (void) const { return get_rep ()->get_name (); } 224 bool m_meta;
323 225
324 bool is_builtin (void) const { return get_directory ().empty (); } 226 // Utility iterator typedefs.
325 227
326 void delete_object (const cdef_object& obj) 228 typedef std::map<std::string, cdef_method>::iterator method_iterator;
327 { 229 typedef std::map<std::string, cdef_method>::const_iterator method_const_iterator;
328 get_rep ()->delete_object (obj); 230 typedef std::map<std::string, cdef_property>::iterator property_iterator;
329 } 231 typedef std::map<std::string, cdef_property>::const_iterator property_const_iterator;
330 232
331 //! Analyze the tree_classdef tree and transform it to a cdef_class 233 cdef_class_rep (const cdef_class_rep& c) = default;
332 //!
333 //! <b>All attribute validation should occur here.</b>
334 //!
335 //! Classdef attribute values can be given in the form of
336 //! expressions. These expressions must be evaluated before
337 //! assigning them as attribute values. Evaluating them as they are
338 //! parsed causes trouble with possible recursion in the parser so we
339 //! do it here. For example
340 //!
341 //! @code
342 //! classdef recursion_class
343 //! methods (Access = ?recursion_class)
344 //! endmethods
345 //! endclassdef
346 //! @endcode
347 //!
348 //! will fail because each attempt to compute the metaclass of
349 //! recursion_class will cause recursion_class to be parsed again.
350
351 static OCTINTERP_API cdef_class
352 make_meta_class (interpreter& interp, tree_classdef *t,
353 bool is_at_folder = false);
354
355 octave_value get_method (const std::string& nm) const
356 {
357 return get_rep ()->get_method (nm);
358 }
359
360 OCTINTERP_API octave_value get_method_function (const std::string& nm);
361
362 octave_value get_constructor_function (void)
363 {
364 return get_method_function (get_name ());
365 }
366
367 octave_value construct (const octave_value_list& args)
368 {
369 return get_rep ()->construct (args);
370 }
371
372 cdef_object construct_object (const octave_value_list& args)
373 {
374 return get_rep ()->construct_object (args);
375 }
376
377 void initialize_object (cdef_object& obj)
378 {
379 get_rep ()->initialize_object (obj);
380 }
381
382 void run_constructor (cdef_object& obj, const octave_value_list& args)
383 {
384 get_rep ()->run_constructor (obj, args);
385 }
386
387 void mark_as_handle_class (void)
388 {
389 get_rep ()->mark_as_handle_class ();
390 }
391
392 bool is_handle_class (void) const
393 {
394 return get_rep ()->is_handle_class ();
395 }
396
397 void mark_as_meta_class (void) { get_rep ()->mark_as_meta_class (); }
398
399 bool is_meta_class (void) const { return get_rep ()->is_meta_class (); }
400
401 void doc_string (const std::string& txt) { get_rep ()->doc_string (txt); }
402
403 std::string doc_string (void) const { return get_rep ()->doc_string (); }
404
405 void file_name (const std::string& nm) { get_rep ()->file_name (nm); }
406
407 std::string file_name (void) const { return get_rep ()->file_name (); }
408
409 public:
410
411 enum
412 {
413 property_normal,
414 property_inherited,
415 property_all
416 };
417
418 private:
419
420 cdef_class_rep * get_rep (void)
421 {
422 return dynamic_cast<cdef_class_rep *> (cdef_object::get_rep ());
423 }
424
425 const cdef_class_rep * get_rep (void) const
426 {
427 return dynamic_cast<const cdef_class_rep *> (cdef_object::get_rep ());
428 }
429
430 friend OCTINTERP_API bool operator == (const cdef_class&, const cdef_class&);
431 friend OCTINTERP_API bool operator != (const cdef_class&, const cdef_class&);
432 friend OCTINTERP_API bool operator < (const cdef_class&, const cdef_class&);
433
434 friend void install_classdef (octave::interpreter& interp);
435 }; 234 };
436 235
437 inline bool 236 public:
438 operator == (const cdef_class& clsa, const cdef_class& clsb) 237
439 { 238 // Create an invalid class object.
440 // FIXME: is this really the right way to check class equality? 239
441 240 cdef_class (void) : cdef_meta_object () { }
442 return (clsa.get_rep () == clsb.get_rep ()); 241
443 } 242 cdef_class (const std::string& nm,
444 243 const std::list<cdef_class>& superclasses)
445 inline bool 244 : cdef_meta_object (new cdef_class_rep (superclasses))
446 operator != (const cdef_class& clsa, const cdef_class& clsb) 245 {
447 { 246 get_rep ()->set_name (nm);
448 return ! (clsa == clsb); 247 }
449 } 248
450 249 cdef_class (const cdef_class& cls) : cdef_meta_object (cls) { }
451 // This is only to be able to use cdef_class as map keys. 250
452 251 cdef_class (const cdef_object& obj)
453 inline bool 252 : cdef_meta_object (obj)
454 operator < (const cdef_class& clsa, const cdef_class& clsb) 253 {
455 { 254 // This should never happen...
456 return clsa.get_rep () < clsb.get_rep (); 255 if (! is_class ())
457 } 256 error ("internal error: invalid assignment from %s to meta.class object",
458 257 class_name ().c_str ());
459 inline cdef_method 258 }
460 cdef_class::find_method (const std::string& nm, bool local) 259
461 { 260 cdef_class& operator = (const cdef_class& cls)
462 return get_rep ()->find_method (nm, local); 261 {
463 } 262 cdef_object::operator = (cls);
464 263
465 inline cdef_property 264 return *this;
466 cdef_class::find_property (const std::string& nm) 265 }
467 { 266
468 return get_rep ()->find_property (nm); 267 ~cdef_class (void) = default;
469 } 268
269 OCTINTERP_API cdef_method
270 find_method (const std::string& nm, bool local = false);
271
272 void install_method (const cdef_method& meth)
273 {
274 get_rep ()->install_method (meth);
275 }
276
277 Cell get_methods (bool include_ctor = false)
278 {
279 return get_rep ()->get_methods (include_ctor);
280 }
281
282 std::map<std::string, cdef_method>
283 get_method_map (bool only_inherited = false, bool include_ctor = false)
284 {
285 return get_rep ()->get_method_map (only_inherited, include_ctor);
286 }
287
288 OCTINTERP_API cdef_property find_property (const std::string& nm);
289
290 void install_property (const cdef_property& prop)
291 {
292 get_rep ()->install_property (prop);
293 }
294
295 Cell get_properties (int mode = property_normal)
296 {
297 return get_rep ()->get_properties (mode);
298 }
299
300 std::map<std::string, cdef_property>
301 get_property_map (int mode = property_normal)
302 {
303 return get_rep ()->get_property_map (mode);
304 }
305
306 string_vector get_names (void) { return get_rep ()->get_names (); }
307
308 bool is_abstract (void) const { return get_rep ()->is_abstract (); }
309
310 bool is_sealed (void) const { return get_rep ()->is_sealed (); }
311
312 void set_directory (const std::string& dir)
313 {
314 get_rep ()->set_directory (dir);
315 }
316
317 std::string get_directory (void) const
318 {
319 return get_rep ()->get_directory ();
320 }
321
322 std::string get_name (void) const { return get_rep ()->get_name (); }
323
324 bool is_builtin (void) const { return get_directory ().empty (); }
325
326 void delete_object (const cdef_object& obj)
327 {
328 get_rep ()->delete_object (obj);
329 }
330
331 //! Analyze the tree_classdef tree and transform it to a cdef_class
332 //!
333 //! <b>All attribute validation should occur here.</b>
334 //!
335 //! Classdef attribute values can be given in the form of
336 //! expressions. These expressions must be evaluated before
337 //! assigning them as attribute values. Evaluating them as they are
338 //! parsed causes trouble with possible recursion in the parser so we
339 //! do it here. For example
340 //!
341 //! @code
342 //! classdef recursion_class
343 //! methods (Access = ?recursion_class)
344 //! endmethods
345 //! endclassdef
346 //! @endcode
347 //!
348 //! will fail because each attempt to compute the metaclass of
349 //! recursion_class will cause recursion_class to be parsed again.
350
351 static OCTINTERP_API cdef_class
352 make_meta_class (interpreter& interp, tree_classdef *t,
353 bool is_at_folder = false);
354
355 octave_value get_method (const std::string& nm) const
356 {
357 return get_rep ()->get_method (nm);
358 }
359
360 OCTINTERP_API octave_value get_method_function (const std::string& nm);
361
362 octave_value get_constructor_function (void)
363 {
364 return get_method_function (get_name ());
365 }
366
367 octave_value construct (const octave_value_list& args)
368 {
369 return get_rep ()->construct (args);
370 }
371
372 cdef_object construct_object (const octave_value_list& args)
373 {
374 return get_rep ()->construct_object (args);
375 }
376
377 void initialize_object (cdef_object& obj)
378 {
379 get_rep ()->initialize_object (obj);
380 }
381
382 void run_constructor (cdef_object& obj, const octave_value_list& args)
383 {
384 get_rep ()->run_constructor (obj, args);
385 }
386
387 void mark_as_handle_class (void)
388 {
389 get_rep ()->mark_as_handle_class ();
390 }
391
392 bool is_handle_class (void) const
393 {
394 return get_rep ()->is_handle_class ();
395 }
396
397 void mark_as_meta_class (void) { get_rep ()->mark_as_meta_class (); }
398
399 bool is_meta_class (void) const { return get_rep ()->is_meta_class (); }
400
401 void doc_string (const std::string& txt) { get_rep ()->doc_string (txt); }
402
403 std::string doc_string (void) const { return get_rep ()->doc_string (); }
404
405 void file_name (const std::string& nm) { get_rep ()->file_name (nm); }
406
407 std::string file_name (void) const { return get_rep ()->file_name (); }
408
409 public:
410
411 enum
412 {
413 property_normal,
414 property_inherited,
415 property_all
416 };
417
418 private:
419
420 cdef_class_rep * get_rep (void)
421 {
422 return dynamic_cast<cdef_class_rep *> (cdef_object::get_rep ());
423 }
424
425 const cdef_class_rep * get_rep (void) const
426 {
427 return dynamic_cast<const cdef_class_rep *> (cdef_object::get_rep ());
428 }
429
430 friend OCTINTERP_API bool operator == (const cdef_class&, const cdef_class&);
431 friend OCTINTERP_API bool operator != (const cdef_class&, const cdef_class&);
432 friend OCTINTERP_API bool operator < (const cdef_class&, const cdef_class&);
433
434 friend void install_classdef (octave::interpreter& interp);
435 };
436
437 inline bool
438 operator == (const cdef_class& clsa, const cdef_class& clsb)
439 {
440 // FIXME: is this really the right way to check class equality?
441
442 return (clsa.get_rep () == clsb.get_rep ());
443 }
444
445 inline bool
446 operator != (const cdef_class& clsa, const cdef_class& clsb)
447 {
448 return ! (clsa == clsb);
449 }
450
451 // This is only to be able to use cdef_class as map keys.
452
453 inline bool
454 operator < (const cdef_class& clsa, const cdef_class& clsb)
455 {
456 return clsa.get_rep () < clsb.get_rep ();
457 }
458
459 inline cdef_method
460 cdef_class::find_method (const std::string& nm, bool local)
461 {
462 return get_rep ()->find_method (nm, local);
463 }
464
465 inline cdef_property
466 cdef_class::find_property (const std::string& nm)
467 {
468 return get_rep ()->find_property (nm);
469 }
470 470
471 OCTAVE_END_NAMESPACE(octave) 471 OCTAVE_END_NAMESPACE(octave)
472 472
473 #endif 473 #endif