26#if ! defined (octave_ov_base_h)
27#define octave_ov_base_h 1
29#include "octave-config.h"
65OCTAVE_END_NAMESPACE(octave)
141template <builtin_type_t BTYP>
147#define DEF_BTYP_TRAITS(BTYP, CLASS) \
149 struct class_to_btyp<CLASS> \
151 static const builtin_type_t btyp = BTYP; \
155 struct btyp_to_class<BTYP> \
157 typedef CLASS type; \
179#define OCTAVE_EMPTY_CPP_ARG
181#define DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA \
182 DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2 (OCTAVE_EMPTY_CPP_ARG, \
183 OCTAVE_EMPTY_CPP_ARG)
185#define DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA_API(API) \
186 DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2 (OCTAVE_EMPTY_CPP_ARG, API)
188#define DECLARE_OV_BASE_TYPEID_FUNCTIONS_AND_DATA \
189 DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2 (virtual, OCTAVE_EMPTY_CPP_ARG)
191#define DECLARE_OV_BASE_TYPEID_FUNCTIONS_AND_DATA_API(API) \
192 DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2 (virtual, API)
194#define DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA2(VIRTUAL, API) \
196 VIRTUAL int type_id () const { return s_t_id; } \
197 VIRTUAL std::string type_name () const { return s_t_name; } \
198 VIRTUAL std::string class_name () const { return s_c_name; } \
199 static int static_type_id () { return s_t_id; } \
200 static std::string static_type_name () { return s_t_name; } \
201 static std::string static_class_name () { return s_c_name; } \
202 API static void register_type (); \
203 API static void register_type (octave::type_info&); \
206 static API int s_t_id; \
207 static API const std::string s_t_name; \
208 static API const std::string s_c_name;
210#define DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS(cls, type) \
211 DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS_API (cls, type, \
212 OCTAVE_EMPTY_CPP_ARG)
214#define DECLARE_TEMPLATE_OV_TYPEID_SPECIALIZATIONS_API(cls, type, API) \
215 template <> API void cls<type>::register_type (); \
216 template <> API void cls<type>::register_type (octave::type_info&); \
217 template <> API int cls<type>::s_t_id; \
218 template <> API const std::string cls<type>::s_t_name; \
219 template <> API const std::string cls<type>::s_c_name;
227#define DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA_INTERNAL(tspec, t, n, c) \
228 tspec int t::s_t_id (-1); \
229 tspec const std::string t::s_t_name (n); \
230 tspec const std::string t::s_c_name (c); \
231 tspec void t::register_type () \
233 octave::type_info& type_info = octave::__get_type_info__ (); \
235 register_type (type_info); \
237 tspec void t::register_type (octave::type_info& ti) \
239 octave_value v = (new t ()); \
240 s_t_id = ti.register_type (t::s_t_name, t::s_c_name, v); \
243#define DEFINE_TEMPLATE_OV_TYPEID_FUNCTIONS_AND_DATA(t, n, c) \
244 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA_INTERNAL (template <>, t, n, c)
246#define DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(t, n, c) \
247 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA_INTERNAL ( , t, n, c)
264 : m_fcn (
f), m_type_id (t) { }
266 operator type_conv_fcn ()
const {
return m_fcn; }
269 {
return (*m_fcn) (v); }
292 empty_clone ()
const;
302 virtual type_conv_info
306 virtual type_conv_info
317 virtual OCTINTERP_API
octave_value as_double_or_copy ();
337 virtual OCTINTERP_API
Matrix size ();
344 subsref (
const std::string& type,
345 const std::list<octave_value_list>& idx);
348 subsref (
const std::string& type,
349 const std::list<octave_value_list>& idx,
353 subsref (
const std::string& type,
354 const std::list<octave_value_list>& idx,
366 subsasgn (
const std::string& type,
367 const std::list<octave_value_list>& idx,
375 undef_subsasgn (
const std::string& type,
376 const std::list<octave_value_list>& idx,
379 virtual OCTINTERP_API octave::idx_vector
380 index_vector (
bool require_integers =
false)
const;
399 {
return dims ().ndims (); }
414 permute (
const Array<int>& vec,
bool =
false)
const;
417 resize (
const dim_vector&,
bool fill =
false)
const;
419 virtual OCTINTERP_API
MatrixType matrix_type ()
const;
429 bool isempty ()
const {
return (dims ().any_zero ()); }
433 virtual bool iscell ()
const {
return false; }
473 virtual bool isjava ()
const {
return false; }
491 virtual bool isfloat ()
const {
return false; }
513 virtual bool isreal ()
const {
return false; }
529 virtual bool is_true ()
const {
return false; }
533 virtual bool isnull ()
const {
return false; }
562 {
return !is_defined () || is_function (); }
572 virtual OCTINTERP_API
short int
573 short_value (
bool =
false,
bool =
false)
const;
575 virtual OCTINTERP_API
unsigned short int
576 ushort_value (
bool =
false,
bool =
false)
const;
578 virtual OCTINTERP_API
int
579 int_value (
bool =
false,
bool =
false)
const;
581 virtual OCTINTERP_API
unsigned int
582 uint_value (
bool =
false,
bool =
false)
const;
584 virtual OCTINTERP_API
int nint_value (
bool =
false)
const;
586 virtual OCTINTERP_API
long int
587 long_value (
bool =
false,
bool =
false)
const;
589 virtual OCTINTERP_API
unsigned long int
590 ulong_value (
bool =
false,
bool =
false)
const;
592 virtual OCTINTERP_API int64_t int64_value (
bool =
false,
bool =
false)
const;
594 virtual OCTINTERP_API uint64_t uint64_value (
bool =
false,
bool =
false)
const;
596 virtual OCTINTERP_API
double double_value (
bool =
false)
const;
598 virtual OCTINTERP_API
float float_value (
bool =
false)
const;
601 {
return double_value (frc_str_conv); }
604 {
return float_value (frc_str_conv); }
606 virtual OCTINTERP_API
Cell cell_value ()
const;
608 virtual OCTINTERP_API
Matrix matrix_value (
bool =
false)
const;
610 virtual OCTINTERP_API
FloatMatrix float_matrix_value (
bool =
false)
const;
612 virtual OCTINTERP_API
NDArray array_value (
bool =
false)
const;
614 virtual OCTINTERP_API
FloatNDArray float_array_value (
bool =
false)
const;
616 virtual OCTINTERP_API
Complex complex_value (
bool =
false)
const;
618 virtual OCTINTERP_API
FloatComplex float_complex_value (
bool =
false)
const;
620 virtual OCTINTERP_API
ComplexMatrix complex_matrix_value (
bool =
false)
const;
622 virtual OCTINTERP_API
FloatComplexMatrix float_complex_matrix_value (
bool =
false)
const;
624 virtual OCTINTERP_API
ComplexNDArray complex_array_value (
bool =
false)
const;
628 virtual OCTINTERP_API
bool bool_value (
bool =
false)
const;
630 virtual OCTINTERP_API
boolMatrix bool_matrix_value (
bool =
false)
const;
632 virtual OCTINTERP_API
boolNDArray bool_array_value (
bool =
false)
const;
634 virtual OCTINTERP_API
charMatrix char_matrix_value (
bool force =
false)
const;
636 virtual OCTINTERP_API
charNDArray char_array_value (
bool =
false)
const;
638 virtual OCTINTERP_API
SparseMatrix sparse_matrix_value (
bool =
false)
const;
640 virtual OCTINTERP_API
SparseComplexMatrix sparse_complex_matrix_value (
bool =
false)
const;
642 virtual OCTINTERP_API
SparseBoolMatrix sparse_bool_matrix_value (
bool =
false)
const;
644 virtual OCTINTERP_API
DiagMatrix diag_matrix_value (
bool =
false)
const;
646 virtual OCTINTERP_API
FloatDiagMatrix float_diag_matrix_value (
bool =
false)
const;
648 virtual OCTINTERP_API
ComplexDiagMatrix complex_diag_matrix_value (
bool =
false)
const;
651 float_complex_diag_matrix_value (
bool =
false)
const;
653 virtual OCTINTERP_API
PermMatrix perm_matrix_value ()
const;
655 virtual OCTINTERP_API
octave_int8 int8_scalar_value ()
const;
657 virtual OCTINTERP_API
octave_int16 int16_scalar_value ()
const;
659 virtual OCTINTERP_API
octave_int32 int32_scalar_value ()
const;
661 virtual OCTINTERP_API
octave_int64 int64_scalar_value ()
const;
663 virtual OCTINTERP_API
octave_uint8 uint8_scalar_value ()
const;
665 virtual OCTINTERP_API
octave_uint16 uint16_scalar_value ()
const;
667 virtual OCTINTERP_API
octave_uint32 uint32_scalar_value ()
const;
669 virtual OCTINTERP_API
octave_uint64 uint64_scalar_value ()
const;
671 virtual OCTINTERP_API
int8NDArray int8_array_value ()
const;
673 virtual OCTINTERP_API
int16NDArray int16_array_value ()
const;
675 virtual OCTINTERP_API
int32NDArray int32_array_value ()
const;
677 virtual OCTINTERP_API
int64NDArray int64_array_value ()
const;
679 virtual OCTINTERP_API
uint8NDArray uint8_array_value ()
const;
681 virtual OCTINTERP_API
uint16NDArray uint16_array_value ()
const;
683 virtual OCTINTERP_API
uint32NDArray uint32_array_value ()
const;
685 virtual OCTINTERP_API
uint64NDArray uint64_array_value ()
const;
687 virtual OCTINTERP_API
string_vector string_vector_value (
bool pad =
false)
const;
689 virtual OCTINTERP_API std::string string_value (
bool force =
false)
const;
693 virtual OCTINTERP_API octave::range<double> range_value ()
const;
697 virtual OCTINTERP_API
octave_map map_value ()
const;
703 virtual OCTINTERP_API
bool isfield (
const std::string&)
const;
705 virtual OCTINTERP_API std::size_t nparents ()
const;
707 virtual OCTINTERP_API std::list<std::string> parent_class_name_list ()
const;
709 virtual OCTINTERP_API
string_vector parent_class_names ()
const;
720 virtual OCTINTERP_API
octave_classdef * classdef_object_value (
bool silent =
false);
722 virtual OCTINTERP_API
octave_function * function_value (
bool silent =
false);
728 virtual OCTINTERP_API
octave_user_code * user_code_value (
bool silent =
false);
730 virtual OCTINTERP_API
octave_fcn_handle * fcn_handle_value (
bool silent =
false);
735 convert_to_str (
bool pad =
false,
bool force =
false,
char type =
'\'')
const;
737 convert_to_str_internal (
bool pad,
bool force,
char type)
const;
739 virtual OCTINTERP_API
void convert_to_row_or_column_vector ();
744 virtual OCTINTERP_API std::string xstring_value ()
const;
748 virtual OCTINTERP_API
void
749 print (std::ostream& os,
bool pr_as_read_syntax =
false);
751 virtual OCTINTERP_API
void
752 print_raw (std::ostream& os,
bool pr_as_read_syntax =
false)
const;
754 virtual OCTINTERP_API
bool
755 print_name_tag (std::ostream& os,
const std::string& name)
const;
757 virtual OCTINTERP_API
void
758 print_with_name (std::ostream& output_buf,
const std::string& name,
759 bool print_padding =
true);
764 os <<
"[" << dv.
str () <<
" " << class_name () <<
"]";
773 virtual OCTINTERP_API
void
774 print_info (std::ostream& os,
const std::string& prefix)
const;
776 virtual OCTINTERP_API
bool save_ascii (std::ostream& os);
778 virtual OCTINTERP_API
bool load_ascii (std::istream& is);
780 virtual OCTINTERP_API
bool save_binary (std::ostream& os,
bool save_as_floats);
782 virtual OCTINTERP_API
bool
783 load_binary (std::istream& is,
bool swap, octave::mach_info::float_format fmt);
785 virtual OCTINTERP_API
bool
786 save_hdf5 (
octave_hdf5_id loc_id,
const char *name,
bool save_as_floats);
788 virtual OCTINTERP_API
bool
791 virtual OCTINTERP_API
int
792 write (octave::stream& os,
int block_size,
794 octave::mach_info::float_format flt_fmt)
const;
802 virtual OCTINTERP_API
mxArray * as_mxArray (
bool interleaved)
const;
822 virtual OCTINTERP_API
void lock ();
824 virtual OCTINTERP_API
void unlock ();
902 num_unary_mappers = umap_unknown
905 virtual OCTINTERP_API
octave_value map (unary_mapper_t)
const;
918 virtual OCTINTERP_API
bool
924 virtual OCTINTERP_API
bool
932 numeric_assign (
const std::string& type,
933 const std::list<octave_value_list>& idx,
937 { s_curr_print_indent_level = 0; }
940 { s_curr_print_indent_level += 2; }
943 { s_curr_print_indent_level -= 2; }
946 {
return s_curr_print_indent_level; }
948 OCTINTERP_API
void indent (std::ostream& os)
const;
950 OCTINTERP_API
void newline (std::ostream& os)
const;
952 OCTINTERP_API
void reset ()
const;
962 OCTAVE_DEPRECATED (9,
"use octave_base_value::m_count instead")
967 OCTINTERP_API
void warn_load (const
char *type) const;
968 OCTINTERP_API
void warn_save (const
char *type) const;
974 static
int s_curr_print_indent_level;
975 static
bool s_beginning_of_line;
988 m_containing_dynamic_library.delete_later ();
995 octave::auto_shlib m_containing_dynamic_library;
1003 const std::list<octave_value_list>& idx,
1004 const std::string& who);
N Dimensional Array with copy-on-write semantics.
Vector representing the dimensions (size) of an Array.
std::string str(char sep='x') const
octave_base_dld_value()=default
octave_base_dld_value(const octave_base_dld_value &)=default
type_conv_info(type_conv_fcn f=nullptr, int t=-1)
virtual bool islocked() const
virtual const octave_idx_type * mex_get_jc() const
virtual bool is_uint32_type() const
octave_idx_type rows() const
virtual bool is_uint8_type() const
virtual bool is_function_handle() const
virtual bool is_mex_function() const
virtual bool is_classdef_superclass_ref() const
virtual bool is_package() const
octave_idx_type columns() const
virtual const octave_idx_type * mex_get_ir() const
virtual void short_disp(std::ostream &os) const
virtual octave_idx_type numel() const
virtual octave_function * get_cached_fcn(void *, void *)
virtual bool is_scalar_type() const
virtual bool is_double_type() const
virtual builtin_type_t builtin_type() const
virtual bool is_range() const
virtual bool islogical() const
virtual bool is_uint16_type() const
virtual int ndims() const
virtual bool is_constant() const
void increment_indent_level() const
virtual bool is_full_num_matrix() const
virtual octave_base_value * clone() const
int current_print_indent_level() const
virtual bool is_maybe_function() const
virtual bool is_int16_type() const
bool is_zero_by_zero() const
virtual bool isreal() const
virtual bool is_real_matrix() const
virtual type_conv_info numeric_demotion_function() const
virtual bool is_true() const
virtual bool is_legacy_object() const
virtual bool is_magic_int() const
virtual float float_scalar_value(bool frc_str_conv=false) const
virtual bool is_anonymous_function() const
virtual bool is_char_matrix() const
virtual bool is_user_code() const
virtual bool is_classdef_meta() const
virtual bool iscell() const
virtual void maybe_economize()
virtual bool isobject() const
virtual bool is_user_function() const
virtual bool is_function() const
virtual void assign(const std::string &, const octave_value &)
virtual bool isstruct() const
virtual octave_base_value * unique_parent_class(const std::string &)
virtual bool issparse() const
virtual octave_base_value * try_narrowing_conversion()
virtual void maybe_call_dtor()
virtual octave_base_value * find_parent_class(const std::string &)
virtual bool isfloat() const
virtual std::string edit_display(const float_display_format &, octave_idx_type, octave_idx_type) const
virtual bool iscomplex() const
void reset_indent_level() const
virtual bool is_real_scalar() const
virtual bool iscellstr() const
octave::refcount< octave_idx_type > m_count
virtual type_conv_info numeric_conversion_function() const
virtual bool is_bool_matrix() const
virtual bool is_int64_type() const
virtual bool is_classdef_object() const
virtual bool is_perm_matrix() const
virtual octave_base_value * unique_clone()
virtual bool is_bool_scalar() const
virtual const void * mex_get_data() const
virtual bool is_string() const
virtual bool is_user_script() const
virtual dim_vector dims() const
virtual bool is_diag_matrix() const
virtual bool isnull() const
virtual bool is_builtin_function() const
virtual ~octave_base_value()=default
virtual bool is_magic_colon() const
virtual bool is_sq_string() const
void decrement_indent_level() const
octave_base_value(const octave_base_value &)
virtual bool isnumeric() const
virtual bool print_as_scalar() const
virtual std::size_t byte_size() const
virtual bool is_dld_function() const
virtual bool isjava() const
virtual double scalar_value(bool frc_str_conv=false) const
virtual bool is_int8_type() const
virtual void erase_subfunctions()
virtual bool is_uint64_type() const
virtual bool is_inline_function() const
virtual bool is_instance_of(const std::string &) const
virtual bool is_int32_type() const
virtual bool is_storable() const
virtual bool is_defined() const
virtual bool is_function_cache() const
virtual void call_object_destructor()
virtual bool is_single_type() const
virtual octave_function * get_cached_fcn(const octave_value_list &)
virtual void break_closure_cycles(const std::shared_ptr< octave::stack_frame > &)
virtual bool is_complex_matrix() const
virtual bool has_function_cache() const
virtual bool is_all_va_args() const
virtual bool isinteger() const
virtual bool is_cs_list() const
virtual bool is_complex_scalar() const
virtual bool is_matrix_type() const
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
F77_RET_T const F77_DBLE * x
F77_RET_T const F77_DBLE const F77_DBLE * f
std::complex< double > Complex
std::complex< float > FloatComplex
octave_value make_idx_args(const std::string &type, const std::list< octave_value_list > &idx, const std::string &who)
bool called_from_builtin()
bool btyp_isnumeric(builtin_type_t btyp)
#define DEF_BTYP_TRAITS(BTYP, CLASS)
bool btyp_isinteger(builtin_type_t btyp)
type_info & __get_type_info__()
#define DECLARE_OV_BASE_TYPEID_FUNCTIONS_AND_DATA
bool btyp_isarray(builtin_type_t btyp)
std::string btyp_class_name[]
bool btyp_isfloat(builtin_type_t btyp)
builtin_type_t btyp_mixed_numeric(builtin_type_t x, builtin_type_t y)
Determine the resulting type for a possible mixed-type operation.
static const builtin_type_t btyp