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!