Mercurial > hg > octave-thorsten
comparison libinterp/interp-core/mxarray.in.h @ 15355:a291f850743c draft
modernize mxArray class hierarchy
* mxarray.in.h: Move mxArray_base class definition here from mex.cc.
Don't derive mxArray_base from mxArray. Move all virtual tags from
mxArray functions to the corresponding mxArray_base functions.
(mxArray_base::as_mxArray): New virtual function.
(mxArray::dup): Attempt as_mxArray conversion first. If that
succeeds, set name of copy. Othewise, duplicate the rep object.
(struct xmxArray): Delete.
(mxArray_base::octave_value as_octave_value): Now public.
(mxArray_octave_value::octave_value as_octave_value): Now public.
(mxArray_number::octave_value as_octave_value): Now public.
(mxArray_sparse::octave_value as_octave_value): Now public.
(mxArray_struct::octave_value as_octave_value): Now public.
(mxArray_cell::octave_value as_octave_value): Now public.
(mxArray::mxArray (const xmxArray&)): Delete.
(mxArray::mxArray (mxArray_base*, const char*)): Arg is now
mxArray_base*, not mxArray*.
(mxArray::rep): Now mxArray_base*, not mxArray*.
* mex.cc (mxArray_octave_value::dup): Return mxArray_base*, not
mxArray*. Don't attempt conversion from octave_value to mxArray here.
(mxArray_octave_value::as_mxArray): New function.
(mxArray_number::dup): Return mxArray_base*, not mxArray_number*.
(mxArray_sparse::dup): Return mxArray_base*, not mxArray_sparse*.
(mxArray_struct::dup): Return mxArray_base*, not mxArray_struct*.
(mxArray_cell::dup): Return mxArray_base*, not mxArray_dup*.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 11 Sep 2012 13:38:44 -0400 |
parents | a23693fa5ba9 |
children | 5f3a69a309a7 |
comparison
equal
deleted
inserted
replaced
15354:6a0c0d3d60b6 | 15355:a291f850743c |
---|---|
114 { \ | 114 { \ |
115 maybe_mutate (); \ | 115 maybe_mutate (); \ |
116 rep->METHOD_CALL; \ | 116 rep->METHOD_CALL; \ |
117 } | 117 } |
118 | 118 |
119 // This just provides a way to avoid infinite recursion when building | 119 // A class to provide the default implemenation of some of the virtual |
120 // mxArray objects. | 120 // functions declared in the mxArray class. |
121 | 121 |
122 struct | 122 class mxArray; |
123 xmxArray | 123 |
124 class mxArray_base | |
124 { | 125 { |
125 xmxArray (void) { } | 126 protected: |
127 | |
128 mxArray_base (void) { } | |
129 | |
130 public: | |
131 | |
132 virtual mxArray_base *dup (void) const = 0; | |
133 | |
134 virtual mxArray *as_mxArray (void) const { return 0; } | |
135 | |
136 virtual ~mxArray_base (void) { } | |
137 | |
138 virtual bool is_octave_value (void) const { return false; } | |
139 | |
140 virtual int is_cell (void) const = 0; | |
141 | |
142 virtual int is_char (void) const = 0; | |
143 | |
144 virtual int is_class (const char *name_arg) const | |
145 { | |
146 int retval = 0; | |
147 | |
148 const char *cname = get_class_name (); | |
149 | |
150 if (cname && name_arg) | |
151 retval = ! strcmp (cname, name_arg); | |
152 | |
153 return retval; | |
154 } | |
155 | |
156 virtual int is_complex (void) const = 0; | |
157 | |
158 virtual int is_double (void) const = 0; | |
159 | |
160 virtual int is_function_handle (void) const = 0; | |
161 | |
162 virtual int is_int16 (void) const = 0; | |
163 | |
164 virtual int is_int32 (void) const = 0; | |
165 | |
166 virtual int is_int64 (void) const = 0; | |
167 | |
168 virtual int is_int8 (void) const = 0; | |
169 | |
170 virtual int is_logical (void) const = 0; | |
171 | |
172 virtual int is_numeric (void) const = 0; | |
173 | |
174 virtual int is_single (void) const = 0; | |
175 | |
176 virtual int is_sparse (void) const = 0; | |
177 | |
178 virtual int is_struct (void) const = 0; | |
179 | |
180 virtual int is_uint16 (void) const = 0; | |
181 | |
182 virtual int is_uint32 (void) const = 0; | |
183 | |
184 virtual int is_uint64 (void) const = 0; | |
185 | |
186 virtual int is_uint8 (void) const = 0; | |
187 | |
188 virtual int is_logical_scalar (void) const | |
189 { | |
190 return is_logical () && get_number_of_elements () == 1; | |
191 } | |
192 | |
193 virtual int is_logical_scalar_true (void) const = 0; | |
194 | |
195 virtual mwSize get_m (void) const = 0; | |
196 | |
197 virtual mwSize get_n (void) const = 0; | |
198 | |
199 virtual mwSize *get_dimensions (void) const = 0; | |
200 | |
201 virtual mwSize get_number_of_dimensions (void) const = 0; | |
202 | |
203 virtual void set_m (mwSize m) = 0; | |
204 | |
205 virtual void set_n (mwSize n) = 0; | |
206 | |
207 virtual void set_dimensions (mwSize *dims_arg, mwSize ndims_arg) = 0; | |
208 | |
209 virtual mwSize get_number_of_elements (void) const = 0; | |
210 | |
211 virtual int is_empty (void) const = 0; | |
212 | |
213 virtual mxClassID get_class_id (void) const = 0; | |
214 | |
215 virtual const char *get_class_name (void) const = 0; | |
216 | |
217 virtual void set_class_name (const char *name_arg) = 0; | |
218 | |
219 virtual mxArray *get_cell (mwIndex /*idx*/) const | |
220 { | |
221 invalid_type_error (); | |
222 return 0; | |
223 } | |
224 | |
225 virtual void set_cell (mwIndex idx, mxArray *val) = 0; | |
226 | |
227 virtual double get_scalar (void) const = 0; | |
228 | |
229 virtual void *get_data (void) const = 0; | |
230 | |
231 virtual void *get_imag_data (void) const = 0; | |
232 | |
233 virtual void set_data (void *pr) = 0; | |
234 | |
235 virtual void set_imag_data (void *pi) = 0; | |
236 | |
237 virtual mwIndex *get_ir (void) const = 0; | |
238 | |
239 virtual mwIndex *get_jc (void) const = 0; | |
240 | |
241 virtual mwSize get_nzmax (void) const = 0; | |
242 | |
243 virtual void set_ir (mwIndex *ir) = 0; | |
244 | |
245 virtual void set_jc (mwIndex *jc) = 0; | |
246 | |
247 virtual void set_nzmax (mwSize nzmax) = 0; | |
248 | |
249 virtual int add_field (const char *key) = 0; | |
250 | |
251 virtual void remove_field (int key_num) = 0; | |
252 | |
253 virtual mxArray *get_field_by_number (mwIndex index, int key_num) const = 0; | |
254 | |
255 virtual void set_field_by_number (mwIndex index, int key_num, mxArray *val) = 0; | |
256 | |
257 virtual int get_number_of_fields (void) const = 0; | |
258 | |
259 virtual const char *get_field_name_by_number (int key_num) const = 0; | |
260 | |
261 virtual int get_field_number (const char *key) const = 0; | |
262 | |
263 virtual int get_string (char *buf, mwSize buflen) const = 0; | |
264 | |
265 virtual char *array_to_string (void) const = 0; | |
266 | |
267 virtual mwIndex calc_single_subscript (mwSize nsubs, mwIndex *subs) const = 0; | |
268 | |
269 virtual size_t get_element_size (void) const = 0; | |
270 | |
271 virtual bool mutation_needed (void) const { return false; } | |
272 | |
273 virtual mxArray *mutate (void) const { return 0; } | |
274 | |
275 virtual octave_value as_octave_value (void) const = 0; | |
276 | |
277 protected: | |
278 | |
279 mxArray_base (const mxArray_base&) { } | |
280 | |
281 void invalid_type_error (void) const | |
282 { | |
283 error ("invalid type for operation"); | |
284 } | |
285 | |
286 void error (const char *msg) const; | |
126 }; | 287 }; |
127 | 288 |
128 // The main interface class. The representation can be based on an | 289 // The main interface class. The representation can be based on an |
129 // octave_value object or a separate object that tries to reproduce | 290 // octave_value object or a separate object that tries to reproduce |
130 // the semantics of mxArray objects in Matlab more directly. | 291 // the semantics of mxArray objects in Matlab more directly. |
163 | 324 |
164 mxArray (const dim_vector& dv); | 325 mxArray (const dim_vector& dv); |
165 | 326 |
166 mxArray (mwSize m, mwSize n); | 327 mxArray (mwSize m, mwSize n); |
167 | 328 |
168 virtual mxArray *dup (void) const | 329 mxArray *dup (void) const |
169 { | 330 { |
170 mxArray *new_rep = rep->dup (); | 331 mxArray *retval = rep->as_mxArray (); |
171 | 332 |
172 return new mxArray (new_rep, name); | 333 if (retval) |
173 } | 334 retval->set_name (name); |
174 | 335 else |
175 virtual ~mxArray (void); | 336 { |
176 | 337 mxArray_base *new_rep = rep->dup (); |
177 virtual bool is_octave_value (void) const { return rep->is_octave_value (); } | 338 |
178 | 339 retval = new mxArray (new_rep, name); |
179 virtual int is_cell (void) const { return rep->is_cell (); } | 340 } |
180 | 341 |
181 virtual int is_char (void) const { return rep->is_char (); } | 342 return retval; |
182 | 343 } |
183 virtual int is_class (const char *name_arg) const { return rep->is_class (name_arg); } | 344 |
184 | 345 ~mxArray (void); |
185 virtual int is_complex (void) const { return rep->is_complex (); } | 346 |
186 | 347 bool is_octave_value (void) const { return rep->is_octave_value (); } |
187 virtual int is_double (void) const { return rep->is_double (); } | 348 |
188 | 349 int is_cell (void) const { return rep->is_cell (); } |
189 virtual int is_function_handle (void) const { return rep->is_function_handle (); } | 350 |
190 | 351 int is_char (void) const { return rep->is_char (); } |
191 virtual int is_int16 (void) const { return rep->is_int16 (); } | 352 |
192 | 353 int is_class (const char *name_arg) const { return rep->is_class (name_arg); } |
193 virtual int is_int32 (void) const { return rep->is_int32 (); } | 354 |
194 | 355 int is_complex (void) const { return rep->is_complex (); } |
195 virtual int is_int64 (void) const { return rep->is_int64 (); } | 356 |
196 | 357 int is_double (void) const { return rep->is_double (); } |
197 virtual int is_int8 (void) const { return rep->is_int8 (); } | 358 |
198 | 359 int is_function_handle (void) const { return rep->is_function_handle (); } |
199 virtual int is_logical (void) const { return rep->is_logical (); } | 360 |
200 | 361 int is_int16 (void) const { return rep->is_int16 (); } |
201 virtual int is_numeric (void) const { return rep->is_numeric (); } | 362 |
202 | 363 int is_int32 (void) const { return rep->is_int32 (); } |
203 virtual int is_single (void) const { return rep->is_single (); } | 364 |
204 | 365 int is_int64 (void) const { return rep->is_int64 (); } |
205 virtual int is_sparse (void) const { return rep->is_sparse (); } | 366 |
206 | 367 int is_int8 (void) const { return rep->is_int8 (); } |
207 virtual int is_struct (void) const { return rep->is_struct (); } | 368 |
208 | 369 int is_logical (void) const { return rep->is_logical (); } |
209 virtual int is_uint16 (void) const { return rep->is_uint16 (); } | 370 |
210 | 371 int is_numeric (void) const { return rep->is_numeric (); } |
211 virtual int is_uint32 (void) const { return rep->is_uint32 (); } | 372 |
212 | 373 int is_single (void) const { return rep->is_single (); } |
213 virtual int is_uint64 (void) const { return rep->is_uint64 (); } | 374 |
214 | 375 int is_sparse (void) const { return rep->is_sparse (); } |
215 virtual int is_uint8 (void) const { return rep->is_uint8 (); } | 376 |
216 | 377 int is_struct (void) const { return rep->is_struct (); } |
217 virtual int is_logical_scalar (void) const { return rep->is_logical_scalar (); } | 378 |
218 | 379 int is_uint16 (void) const { return rep->is_uint16 (); } |
219 virtual int is_logical_scalar_true (void) const { return rep->is_logical_scalar_true (); } | 380 |
220 | 381 int is_uint32 (void) const { return rep->is_uint32 (); } |
221 virtual mwSize get_m (void) const { return rep->get_m (); } | 382 |
222 | 383 int is_uint64 (void) const { return rep->is_uint64 (); } |
223 virtual mwSize get_n (void) const { return rep->get_n (); } | 384 |
224 | 385 int is_uint8 (void) const { return rep->is_uint8 (); } |
225 virtual mwSize *get_dimensions (void) const { return rep->get_dimensions (); } | 386 |
226 | 387 int is_logical_scalar (void) const { return rep->is_logical_scalar (); } |
227 virtual mwSize get_number_of_dimensions (void) const { return rep->get_number_of_dimensions (); } | 388 |
228 | 389 int is_logical_scalar_true (void) const { return rep->is_logical_scalar_true (); } |
229 virtual void set_m (mwSize m) { DO_VOID_MUTABLE_METHOD (set_m (m)); } | 390 |
230 | 391 mwSize get_m (void) const { return rep->get_m (); } |
231 virtual void set_n (mwSize n) { DO_VOID_MUTABLE_METHOD (set_n (n)); } | 392 |
232 | 393 mwSize get_n (void) const { return rep->get_n (); } |
233 virtual void set_dimensions (mwSize *dims_arg, mwSize ndims_arg) { DO_VOID_MUTABLE_METHOD (set_dimensions (dims_arg, ndims_arg)); } | 394 |
234 | 395 mwSize *get_dimensions (void) const { return rep->get_dimensions (); } |
235 virtual mwSize get_number_of_elements (void) const { return rep->get_number_of_elements (); } | 396 |
236 | 397 mwSize get_number_of_dimensions (void) const { return rep->get_number_of_dimensions (); } |
237 virtual int is_empty (void) const { return get_number_of_elements () == 0; } | 398 |
399 void set_m (mwSize m) { DO_VOID_MUTABLE_METHOD (set_m (m)); } | |
400 | |
401 void set_n (mwSize n) { DO_VOID_MUTABLE_METHOD (set_n (n)); } | |
402 | |
403 void set_dimensions (mwSize *dims_arg, mwSize ndims_arg) { DO_VOID_MUTABLE_METHOD (set_dimensions (dims_arg, ndims_arg)); } | |
404 | |
405 mwSize get_number_of_elements (void) const { return rep->get_number_of_elements (); } | |
406 | |
407 int is_empty (void) const { return get_number_of_elements () == 0; } | |
238 | 408 |
239 const char *get_name (void) const { return name; } | 409 const char *get_name (void) const { return name; } |
240 | 410 |
241 void set_name (const char *name_arg); | 411 void set_name (const char *name_arg); |
242 | 412 |
243 virtual mxClassID get_class_id (void) const { return rep->get_class_id (); } | 413 mxClassID get_class_id (void) const { return rep->get_class_id (); } |
244 | 414 |
245 virtual const char *get_class_name (void) const { return rep->get_class_name (); } | 415 const char *get_class_name (void) const { return rep->get_class_name (); } |
246 | 416 |
247 virtual void set_class_name (const char *name_arg) { DO_VOID_MUTABLE_METHOD (set_class_name (name_arg)); } | 417 void set_class_name (const char *name_arg) { DO_VOID_MUTABLE_METHOD (set_class_name (name_arg)); } |
248 | 418 |
249 virtual mxArray *get_cell (mwIndex idx) const { DO_MUTABLE_METHOD (mxArray *, get_cell (idx)); } | 419 mxArray *get_cell (mwIndex idx) const { DO_MUTABLE_METHOD (mxArray *, get_cell (idx)); } |
250 | 420 |
251 virtual void set_cell (mwIndex idx, mxArray *val) { DO_VOID_MUTABLE_METHOD (set_cell (idx, val)); } | 421 void set_cell (mwIndex idx, mxArray *val) { DO_VOID_MUTABLE_METHOD (set_cell (idx, val)); } |
252 | 422 |
253 virtual double get_scalar (void) const { return rep->get_scalar (); } | 423 double get_scalar (void) const { return rep->get_scalar (); } |
254 | 424 |
255 virtual void *get_data (void) const { DO_MUTABLE_METHOD (void *, get_data ()); } | 425 void *get_data (void) const { DO_MUTABLE_METHOD (void *, get_data ()); } |
256 | 426 |
257 virtual void *get_imag_data (void) const { DO_MUTABLE_METHOD (void *, get_imag_data ()); } | 427 void *get_imag_data (void) const { DO_MUTABLE_METHOD (void *, get_imag_data ()); } |
258 | 428 |
259 virtual void set_data (void *pr) { DO_VOID_MUTABLE_METHOD (set_data (pr)); } | 429 void set_data (void *pr) { DO_VOID_MUTABLE_METHOD (set_data (pr)); } |
260 | 430 |
261 virtual void set_imag_data (void *pi) { DO_VOID_MUTABLE_METHOD (set_imag_data (pi)); } | 431 void set_imag_data (void *pi) { DO_VOID_MUTABLE_METHOD (set_imag_data (pi)); } |
262 | 432 |
263 virtual mwIndex *get_ir (void) const { DO_MUTABLE_METHOD (mwIndex *, get_ir ()); } | 433 mwIndex *get_ir (void) const { DO_MUTABLE_METHOD (mwIndex *, get_ir ()); } |
264 | 434 |
265 virtual mwIndex *get_jc (void) const { DO_MUTABLE_METHOD (mwIndex *, get_jc ()); } | 435 mwIndex *get_jc (void) const { DO_MUTABLE_METHOD (mwIndex *, get_jc ()); } |
266 | 436 |
267 virtual mwSize get_nzmax (void) const { return rep->get_nzmax (); } | 437 mwSize get_nzmax (void) const { return rep->get_nzmax (); } |
268 | 438 |
269 virtual void set_ir (mwIndex *ir) { DO_VOID_MUTABLE_METHOD (set_ir (ir)); } | 439 void set_ir (mwIndex *ir) { DO_VOID_MUTABLE_METHOD (set_ir (ir)); } |
270 | 440 |
271 virtual void set_jc (mwIndex *jc) { DO_VOID_MUTABLE_METHOD (set_jc (jc)); } | 441 void set_jc (mwIndex *jc) { DO_VOID_MUTABLE_METHOD (set_jc (jc)); } |
272 | 442 |
273 virtual void set_nzmax (mwSize nzmax) { DO_VOID_MUTABLE_METHOD (set_nzmax (nzmax)); } | 443 void set_nzmax (mwSize nzmax) { DO_VOID_MUTABLE_METHOD (set_nzmax (nzmax)); } |
274 | 444 |
275 virtual int add_field (const char *key) { DO_MUTABLE_METHOD (int, add_field (key)); } | 445 int add_field (const char *key) { DO_MUTABLE_METHOD (int, add_field (key)); } |
276 | 446 |
277 virtual void remove_field (int key_num) { DO_VOID_MUTABLE_METHOD (remove_field (key_num)); } | 447 void remove_field (int key_num) { DO_VOID_MUTABLE_METHOD (remove_field (key_num)); } |
278 | 448 |
279 virtual mxArray *get_field_by_number (mwIndex index, int key_num) const { DO_MUTABLE_METHOD (mxArray *, get_field_by_number (index, key_num)); } | 449 mxArray *get_field_by_number (mwIndex index, int key_num) const { DO_MUTABLE_METHOD (mxArray *, get_field_by_number (index, key_num)); } |
280 | 450 |
281 virtual void set_field_by_number (mwIndex index, int key_num, mxArray *val) { DO_VOID_MUTABLE_METHOD (set_field_by_number (index, key_num, val)); } | 451 void set_field_by_number (mwIndex index, int key_num, mxArray *val) { DO_VOID_MUTABLE_METHOD (set_field_by_number (index, key_num, val)); } |
282 | 452 |
283 virtual int get_number_of_fields (void) const { return rep->get_number_of_fields (); } | 453 int get_number_of_fields (void) const { return rep->get_number_of_fields (); } |
284 | 454 |
285 virtual const char *get_field_name_by_number (int key_num) const { DO_MUTABLE_METHOD (const char*, get_field_name_by_number (key_num)); } | 455 const char *get_field_name_by_number (int key_num) const { DO_MUTABLE_METHOD (const char*, get_field_name_by_number (key_num)); } |
286 | 456 |
287 virtual int get_field_number (const char *key) const { DO_MUTABLE_METHOD (int, get_field_number (key)); } | 457 int get_field_number (const char *key) const { DO_MUTABLE_METHOD (int, get_field_number (key)); } |
288 | 458 |
289 virtual int get_string (char *buf, mwSize buflen) const { return rep->get_string (buf, buflen); } | 459 int get_string (char *buf, mwSize buflen) const { return rep->get_string (buf, buflen); } |
290 | 460 |
291 virtual char *array_to_string (void) const { return rep->array_to_string (); } | 461 char *array_to_string (void) const { return rep->array_to_string (); } |
292 | 462 |
293 virtual mwIndex calc_single_subscript (mwSize nsubs, mwIndex *subs) const { return rep->calc_single_subscript (nsubs, subs); } | 463 mwIndex calc_single_subscript (mwSize nsubs, mwIndex *subs) const { return rep->calc_single_subscript (nsubs, subs); } |
294 | 464 |
295 virtual size_t get_element_size (void) const { return rep->get_element_size (); } | 465 size_t get_element_size (void) const { return rep->get_element_size (); } |
296 | 466 |
297 virtual bool mutation_needed (void) const { return rep->mutation_needed (); } | 467 bool mutation_needed (void) const { return rep->mutation_needed (); } |
298 | 468 |
299 virtual mxArray *mutate (void) const { return rep->mutate (); } | 469 mxArray *mutate (void) const { return rep->mutate (); } |
300 | 470 |
301 static void *malloc (size_t n); | 471 static void *malloc (size_t n); |
302 | 472 |
303 static void *calloc (size_t n, size_t t); | 473 static void *calloc (size_t n, size_t t); |
304 | 474 |
318 | 488 |
319 static octave_value as_octave_value (mxArray *ptr); | 489 static octave_value as_octave_value (mxArray *ptr); |
320 | 490 |
321 protected: | 491 protected: |
322 | 492 |
323 virtual octave_value as_octave_value (void) const; | 493 octave_value as_octave_value (void) const; |
324 | |
325 mxArray (const xmxArray&) : rep (0), name (0) { } | |
326 | 494 |
327 private: | 495 private: |
328 | 496 |
329 mutable mxArray *rep; | 497 mutable mxArray_base *rep; |
330 | 498 |
331 char *name; | 499 char *name; |
332 | 500 |
333 mxArray (mxArray *r, const char *n) | 501 mxArray (mxArray_base *r, const char *n) |
334 : rep (r), name (strsave (n)) { } | 502 : rep (r), name (strsave (n)) { } |
335 | 503 |
336 void maybe_mutate (void) const; | 504 void maybe_mutate (void) const; |
337 | 505 |
338 // No copying! | 506 // No copying! |