26#if ! defined (octave_cdef_object_h)
27#define octave_cdef_object_h 1
29#include "octave-config.h"
64 err_invalid_object (
"set_class");
69 err_invalid_object (
"clone");
74 err_invalid_object (
"empty_clone");
79 err_invalid_object (
"copy");
84 err_invalid_object (
"make_array");
87 virtual bool is_array ()
const {
return false; }
97 err_invalid_object (
"array_value");
101 { err_invalid_object (
"put"); }
105 err_invalid_object (
"get");
111 err_invalid_object (
"set_property");
116 err_invalid_object (
"get_property");
121 err_invalid_object (
"break_closure_cycles");
125 subsref (
const std::string&,
const std::list<octave_value_list>&,
128 err_invalid_object (
"subsref");
132 subsasgn (
const std::string&,
const std::list<octave_value_list>&,
135 err_invalid_object (
"subsasgn");
140 err_invalid_object (
"reshape");
147 OCTINTERP_API std::string
class_name ()
const;
151 err_invalid_object (
"mark_for_construction");
156 err_invalid_object (
"is_constructed_for");
161 err_invalid_object (
"is_partially_constructed_for");
166 err_invalid_object (
"mark_as_constructed");
171 err_invalid_object (
"mark_as_constructed");
176 err_invalid_object (
"is_constructed");
189 err_invalid_object (
"permute");
194 err_invalid_object (
"resize");
199 err_invalid_object (
"transpose");
213 OCTAVE_NORETURN
void err_invalid_object (
const char *who)
const
215 error (
"%s: invalid object", who);
227 { m_rep->m_count++; }
235 if (m_rep != obj.m_rep)
237 m_rep->release (*
this);
250 std::string
class_name ()
const {
return m_rep->class_name (); }
268 bool is_array ()
const {
return m_rep->is_array (); }
277 {
return m_rep->array_value (); }
281 m_rep->put (pname, val);
286 return m_rep->get (pname);
292 return m_rep->set_property (idx, pname, pval);
298 return m_rep->get_property (idx, pname);
303 m_rep->break_closure_cycles (frame);
307 subsref (
const std::string& type,
const std::list<octave_value_list>& idx,
308 int nargout, std::size_t& skip,
const cdef_class& context,
309 bool auto_add =
false)
311 return m_rep->subsref (type, idx, nargout, skip, context, auto_add);
315 subsasgn (
const std::string& type,
const std::list<octave_value_list>& idx,
318 make_unique (ignore_copies);
319 return m_rep->subsasgn (type, idx, rhs);
324 return m_rep->
reshape (new_dims);
330 map_value (
bool warn =
true,
bool for_save =
false)
const;
334 bool ok ()
const {
return m_rep->is_valid (); }
338 m_rep->mark_for_construction (cls);
345 return m_rep->is_constructed_for (cls);
350 return m_rep->is_partially_constructed_for (cls);
356 { m_rep->mark_as_constructed (cls); }
361 {
return cdef_object (m_rep->permute (vec, inv)); }
375 if (m_rep->m_count > ignore_copies + 1)
398 OCTINTERP_API
void set_class (
const cdef_class& cls);
439 break_closure_cycles (
const std::shared_ptr<stack_frame>& frame);
448 subsref (
const std::string& type,
const std::list<octave_value_list>& idx,
449 int nargout, std::size_t& skip,
const cdef_class& context,
453 subsasgn (
const std::string& type,
const std::list<octave_value_list>& idx,
463 return tmp.
put (pname, pval);
471 return tmp.
get (pname);
475 permute (
const Array<int>& vec,
bool inv =
false)
const;
478 resize (
const dim_vector& dv,
bool fill =
false)
const;
508 void break_closure_cycles (
const std::shared_ptr<stack_frame>& frame);
512 m_map.assign (pname, val);
517 Cell val = m_map.contents (pname);
519 if (val.
numel () < 1)
520 error (
"get: unknown slot: %s", pname.c_str ());
529 error (
"invalid index");
538 error (
"invalid index");
544 subsref (
const std::string& type,
const std::list<octave_value_list>& idx,
545 int nargout, std::size_t& skip,
const cdef_class& context,
549 subsasgn (
const std::string& type,
const std::list<octave_value_list>& idx,
556 [[maybe_unused]]
bool inv =
false)
const
562 resize (
const dim_vector& dv,
bool fill =
false)
const;
569 OCTINTERP_API
void mark_for_construction (
const cdef_class&);
571 OCTINTERP_API
bool is_constructed_for (
const cdef_class& cls)
const;
574 is_partially_constructed_for (
const cdef_class& cls)
const;
578 OCTINTERP_API
void mark_as_constructed (
const cdef_class& cls);
684 void doc_string (
const std::string& txt) { m_doc_string = txt; }
690 const std::list<octave_value_list>& ,
693 error (
"subsref: invalid meta object");
730 bool is_class ()
const {
return get_rep ()->is_class (); }
734 bool is_method ()
const {
return get_rep ()->is_method (); }
736 bool is_package ()
const {
return get_rep ()->is_package (); }
738 void doc_string (
const std::string& txt) { get_rep ()->doc_string (txt); }
740 std::string
doc_string ()
const {
return get_rep ()->doc_string (); }
744 const std::list<octave_value_list>& idx,
int nargout)
746 return get_rep ()->meta_subsref (type, idx, nargout);
753 return get_rep ()->meta_accepts_postfix_index (type);
769OCTAVE_END_NAMESPACE(octave)
N Dimensional Array with copy-on-write semantics.
octave_idx_type numel() const
Number of elements in the array.
void set_property(octave_idx_type idx, const std::string &pname, const octave_value &pval)
~cdef_object_array()=default
Array< cdef_object > array_value() const
octave_value get_property(octave_idx_type idx, const std::string &pname) const
cdef_object_array(const Array< cdef_object > &a)
cdef_object_rep * empty_clone() const
cdef_object_base(const cdef_object_base &obj)
virtual void break_closure_cycles(const std::shared_ptr< stack_frame > &)
virtual octave_value_list subsref(const std::string &, const std::list< octave_value_list > &, int, std::size_t &, const cdef_class &, bool)
virtual bool is_array() const
virtual void mark_as_constructed(const cdef_class &)
virtual void mark_as_constructed()
virtual cdef_object_rep * clone() const
virtual cdef_object_rep * permute(const Array< int > &, bool=false) const
virtual bool is_constructed_for(const cdef_class &) const
virtual void set_class(const cdef_class &)
virtual void set_property(octave_idx_type, const std::string &, const octave_value &)
virtual ~cdef_object_rep()=default
virtual Array< cdef_object > array_value() const
virtual octave_value get(const std::string &) const
virtual bool is_constructed() const
virtual cdef_object_rep * resize(const dim_vector &, bool=false) const
virtual bool is_meta_object() const
virtual octave_value get_property(octave_idx_type, const std::string &) const
virtual cdef_object_rep * transpose() const
virtual octave_value reshape(const dim_vector &) const
virtual bool is_partially_constructed_for(const cdef_class &) const
cdef_object_rep(const cdef_object_rep &)
virtual void put(const std::string &, const octave_value &)
virtual cdef_object_rep * make_array() const
virtual bool is_handle_object() const
virtual octave_idx_type static_count() const
virtual cdef_object_rep * copy() const
virtual bool is_valid() const
virtual void mark_for_construction(const cdef_class &)
virtual cdef_object_rep * empty_clone() const
virtual octave_value subsasgn(const std::string &, const std::list< octave_value_list > &, const octave_value &)
virtual dim_vector dims() const
virtual bool is_value_object() const
refcount< octave_idx_type > m_count
std::map< cdef_class, std::list< cdef_class > > m_ctor_list
cdef_object_rep * transpose() const
bool is_constructed() const
octave_value get_property(octave_idx_type idx, const std::string &pname) const
void mark_as_constructed()
cdef_object_rep * permute(const Array< int > &vec, bool inv=false) const
void put(const std::string &pname, const octave_value &val)
octave_value get(const std::string &pname) const
void set_property(octave_idx_type idx, const std::string &pname, const octave_value &pval)
cdef_object_scalar(const cdef_object_scalar &obj)
~cdef_object_scalar()=default
cdef_object clone() const
bool is_constructed() const
void break_closure_cycles(const std::shared_ptr< stack_frame > &frame)
void mark_as_constructed(const cdef_class &cls)
cdef_class get_class() const
void mark_for_construction(const cdef_class &cls)
bool is_partially_constructed_for(const cdef_class &cls) const
octave_value reshape(const dim_vector &new_dims) const
bool is_handle_object() const
void put(const std::string &pname, const octave_value &val)
void set_property(octave_idx_type idx, const std::string &pname, const octave_value &pval)
cdef_object transpose() const
cdef_object resize(const dim_vector &dv, bool fill=false) const
cdef_object(const cdef_object &obj)
string_vector map_keys() const
void mark_as_constructed()
void set_class(const cdef_class &cls)
std::string class_name() const
bool is_meta_object() const
cdef_object_rep * get_rep()
cdef_object make_array() const
cdef_object & operator=(const cdef_object &obj)
octave_value subsasgn(const std::string &type, const std::list< octave_value_list > &idx, const octave_value &rhs, int ignore_copies=0)
const cdef_object_rep * get_rep() const
cdef_object empty_clone() const
bool is_value_object() const
cdef_object(cdef_object_rep *r)
bool is(const cdef_object &obj) const
void make_unique(int ignore_copies)
cdef_object permute(const Array< int > &vec, bool inv=false) const
octave_value get(const std::string &pname) const
octave_value_list subsref(const std::string &type, const std::list< octave_value_list > &idx, int nargout, std::size_t &skip, const cdef_class &context, bool auto_add=false)
bool is_constructed_for(const cdef_class &cls) const
octave_value get_property(octave_idx_type idx, const std::string &pname) const
Array< cdef_object > array_value() const
Vector representing the dimensions (size) of an Array.
handle_cdef_object(const handle_cdef_object &obj)
cdef_object_rep * copy() const
bool is_handle_object() const
cdef_object_rep * clone() const
octave_value reshape(const dim_vector &dv) const
cdef_object_rep * copy() const
bool is_value_object() const
cdef_object_rep * clone() const
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
void error(const char *fmt,...)