GNU Octave 7.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
ov-base.h
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 1996-2022 The Octave Project Developers
4//
5// See the file COPYRIGHT.md in the top-level directory of this
6// distribution or <https://octave.org/copyright/>.
7//
8// This file is part of Octave.
9//
10// Octave is free software: you can redistribute it and/or modify it
11// under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// Octave is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with Octave; see the file COPYING. If not, see
22// <https://www.gnu.org/licenses/>.
23//
24////////////////////////////////////////////////////////////////////////
25
26#if ! defined (octave_ov_base_h)
27#define octave_ov_base_h 1
28
29#include "octave-config.h"
30
31#include <cstdlib>
32
33#include <iosfwd>
34#include <list>
35#include <memory>
36#include <string>
37
38#include "Range.h"
39#include "data-conv.h"
40#include "mx-base.h"
41#include "str-vec.h"
42
43#include "auto-shlib.h"
44#include "oct-hdf5-types.h"
45#include "oct-stream.h"
46
47namespace octave
48{
49 class stack_frame;
50 class type_info;
51
52 // FIXME: This is not ideal, but it avoids including
53 // interpreter-private.h here and bringing in a lot of unnecessary
54 // symbols that require even more header files.
55
56 extern OCTINTERP_API type_info& __get_type_info__ (const std::string&);
57}
58
59class Cell;
61class mxArray;
62class octave_map;
64class octave_value;
66class octave_classdef;
67class octave_function;
73
75{
95};
96
97extern OCTINTERP_API std::string btyp_class_name [];
98
100{ return btyp <= btyp_uint64; }
101
103{ return btyp >= btyp_int8 && btyp <= btyp_uint64; }
104
105inline bool btyp_isfloat (builtin_type_t btyp)
106{ return btyp <= btyp_float_complex; }
108inline bool btyp_isarray (builtin_type_t btyp)
109{ return btyp <= btyp_char; }
110
111//! Determine the resulting type for a possible mixed-type operation.
112//!
113//! Rules for the resulting type:
114//! - bool -> double
115//! - single + double -> single
116//! - real + complex -> complex
117//! - integer + real -> integer
118//! - uint + uint -> uint (the bigger one)
119//! - sint + sint -> sint (the bigger one)
120//!
121//! @return The resulting type or "unknown type", if the resulting type cannot
122//! be determined.
123
124extern OCTINTERP_API
126
127template <typename T>
129{
131};
132
133template <builtin_type_t BTYP>
135{
136 typedef void type;
137};
138
139#define DEF_BTYP_TRAITS(BTYP, CLASS) \
140 template <> \
141 struct class_to_btyp<CLASS> \
142 { \
143 static const builtin_type_t btyp = BTYP; \
144 }; \
145 \
146 template <> \
147 struct btyp_to_class<BTYP> \
148 { \
149 typedef CLASS type; \
150 }
151
166
167
168// T_ID is the type id of struct objects, set by register_type().
169// T_NAME is the type name of struct objects.
170
171#define OCTAVE_EMPTY_CPP_ARG /* empty */
172
173#define DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA \
174 DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2 (OCTAVE_EMPTY_CPP_ARG)
175
176#define DECLARE_OV_BASE_TYPEID_FUNCTIONS_AND_DATA \
177 DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2(virtual)
178
179#define DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2(VIRTUAL) \
180 public: \
181 VIRTUAL int type_id (void) const { return t_id; } \
182 VIRTUAL std::string type_name (void) const { return t_name; } \
183 VIRTUAL std::string class_name (void) const { return c_name; } \
184 static int static_type_id (void) { return t_id; } \
185 static std::string static_type_name (void) { return t_name; } \
186 static std::string static_class_name (void) { return c_name; } \
187 static void register_type (void); \
188 static void register_type (octave::type_info&); \
189 \
190 private: \
191 static int t_id; \
192 static const std::string t_name; \
193 static const std::string c_name;
194
195#define DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS(cls, type) \
196 template <> void cls<type>::register_type (void); \
197 template <> void cls<type>::register_type (octave::type_info&); \
198 template <> int cls<type>::t_id; \
199 template <> const std::string cls<type>::t_name; \
200 template <> const std::string cls<type>::c_name;
201
202#define DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA_INTERNAL(tspec, t, n, c) \
203 tspec int t::t_id (-1); \
204 tspec const std::string t::t_name (n); \
205 tspec const std::string t::c_name (c); \
206 tspec void t::register_type (void) \
207 { \
208 octave::type_info& type_info \
209 = octave::__get_type_info__ (#t "::register_type"); \
210 \
211 register_type (type_info); \
212 } \
213 tspec void t::register_type (octave::type_info& ti) \
214 { \
215 octave_value v (new t ()); \
216 t_id = ti.register_type (t::t_name, t::c_name, v); \
217 }
218
219#define DEFINE_TEMPLATE_OV_TYPEID_FUNCTIONS_AND_DATA(t, n, c) \
220 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA_INTERNAL (template <>, t, n, c)
221
222#define DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(t, n, c) \
223 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA_INTERNAL ( , t, n, c)
224
225// A base value type, so that derived types only have to redefine what
226// they need (if they are derived from octave_base_value instead of
227// octave_value).
228
229class
230OCTINTERP_API
232{
233public:
234
235 typedef octave_base_value * (*type_conv_fcn) (const octave_base_value&);
236
237 // type conversion, including result type information
239 {
240 public:
241 type_conv_info (type_conv_fcn f = nullptr, int t = -1)
242 : m_fcn (f), m_type_id (t) { }
243
244 operator type_conv_fcn (void) const { return m_fcn; }
245
246 octave_base_value * operator () (const octave_base_value& v) const
247 { return (*m_fcn) (v); }
248
249 int type_id (void) const { return m_type_id; }
250
251 private:
252 type_conv_fcn m_fcn;
254 };
255
256 friend class octave_value;
257
258 octave_base_value (void) : count (1) { }
259
260 octave_base_value (const octave_base_value&) : count (1) { }
261
262 virtual ~octave_base_value (void) = default;
263
264 // Unconditional clone. Always clones.
265 virtual octave_base_value *
266 clone (void) const { return new octave_base_value (*this); }
267
268 // Empty clone.
269 virtual octave_base_value *
270 empty_clone (void) const;
271
272 // Unique clone. Usually clones, but may be overridden to fake the
273 // cloning when sharing copies is to be controlled from within an
274 // instance (see octave_class).
275 virtual octave_base_value *
276 unique_clone (void) { return clone (); }
277
278 virtual void break_closure_cycles (const std::shared_ptr<octave::stack_frame>&) { }
279
280 virtual type_conv_info
282 { return type_conv_info (); }
283
284 virtual type_conv_info
286 { return type_conv_info (); }
287
288 virtual octave_value squeeze (void) const;
289
290 virtual octave_value full_value (void) const;
291
292 virtual octave_value as_double (void) const;
293 virtual octave_value as_single (void) const;
294
295 virtual octave_value as_int8 (void) const;
296 virtual octave_value as_int16 (void) const;
297 virtual octave_value as_int32 (void) const;
298 virtual octave_value as_int64 (void) const;
299
300 virtual octave_value as_uint8 (void) const;
301 virtual octave_value as_uint16 (void) const;
302 virtual octave_value as_uint32 (void) const;
303 virtual octave_value as_uint64 (void) const;
304
305 virtual octave_base_value * try_narrowing_conversion (void) { return nullptr; }
306
307 virtual void maybe_economize (void) { }
308
309 virtual Matrix size (void);
310
312
313 // FIXME: Do we really need all three of these versions of subsref?
314
315 virtual octave_value
316 subsref (const std::string& type,
317 const std::list<octave_value_list>& idx);
318
319 virtual octave_value_list
320 subsref (const std::string& type,
321 const std::list<octave_value_list>& idx,
322 int nargout);
323
324 virtual octave_value
325 subsref (const std::string& type,
326 const std::list<octave_value_list>& idx,
327 bool auto_add);
328
329 virtual octave_value
330 do_index_op (const octave_value_list& idx, bool resize_ok = false);
331
332 virtual void assign (const std::string&, const octave_value&) { }
333
334 virtual octave_value
335 subsasgn (const std::string& type,
336 const std::list<octave_value_list>& idx,
337 const octave_value& rhs);
338
339 virtual octave_value
340 undef_subsasgn (const std::string& type,
341 const std::list<octave_value_list>& idx,
342 const octave_value& rhs);
343
344 virtual octave::idx_vector index_vector (bool require_integers = false) const;
345
346 virtual dim_vector dims (void) const { return dim_vector (); }
347
349 {
350 const dim_vector dv = dims ();
351
352 return dv(0);
353 }
354
356 {
357 const dim_vector dv = dims ();
358
359 return dv(1);
360 }
361
362 virtual int ndims (void) const
363 { return dims ().ndims (); }
364
365 virtual octave_idx_type numel (void) const { return dims ().numel (); }
366
367 virtual std::size_t byte_size (void) const { return 0; }
368
369 virtual octave_idx_type nnz (void) const;
370
371 virtual octave_idx_type nzmax (void) const;
372
373 virtual octave_idx_type nfields (void) const;
374
375 virtual octave_value reshape (const dim_vector&) const;
376
377 virtual octave_value permute (const Array<int>& vec, bool = false) const;
378
379 virtual octave_value resize (const dim_vector&, bool fill = false) const;
380
381 virtual MatrixType matrix_type (void) const;
382
383 virtual MatrixType matrix_type (const MatrixType& typ) const;
384
385 virtual bool is_defined (void) const { return false; }
386
387 virtual bool is_storable (void) const { return true; }
388
389 virtual bool is_legacy_object (void) const { return false; }
390
391 bool isempty (void) const { return (dims ().any_zero ()); }
392
393 bool is_zero_by_zero (void) const { return dims().zero_by_zero (); }
394
395 virtual bool iscell (void) const { return false; }
396
397 virtual bool iscellstr (void) const { return false; }
398
399 virtual bool is_real_scalar (void) const { return false; }
400
401 virtual bool is_real_matrix (void) const { return false; }
402
403 virtual bool is_complex_scalar (void) const { return false; }
404
405 virtual bool is_complex_matrix (void) const { return false; }
406
407 virtual bool is_bool_scalar (void) const { return false; }
408
409 virtual bool is_bool_matrix (void) const { return false; }
410
411 virtual bool is_char_matrix (void) const { return false; }
412
413 virtual bool is_diag_matrix (void) const { return false; }
414
415 virtual bool is_perm_matrix (void) const { return false; }
416
417 virtual bool is_string (void) const { return false; }
418
419 virtual bool is_sq_string (void) const { return false; }
420
421 virtual bool is_range (void) const { return false; }
422
423 virtual bool isstruct (void) const { return false; }
424
425 virtual bool isobject (void) const { return false; }
426
427 virtual bool is_classdef_meta (void) const { return false; }
428
429 virtual bool is_classdef_superclass_ref (void) const { return false; }
430
431 virtual bool is_classdef_object (void) const { return false; }
432
433 virtual bool is_package (void) const { return false; }
434
435 virtual bool isjava (void) const { return false; }
436
437 virtual bool is_cs_list (void) const { return false; }
438
439 virtual bool is_magic_colon (void) const { return false; }
440
441 virtual bool is_all_va_args (void) const { return false; }
442
443 virtual octave_value all (int = 0) const;
444
445 virtual octave_value any (int = 0) const;
446
447 virtual builtin_type_t builtin_type (void) const { return btyp_unknown; }
448
449 virtual bool is_double_type (void) const { return false; }
450
451 virtual bool is_single_type (void) const { return false; }
452
453 virtual bool isfloat (void) const { return false; }
454
455 virtual bool is_int8_type (void) const { return false; }
456
457 virtual bool is_int16_type (void) const { return false; }
458
459 virtual bool is_int32_type (void) const { return false; }
460
461 virtual bool is_int64_type (void) const { return false; }
462
463 virtual bool is_uint8_type (void) const { return false; }
464
465 virtual bool is_uint16_type (void) const { return false; }
466
467 virtual bool is_uint32_type (void) const { return false; }
468
469 virtual bool is_uint64_type (void) const { return false; }
470
471 virtual bool islogical (void) const { return false; }
472
473 virtual bool isinteger (void) const { return false; }
474
475 virtual bool isreal (void) const { return false; }
476
477 virtual bool iscomplex (void) const { return false; }
478
479 // Would be nice to get rid of the next four functions:
480
481 virtual bool is_scalar_type (void) const { return false; }
482
483 virtual bool is_matrix_type (void) const { return false; }
484
485 virtual bool isnumeric (void) const { return false; }
486
487 virtual bool issparse (void) const { return false; }
488
489 virtual bool is_true (void) const { return false; }
490
491 virtual bool is_magic_int (void) const { return false; }
492
493 virtual bool isnull (void) const { return false; }
494
495 virtual bool is_constant (void) const { return false; }
496
497 virtual bool is_function_handle (void) const { return false; }
498
499 virtual bool is_anonymous_function (void) const { return false; }
500
501 virtual bool is_inline_function (void) const { return false; }
502
503 virtual bool is_function (void) const { return false; }
504
505 virtual bool is_user_script (void) const { return false; }
506
507 virtual bool is_user_function (void) const { return false; }
508
509 virtual bool is_user_code (void) const { return false; }
510
511 virtual bool is_builtin_function (void) const { return false; }
512
513 virtual bool is_dld_function (void) const { return false; }
514
515 virtual bool is_mex_function (void) const { return false; }
516
517 virtual void erase_subfunctions (void) { }
518
519 virtual short int short_value (bool = false, bool = false) const;
520
521 virtual unsigned short int ushort_value (bool = false, bool = false) const;
522
523 virtual int int_value (bool = false, bool = false) const;
524
525 virtual unsigned int uint_value (bool = false, bool = false) const;
526
527 virtual int nint_value (bool = false) const;
528
529 virtual long int long_value (bool = false, bool = false) const;
530
531 virtual unsigned long int ulong_value (bool = false, bool = false) const;
532
533 virtual int64_t int64_value (bool = false, bool = false) const;
534
535 virtual uint64_t uint64_value (bool = false, bool = false) const;
536
537 virtual double double_value (bool = false) const;
538
539 virtual float float_value (bool = false) const;
540
541 virtual double scalar_value (bool frc_str_conv = false) const
542 { return double_value (frc_str_conv); }
543
544 virtual float float_scalar_value (bool frc_str_conv = false) const
545 { return float_value (frc_str_conv); }
546
547 virtual Cell cell_value (void) const;
548
549 virtual Matrix matrix_value (bool = false) const;
550
551 virtual FloatMatrix float_matrix_value (bool = false) const;
552
553 virtual NDArray array_value (bool = false) const;
554
555 virtual FloatNDArray float_array_value (bool = false) const;
556
557 virtual Complex complex_value (bool = false) const;
558
559 virtual FloatComplex float_complex_value (bool = false) const;
560
561 virtual ComplexMatrix complex_matrix_value (bool = false) const;
562
563 virtual FloatComplexMatrix float_complex_matrix_value (bool = false) const;
564
565 virtual ComplexNDArray complex_array_value (bool = false) const;
566
567 virtual FloatComplexNDArray float_complex_array_value (bool = false) const;
568
569 virtual bool bool_value (bool = false) const;
570
571 virtual boolMatrix bool_matrix_value (bool = false) const;
572
573 virtual boolNDArray bool_array_value (bool = false) const;
574
575 virtual charMatrix char_matrix_value (bool force = false) const;
576
577 virtual charNDArray char_array_value (bool = false) const;
578
579 virtual SparseMatrix sparse_matrix_value (bool = false) const;
580
581 virtual SparseComplexMatrix sparse_complex_matrix_value (bool = false) const;
582
583 virtual SparseBoolMatrix sparse_bool_matrix_value (bool = false) const;
584
585 virtual DiagMatrix diag_matrix_value (bool = false) const;
586
587 virtual FloatDiagMatrix float_diag_matrix_value (bool = false) const;
588
589 virtual ComplexDiagMatrix complex_diag_matrix_value (bool = false) const;
590
592 float_complex_diag_matrix_value (bool = false) const;
593
594 virtual PermMatrix perm_matrix_value (void) const;
595
596 virtual octave_int8 int8_scalar_value (void) const;
597
598 virtual octave_int16 int16_scalar_value (void) const;
599
600 virtual octave_int32 int32_scalar_value (void) const;
601
602 virtual octave_int64 int64_scalar_value (void) const;
603
604 virtual octave_uint8 uint8_scalar_value (void) const;
605
606 virtual octave_uint16 uint16_scalar_value (void) const;
607
608 virtual octave_uint32 uint32_scalar_value (void) const;
609
610 virtual octave_uint64 uint64_scalar_value (void) const;
611
612 virtual int8NDArray int8_array_value (void) const;
613
614 virtual int16NDArray int16_array_value (void) const;
615
616 virtual int32NDArray int32_array_value (void) const;
617
618 virtual int64NDArray int64_array_value (void) const;
619
620 virtual uint8NDArray uint8_array_value (void) const;
621
622 virtual uint16NDArray uint16_array_value (void) const;
623
624 virtual uint32NDArray uint32_array_value (void) const;
625
626 virtual uint64NDArray uint64_array_value (void) const;
627
628 virtual string_vector string_vector_value (bool pad = false) const;
629
630 virtual std::string string_value (bool force = false) const;
631
632 virtual Array<std::string> cellstr_value (void) const;
633
634 virtual octave::range<double> range_value (void) const;
635
636 // For now, disable all but range<double>.
637
638#if 0
639
640 virtual octave::range<float> float_range_value (void) const;
641
642 virtual octave::range<octave_int8> int8_range_value (void) const;
643
644 virtual octave::range<octave_int16> int16_range_value (void) const;
645
646 virtual octave::range<octave_int32> int32_range_value (void) const;
647
648 virtual octave::range<octave_int64> int64_range_value (void) const;
649
650 virtual octave::range<octave_uint8> uint8_range_value (void) const;
651
652 virtual octave::range<octave_uint16> uint16_range_value (void) const;
653
654 virtual octave::range<octave_uint32> uint32_range_value (void) const;
655
656 virtual octave::range<octave_uint64> uint64_range_value (void) const;
657
658#endif
659
660 virtual octave_map map_value (void) const;
661
662 virtual octave_scalar_map scalar_map_value (void) const;
663
664 virtual string_vector map_keys (void) const;
665
666 virtual std::size_t nparents (void) const;
667
668 virtual std::list<std::string> parent_class_name_list (void) const;
669
670 virtual string_vector parent_class_names (void) const;
671
672 virtual octave_base_value * find_parent_class (const std::string&)
673 { return nullptr; }
674
675 virtual octave_base_value * unique_parent_class (const std::string&)
676 { return nullptr; }
677
678 virtual bool is_instance_of (const std::string&) const
679 { return false; }
680
681 virtual octave_classdef * classdef_object_value (bool silent = false);
682
683 virtual octave_function * function_value (bool silent = false);
684
685 virtual octave_user_function * user_function_value (bool silent = false);
686
687 virtual octave_user_script * user_script_value (bool silent = false);
688
689 virtual octave_user_code * user_code_value (bool silent = false);
690
691 virtual octave_fcn_handle * fcn_handle_value (bool silent = false);
692
693 virtual octave_value_list list_value (void) const;
694
695 virtual octave_value convert_to_str (bool pad = false, bool force = false,
696 char type = '\'') const;
697 virtual octave_value
698 convert_to_str_internal (bool pad, bool force, char type) const;
699
700 virtual void convert_to_row_or_column_vector (void);
701
702 // The following extractor functions don't perform any implicit type
703 // conversions.
704
705 virtual std::string xstring_value () const;
706
707 virtual bool print_as_scalar (void) const { return false; }
708
709 virtual void print (std::ostream& os, bool pr_as_read_syntax = false);
710
711 virtual void
712 print_raw (std::ostream& os, bool pr_as_read_syntax = false) const;
713
714 virtual bool
715 print_name_tag (std::ostream& os, const std::string& name) const;
716
717 virtual void
718 print_with_name (std::ostream& output_buf, const std::string& name,
719 bool print_padding = true);
720
721 virtual void short_disp (std::ostream& os) const { os << "..."; }
722
724
725 virtual std::string edit_display (const float_display_format&,
727 { return "#VAL"; }
728
729 virtual void print_info (std::ostream& os, const std::string& prefix) const;
730
731 virtual bool save_ascii (std::ostream& os);
732
733 virtual bool load_ascii (std::istream& is);
734
735 virtual bool save_binary (std::ostream& os, bool save_as_floats);
736
737 virtual bool load_binary (std::istream& is, bool swap,
739
740 virtual bool
741 save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats);
742
743 virtual bool
744 load_hdf5 (octave_hdf5_id loc_id, const char *name);
745
746 virtual int
747 write (octave::stream& os, int block_size,
748 oct_data_conv::data_type output_type, int skip,
749 octave::mach_info::float_format flt_fmt) const;
750
751 virtual const void * mex_get_data (void) const { return nullptr; }
752
753 virtual const octave_idx_type * mex_get_ir (void) const { return nullptr; }
754
755 virtual const octave_idx_type * mex_get_jc (void) const { return nullptr; }
756
757 virtual mxArray * as_mxArray (bool interleaved) const;
758
759 virtual octave_value diag (octave_idx_type k = 0) const;
760
762
763 virtual octave_value sort (octave_idx_type dim = 0,
764 sortmode mode = ASCENDING) const;
766 octave_idx_type dim = 0,
767 sortmode mode = ASCENDING) const;
768
769 virtual sortmode issorted (sortmode mode = UNSORTED) const;
770
772 sort_rows_idx (sortmode mode = ASCENDING) const;
773
774 virtual sortmode is_sorted_rows (sortmode mode = UNSORTED) const;
775
776 virtual void lock (void);
777
778 virtual void unlock (void);
779
780 virtual bool islocked (void) const { return false; }
781
782 virtual void call_object_destructor (void) { }
783
784 virtual octave_value dump (void) const;
785
786 // Standard mappers. Register new ones here.
788 {
850 num_unary_mappers = umap_unknown
851 };
852
853 virtual octave_value map (unary_mapper_t) const;
854
855 // These are fast indexing & assignment shortcuts for extracting
856 // or inserting a single scalar from/to an array.
857
858 // Extract the n-th element, aka val(n). Result is undefined if val is not
859 // an array type or n is out of range. Never error.
860 virtual octave_value
862
863 // Assign the n-th element, aka val(n) = x. Returns false if val is not an
864 // array type, x is not a matching scalar type, or n is out of range.
865 // Never error.
866 virtual bool
868
869 // This is a helper for the above, to be overridden in scalar types. The
870 // whole point is to handle the insertion efficiently with just *two* VM
871 // calls, which is basically the theoretical minimum.
872 virtual bool
873 fast_elem_insert_self (void *where, builtin_type_t btyp) const;
874
875protected:
876
877 // This should only be called for derived types.
878
879 OCTINTERP_API octave_value
880 numeric_assign (const std::string& type,
881 const std::list<octave_value_list>& idx,
882 const octave_value& rhs);
883
884 void reset_indent_level (void) const
885 { s_curr_print_indent_level = 0; }
886
887 void increment_indent_level (void) const
888 { s_curr_print_indent_level += 2; }
889
890 void decrement_indent_level (void) const
891 { s_curr_print_indent_level -= 2; }
892
894 { return s_curr_print_indent_level; }
895
896 OCTINTERP_API void indent (std::ostream& os) const;
897
898 OCTINTERP_API void newline (std::ostream& os) const;
899
900 OCTINTERP_API void reset (void) const;
901
902 // A reference count.
903 // NOTE: the declaration is octave_idx_type because with 64-bit indexing,
904 // it is well possible to have more than MAX_INT copies of a single value
905 // (think of an empty cell array with >2G elements).
907
908 OCTINTERP_API static const char * get_umap_name (unary_mapper_t);
909
910 OCTINTERP_API void warn_load (const char *type) const;
911 OCTINTERP_API void warn_save (const char *type) const;
912
913private:
914
915 OCTINTERP_API void wrong_type_arg_error (void) const;
916
917 //--------
918
921
923};
924
925class
926OCTINTERP_API
928{
929public:
930
931 octave_base_dld_value (void) = default;
932
934 {
935 m_containing_dynamic_library.delete_later ();
936 }
937
939
940private:
941
943};
944
945// TRUE means to perform automatic sparse to real mutation if there
946// is memory to be saved
947extern OCTINTERP_API bool Vsparse_auto_mutate;
948
949// Utility function to convert C++ arguments used in subsref/subsasgn into an
950// octave_value_list object that can be used to call a function/method in the
951// interpreter.
952extern OCTINTERP_API octave_value
953make_idx_args (const std::string& type,
954 const std::list<octave_value_list>& idx,
955 const std::string& who);
956
957// Tells whether some regular octave_value_base methods are being called from
958// within the "builtin" function.
959extern OCTINTERP_API bool called_from_builtin (void);
960
961#endif
Definition: Cell.h:43
Definition: dMatrix.h:42
Vector representing the dimensions (size) of an Array.
Definition: dim-vector.h:94
octave_idx_type numel(int n=0) const
Number of elements that a matrix with this dimensions would have.
Definition: dim-vector.h:335
bool zero_by_zero(void) const
Definition: dim-vector.h:311
octave_idx_type ndims(void) const
Number of dimensions.
Definition: dim-vector.h:257
octave_base_dld_value(const octave_base_dld_value &)=default
octave_base_dld_value(void)=default
~octave_base_dld_value(void)
Definition: ov-base.h:933
octave::auto_shlib m_containing_dynamic_library
Definition: ov-base.h:942
type_conv_info(type_conv_fcn f=nullptr, int t=-1)
Definition: ov-base.h:241
virtual bool is_mex_function(void) const
Definition: ov-base.h:515
virtual bool isinteger(void) const
Definition: ov-base.h:473
virtual bool is_uint64_type(void) const
Definition: ov-base.h:469
virtual ~octave_base_value(void)=default
virtual type_conv_info numeric_conversion_function(void) const
Definition: ov-base.h:281
virtual bool isfloat(void) const
Definition: ov-base.h:453
virtual type_conv_info numeric_demotion_function(void) const
Definition: ov-base.h:285
virtual bool is_real_matrix(void) const
Definition: ov-base.h:401
octave_idx_type columns(void) const
Definition: ov-base.h:355
octave::refcount< octave_idx_type > count
Definition: ov-base.h:906
virtual octave_base_value * try_narrowing_conversion(void)
Definition: ov-base.h:305
virtual bool is_classdef_superclass_ref(void) const
Definition: ov-base.h:429
void decrement_indent_level(void) const
Definition: ov-base.h:890
virtual bool is_classdef_object(void) const
Definition: ov-base.h:431
virtual bool is_diag_matrix(void) const
Definition: ov-base.h:413
virtual bool is_function(void) const
Definition: ov-base.h:503
virtual const void * mex_get_data(void) const
Definition: ov-base.h:751
virtual void short_disp(std::ostream &os) const
Definition: ov-base.h:721
static int s_curr_print_indent_level
Definition: ov-base.h:919
virtual bool is_user_code(void) const
Definition: ov-base.h:509
void increment_indent_level(void) const
Definition: ov-base.h:887
virtual bool is_package(void) const
Definition: ov-base.h:433
virtual bool issparse(void) const
Definition: ov-base.h:487
virtual const octave_idx_type * mex_get_jc(void) const
Definition: ov-base.h:755
static bool s_beginning_of_line
Definition: ov-base.h:920
virtual bool is_uint16_type(void) const
Definition: ov-base.h:465
virtual bool is_constant(void) const
Definition: ov-base.h:495
virtual bool is_uint32_type(void) const
Definition: ov-base.h:467
virtual bool is_storable(void) const
Definition: ov-base.h:387
virtual bool is_user_function(void) const
Definition: ov-base.h:507
virtual void erase_subfunctions(void)
Definition: ov-base.h:517
int current_print_indent_level(void) const
Definition: ov-base.h:893
virtual bool is_string(void) const
Definition: ov-base.h:417
virtual bool is_complex_matrix(void) const
Definition: ov-base.h:405
virtual std::size_t byte_size(void) const
Definition: ov-base.h:367
virtual bool is_int32_type(void) const
Definition: ov-base.h:459
virtual const octave_idx_type * mex_get_ir(void) const
Definition: ov-base.h:753
virtual void call_object_destructor(void)
Definition: ov-base.h:782
virtual bool isjava(void) const
Definition: ov-base.h:435
virtual float float_scalar_value(bool frc_str_conv=false) const
Definition: ov-base.h:544
virtual bool is_function_handle(void) const
Definition: ov-base.h:497
virtual bool print_as_scalar(void) const
Definition: ov-base.h:707
virtual bool is_magic_int(void) const
Definition: ov-base.h:491
virtual bool is_true(void) const
Definition: ov-base.h:489
virtual bool is_legacy_object(void) const
Definition: ov-base.h:389
virtual void assign(const std::string &, const octave_value &)
Definition: ov-base.h:332
virtual bool iscellstr(void) const
Definition: ov-base.h:397
virtual octave_base_value * unique_parent_class(const std::string &)
Definition: ov-base.h:675
virtual bool is_uint8_type(void) const
Definition: ov-base.h:463
virtual bool is_bool_scalar(void) const
Definition: ov-base.h:407
virtual bool is_inline_function(void) const
Definition: ov-base.h:501
virtual octave_base_value * find_parent_class(const std::string &)
Definition: ov-base.h:672
virtual bool islogical(void) const
Definition: ov-base.h:471
virtual bool is_user_script(void) const
Definition: ov-base.h:505
bool is_zero_by_zero(void) const
Definition: ov-base.h:393
virtual std::string edit_display(const float_display_format &, octave_idx_type, octave_idx_type) const
Definition: ov-base.h:725
virtual bool isobject(void) const
Definition: ov-base.h:425
octave_base_value(void)
Definition: ov-base.h:258
virtual octave_base_value * unique_clone(void)
Definition: ov-base.h:276
virtual bool is_matrix_type(void) const
Definition: ov-base.h:483
virtual bool is_complex_scalar(void) const
Definition: ov-base.h:403
virtual bool is_bool_matrix(void) const
Definition: ov-base.h:409
virtual void maybe_economize(void)
Definition: ov-base.h:307
virtual bool is_scalar_type(void) const
Definition: ov-base.h:481
void reset_indent_level(void) const
Definition: ov-base.h:884
virtual bool is_all_va_args(void) const
Definition: ov-base.h:441
virtual bool is_cs_list(void) const
Definition: ov-base.h:437
virtual bool is_int16_type(void) const
Definition: ov-base.h:457
virtual dim_vector dims(void) const
Definition: ov-base.h:346
virtual octave_idx_type numel(void) const
Definition: ov-base.h:365
virtual builtin_type_t builtin_type(void) const
Definition: ov-base.h:447
virtual bool is_dld_function(void) const
Definition: ov-base.h:513
octave_base_value(const octave_base_value &)
Definition: ov-base.h:260
virtual bool is_int8_type(void) const
Definition: ov-base.h:455
virtual bool isstruct(void) const
Definition: ov-base.h:423
octave_idx_type rows(void) const
Definition: ov-base.h:348
virtual bool is_double_type(void) const
Definition: ov-base.h:449
virtual double scalar_value(bool frc_str_conv=false) const
Definition: ov-base.h:541
virtual bool is_char_matrix(void) const
Definition: ov-base.h:411
virtual octave_base_value * clone(void) const
Definition: ov-base.h:266
virtual bool is_anonymous_function(void) const
Definition: ov-base.h:499
virtual bool is_int64_type(void) const
Definition: ov-base.h:461
virtual bool islocked(void) const
Definition: ov-base.h:780
virtual bool is_instance_of(const std::string &) const
Definition: ov-base.h:678
virtual int ndims(void) const
Definition: ov-base.h:362
virtual bool isnull(void) const
Definition: ov-base.h:493
virtual bool is_real_scalar(void) const
Definition: ov-base.h:399
virtual bool iscomplex(void) const
Definition: ov-base.h:477
virtual bool is_perm_matrix(void) const
Definition: ov-base.h:415
virtual bool is_classdef_meta(void) const
Definition: ov-base.h:427
virtual void break_closure_cycles(const std::shared_ptr< octave::stack_frame > &)
Definition: ov-base.h:278
virtual bool is_single_type(void) const
Definition: ov-base.h:451
virtual bool is_magic_colon(void) const
Definition: ov-base.h:439
virtual bool isreal(void) const
Definition: ov-base.h:475
virtual bool isnumeric(void) const
Definition: ov-base.h:485
virtual bool is_defined(void) const
Definition: ov-base.h:385
virtual bool is_sq_string(void) const
Definition: ov-base.h:419
virtual bool iscell(void) const
Definition: ov-base.h:395
bool isempty(void) const
Definition: ov-base.h:391
virtual bool is_builtin_function(void) const
Definition: ov-base.h:511
virtual bool is_range(void) const
Definition: ov-base.h:421
MatrixType matrix_type(void) const
Definition: ov.h:628
uint64_t uint64_value(bool req_int=false, bool frc_str_conv=false) const
Definition: ov.h:880
void print_raw(std::ostream &os, bool pr_as_read_syntax=false) const
Definition: ov.h:1428
int32NDArray int32_array_value(void) const
Definition: ov.h:1001
boolNDArray bool_array_value(bool warn=false) const
Definition: ov.h:936
uint16NDArray uint16_array_value(void) const
Definition: ov.h:1010
SparseMatrix sparse_matrix_value(bool frc_str_conv=false) const
Definition: ov.h:945
bool bool_value(bool warn=false) const
Definition: ov.h:930
octave_int64 int64_scalar_value(void) const
Definition: ov.h:980
octave_value convert_to_str_internal(bool pad, bool force, char type) const
Definition: ov.h:1416
OCTINTERP_API octave_value_list list_value(void) const
octave_value subsref(const std::string &type, const std::list< octave_value_list > &idx)
Definition: ov.h:525
OCTINTERP_API std::string xstring_value(const char *fmt,...) const
charMatrix char_matrix_value(bool frc_str_conv=false) const
Definition: ov.h:939
octave_uint8 uint8_scalar_value(void) const
Definition: ov.h:983
DiagMatrix diag_matrix_value(bool force=false) const
Definition: ov.h:955
bool fast_elem_insert(octave_idx_type n, const octave_value &x)
Assign the n-th element, aka 'val(n) = x'.
Definition: ov.h:1657
OCTINTERP_API octave_function * function_value(bool silent=false) const
octave_uint32 uint32_scalar_value(void) const
Definition: ov.h:989
int int_value(bool req_int=false, bool frc_str_conv=false) const
Definition: ov.h:857
void print_with_name(std::ostream &os, const std::string &name) const
Definition: ov.h:1434
octave_idx_type nnz(void) const
Definition: ov.h:610
OCTINTERP_API bool load_ascii(std::istream &is)
octave::idx_vector index_vector(bool require_integers=false) const
Definition: ov.h:579
int64_t int64_value(bool req_int=false, bool frc_str_conv=false) const
Definition: ov.h:876
OCTINTERP_API octave_scalar_map scalar_map_value(void) const
short int short_value(bool req_int=false, bool frc_str_conv=false) const
Definition: ov.h:850
octave_value permute(const Array< int > &vec, bool inv=false) const
Definition: ov.h:619
OCTINTERP_API int write(octave::stream &os, int block_size, oct_data_conv::data_type output_type, int skip, octave::mach_info::float_format flt_fmt) const
FloatDiagMatrix float_diag_matrix_value(bool force=false) const
Definition: ov.h:958
OCTINTERP_API octave_fcn_handle * fcn_handle_value(bool silent=false) const
ComplexMatrix complex_matrix_value(bool frc_str_conv=false) const
Definition: ov.h:916
std::list< std::string > parent_class_name_list(void) const
Definition: ov.h:1076
OCTINTERP_API octave_user_function * user_function_value(bool silent=false) const
octave_value dump(void) const
Definition: ov.h:1560
Complex complex_value(bool frc_str_conv=false) const
Definition: ov.h:910
Array< octave_idx_type > sort_rows_idx(sortmode mode=ASCENDING) const
Definition: ov.h:1546
octave_value as_uint64(void) const
Definition: ov.h:505
octave_value as_uint16(void) const
Definition: ov.h:503
FloatComplexDiagMatrix float_complex_diag_matrix_value(bool force=false) const
Definition: ov.h:965
octave_value as_single(void) const
Definition: ov.h:495
unsigned short int ushort_value(bool req_int=false, bool frc_str_conv=false) const
Definition: ov.h:854
bool save_hdf5(octave_hdf5_id loc_id, const char *name, bool save_as_floats)
Definition: ov.h:1497
octave_value full_value(void) const
Definition: ov.h:489
octave_value squeeze(void) const
Definition: ov.h:485
octave_value sort(octave_idx_type dim=0, sortmode mode=ASCENDING) const
Definition: ov.h:1537
void convert_to_row_or_column_vector(void)
Definition: ov.h:1419
octave_base_value * empty_clone(void) const
Definition: ov.h:391
ComplexNDArray complex_array_value(bool frc_str_conv=false) const
Definition: ov.h:923
octave_value as_uint32(void) const
Definition: ov.h:504
octave_int8 int8_scalar_value(void) const
Definition: ov.h:971
bool save_binary(std::ostream &os, bool save_as_floats)
Definition: ov.h:1491
charNDArray char_array_value(bool frc_str_conv=false) const
Definition: ov.h:942
octave_int32 int32_scalar_value(void) const
Definition: ov.h:977
octave_uint16 uint16_scalar_value(void) const
Definition: ov.h:986
bool save_ascii(std::ostream &os)
Definition: ov.h:1487
Cell cell_value(void) const
Matrix size(void)
Definition: ov.h:511
FloatComplex float_complex_value(bool frc_str_conv=false) const
Definition: ov.h:913
octave_idx_type xnumel(const octave_value_list &idx)
Definition: ov.h:516
int8NDArray int8_array_value(void) const
Definition: ov.h:995
octave_value as_int64(void) const
Definition: ov.h:500
float float_value(bool frc_str_conv=false) const
Definition: ov.h:889
int64NDArray int64_array_value(void) const
Definition: ov.h:1004
unsigned long int ulong_value(bool req_int=false, bool frc_str_conv=false) const
Definition: ov.h:872
uint8NDArray uint8_array_value(void) const
Definition: ov.h:1007
octave_value any(int dim=0) const
Definition: ov.h:732
OCTINTERP_API octave_classdef * classdef_object_value(bool silent=false) const
octave_value reshape(const dim_vector &dv) const
Definition: ov.h:616
octave_value as_int16(void) const
Definition: ov.h:498
octave_value as_uint8(void) const
Definition: ov.h:502
octave_value as_int32(void) const
Definition: ov.h:499
boolMatrix bool_matrix_value(bool warn=false) const
Definition: ov.h:933
octave_idx_type nfields(void) const
Definition: ov.h:614
octave_value fast_elem_extract(octave_idx_type n) const
Extract the n-th element, aka 'val(n)'.
Definition: ov.h:1645
void unlock(void)
Definition: ov.h:1554
std::string string_value(bool force=false) const
Definition: ov.h:1019
ComplexDiagMatrix complex_diag_matrix_value(bool force=false) const
Definition: ov.h:961
void lock(void)
Definition: ov.h:1552
int nint_value(bool frc_str_conv=false) const
Definition: ov.h:864
FloatMatrix float_matrix_value(bool frc_str_conv=false) const
Definition: ov.h:901
string_vector parent_class_names(void) const
Definition: ov.h:1079
Array< std::string > cellstr_value(void) const
Definition: ov.h:1027
octave_value map(octave_base_value::unary_mapper_t umap) const
Definition: ov.h:1634
octave_idx_type nzmax(void) const
Definition: ov.h:612
long int long_value(bool req_int=false, bool frc_str_conv=false) const
Definition: ov.h:868
uint64NDArray uint64_array_value(void) const
Definition: ov.h:1016
string_vector string_vector_value(bool pad=false) const
Definition: ov.h:1022
PermMatrix perm_matrix_value(void) const
Definition: ov.h:968
sortmode is_sorted_rows(sortmode mode=UNSORTED) const
Definition: ov.h:1549
mxArray * as_mxArray(bool interleaved=false) const
Definition: ov.h:1528
octave::range< double > range_value(void) const
Definition: ov.h:1030
octave_uint64 uint64_scalar_value(void) const
Definition: ov.h:992
SparseBoolMatrix sparse_bool_matrix_value(bool warn=false) const
Definition: ov.h:952
NDArray array_value(bool frc_str_conv=false) const
Definition: ov.h:904
uint32NDArray uint32_array_value(void) const
Definition: ov.h:1013
octave_value convert_to_str(bool pad=false, bool force=false, char type='\'') const
Definition: ov.h:1411
bool print_name_tag(std::ostream &os, const std::string &name) const
Definition: ov.h:1431
sortmode issorted(sortmode mode=UNSORTED) const
Definition: ov.h:1543
OCTINTERP_API octave_map map_value(void) const
octave_value all(int dim=0) const
Definition: ov.h:729
std::size_t nparents(void) const
Definition: ov.h:1073
OCTINTERP_API bool load_hdf5(octave_hdf5_id loc_id, const char *name)
FloatComplexNDArray float_complex_array_value(bool frc_str_conv=false) const
Definition: ov.h:927
OCTINTERP_API octave_user_code * user_code_value(bool silent=false) const
octave_value resize(const dim_vector &dv, bool fill=false) const
Definition: ov.h:625
FloatNDArray float_array_value(bool frc_str_conv=false) const
Definition: ov.h:907
octave_int16 int16_scalar_value(void) const
Definition: ov.h:974
int16NDArray int16_array_value(void) const
Definition: ov.h:998
OCTINTERP_API bool load_binary(std::istream &is, bool swap, octave::mach_info::float_format fmt)
OCTINTERP_API octave_value subsasgn(const std::string &type, const std::list< octave_value_list > &idx, const octave_value &rhs)
string_vector map_keys(void) const
Definition: ov.h:1070
Matrix matrix_value(bool frc_str_conv=false) const
Definition: ov.h:898
FloatComplexMatrix float_complex_matrix_value(bool frc_str_conv=false) const
Definition: ov.h:920
void print(std::ostream &os, bool pr_as_read_syntax=false)
Definition: ov.h:1425
OCTINTERP_API octave_value undef_subsasgn(const std::string &type, const std::list< octave_value_list > &idx, const octave_value &rhs)
octave_value diag(octave_idx_type k=0) const
Definition: ov.h:1531
double double_value(bool frc_str_conv=false) const
Definition: ov.h:886
unsigned int uint_value(bool req_int=false, bool frc_str_conv=false) const
Definition: ov.h:861
OCTINTERP_API octave_base_value * clone(void) const
octave_value as_int8(void) const
Definition: ov.h:497
OCTINTERP_API octave_user_script * user_script_value(bool silent=false) const
OCTINTERP_API void print_info(std::ostream &os, const std::string &prefix="") const
dim_vector dims(void) const
Definition: ov.h:586
SparseComplexMatrix sparse_complex_matrix_value(bool frc_str_conv=false) const
Definition: ov.h:949
QString name
F77_RET_T const F77_DBLE * x
F77_RET_T const F77_DBLE const F77_DBLE * f
static float_display_format get_edit_display_format(const octave_value &val)
type_info & __get_type_info__(const std::string &who)
std::complex< double > Complex
Definition: oct-cmplx.h:33
std::complex< float > FloatComplex
Definition: oct-cmplx.h:34
int64_t octave_hdf5_id
sortmode
Definition: oct-sort.h:97
@ UNSORTED
Definition: oct-sort.h:97
@ ASCENDING
Definition: oct-sort.h:97
static double as_double(OCTAVE_TIME_T sec, long usec)
Definition: oct-time.h:35
OCTINTERP_API std::string btyp_class_name[]
Definition: ov-base.cc:89
bool btyp_isnumeric(builtin_type_t btyp)
Definition: ov-base.h:99
#define DEF_BTYP_TRAITS(BTYP, CLASS)
Definition: ov-base.h:139
bool btyp_isinteger(builtin_type_t btyp)
Definition: ov-base.h:102
OCTINTERP_API builtin_type_t btyp_mixed_numeric(builtin_type_t x, builtin_type_t y)
Determine the resulting type for a possible mixed-type operation.
Definition: ov-base.cc:65
OCTINTERP_API bool called_from_builtin(void)
Definition: ov-base.cc:1519
#define DECLARE_OV_BASE_TYPEID_FUNCTIONS_AND_DATA
Definition: ov-base.h:176
bool btyp_isarray(builtin_type_t btyp)
Definition: ov-base.h:108
bool btyp_isfloat(builtin_type_t btyp)
Definition: ov-base.h:105
OCTINTERP_API octave_value make_idx_args(const std::string &type, const std::list< octave_value_list > &idx, const std::string &who)
Definition: ov-base.cc:1456
OCTINTERP_API bool Vsparse_auto_mutate
Definition: ov-base.cc:103
builtin_type_t
Definition: ov-base.h:75
@ btyp_float_complex
Definition: ov-base.h:79
@ btyp_cell
Definition: ov-base.h:91
@ btyp_func_handle
Definition: ov-base.h:92
@ btyp_double
Definition: ov-base.h:76
@ btyp_int32
Definition: ov-base.h:82
@ btyp_float
Definition: ov-base.h:77
@ btyp_struct
Definition: ov-base.h:90
@ btyp_uint16
Definition: ov-base.h:85
@ btyp_int64
Definition: ov-base.h:83
@ btyp_bool
Definition: ov-base.h:88
@ btyp_unknown
Definition: ov-base.h:93
@ btyp_uint64
Definition: ov-base.h:87
@ btyp_int16
Definition: ov-base.h:81
@ btyp_uint32
Definition: ov-base.h:86
@ btyp_num_types
Definition: ov-base.h:94
@ btyp_char
Definition: ov-base.h:89
@ btyp_uint8
Definition: ov-base.h:84
@ btyp_int8
Definition: ov-base.h:80
@ btyp_complex
Definition: ov-base.h:78
static const builtin_type_t btyp
Definition: ov-base.h:130