Mercurial > octave
diff libinterp/octave-value/ov-typeinfo.h @ 24540:46440078d73b
don't use singleton for octave_value_typeinfo
* ov-typeinfo.h, ov-typeinfo.cc (type_info): New class containing the
functionaity provided by the non-static functions in the
octave_value_typeinfo class. Define in octave namespace.
(octave_value_typeinfo): Now a namespace containing global functions
instead of a class containing all static functions. Provided for
backward compatibility, so all functions are tagged as deprecated.
* ops.h (INSTALL_UNOP_TI, INSTALL_NCUNOP_TI, INSTALL_BINOP_TI,
INSTALL_CATOP_TI, INSTALL_ASSIGNOP_TI, INSTALL_ASSIGNANYOP_TI,
INSTALL_ASSIGNCONV_TI, INSTALL_WIDENOP_TI): New macros.
(install_ops): Accept reference to type_info object as
an argument.
* mk-ops.sh: Generate function decls and calls that pass reference
to type_info object as an argument.
* op-b-b.cc, op-b-bm.cc, op-b-sbm.cc, op-bm-b.cc, op-bm-bm.cc,
op-bm-sbm.cc, op-cdm-cdm.cc, op-cell.cc, op-chm.cc, op-class.cc,
op-cm-cm.cc, op-cm-cs.cc, op-cm-m.cc, op-cm-s.cc, op-cm-scm.cc,
op-cm-sm.cc, op-cs-cm.cc, op-cs-cs.cc, op-cs-m.cc, op-cs-s.cc,
op-cs-scm.cc, op-cs-sm.cc, op-dm-dm.cc, op-dm-scm.cc, op-dm-sm.cc,
op-dm-template.cc, op-dms-template.cc, op-fcdm-fcdm.cc, op-fcm-fcm.cc,
op-fcm-fcs.cc, op-fcm-fm.cc, op-fcm-fs.cc, op-fcn.cc, op-fcs-fcm.cc,
op-fcs-fcs.cc, op-fcs-fm.cc, op-fcs-fs.cc, op-fdm-fdm.cc,
op-fm-fcm.cc, op-fm-fcs.cc, op-fm-fm.cc, op-fm-fs.cc, op-fs-fcm.cc,
op-fs-fcs.cc, op-fs-fm.cc, op-fs-fs.cc, op-i16-i16.cc, op-i32-i32.cc,
op-i64-i64.cc, op-i8-i8.cc, op-int-concat.cc, op-int.h, op-m-cm.cc,
op-m-cs.cc, op-m-m.cc, op-m-s.cc, op-m-scm.cc, op-m-sm.cc,
op-pm-pm.cc, op-pm-scm.cc, op-pm-sm.cc, op-pm-template.cc,
op-range.cc, op-s-cm.cc, op-s-cs.cc, op-s-m.cc, op-s-s.cc,
op-s-scm.cc, op-s-sm.cc, op-sbm-b.cc, op-sbm-bm.cc, op-sbm-sbm.cc,
op-scm-cm.cc, op-scm-cs.cc, op-scm-m.cc, op-scm-s.cc, op-scm-scm.cc,
op-scm-sm.cc, op-sm-cm.cc, op-sm-cs.cc, op-sm-m.cc, op-sm-s.cc,
op-sm-scm.cc, op-sm-sm.cc, op-str-m.cc, op-str-s.cc, op-str-str.cc,
op-struct.cc, op-ui16-ui16.cc, op-ui32-ui32.cc, op-ui64-ui64.cc,
op-ui8-ui8.cc): Use new _T1 macros. Update install_TYPE_ops function
for each type to accept reference to type_info object as argument.
* interpreter.h, interpreter.cc (interpreter::m_type_info):
New member variable.
(interpreter::get_type_info): New function.
(interpreter::interpreter): Initialize m_type_info before
m_symbol_table. Don't call install_types or install ops. That is now
handled by the in type_info constructor. Don't call m_cdef_manager.
That is now handled by the cdef_manager constructor.
* interpreter-private.h, interpreter-private.cc (__get_type_info__):
New function. Use where necessary to get reference to
interpreter::m_type_info object.
* ov-classdef.cc, ov-classdef.h (octave_classdef::octave_classdef):
Handle all initialization here.
(octave_classdef::initialize): Delete unused function.
* ov.h, ov.cc (install_types): Accept reference to type_info object as
argument. Pass on to individual register_type functions.
* ov-base.h, ov-base.cc (DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA): Update
to define additional register_type functions that accepts reference to
type_info object.
(install_base_type_conversions): Update to use new *_TI macros.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 05 Jan 2018 18:44:53 -0500 |
parents | 194eb4bd202b |
children | 5f445419559f |
line wrap: on
line diff
--- a/libinterp/octave-value/ov-typeinfo.h Sat Jan 06 14:57:23 2018 -0500 +++ b/libinterp/octave-value/ov-typeinfo.h Fri Jan 05 18:44:53 2018 -0500 @@ -34,296 +34,341 @@ class string_vector; -class -OCTINTERP_API -octave_value_typeinfo +namespace octave { -public: + class type_info + { + public: - typedef octave_value (*unary_class_op_fcn) (const octave_value&); + typedef octave_value (*unary_class_op_fcn) (const octave_value&); - typedef octave_value (*unary_op_fcn) (const octave_base_value&); + typedef octave_value (*unary_op_fcn) (const octave_base_value&); - typedef void (*non_const_unary_op_fcn) (octave_base_value&); + typedef void (*non_const_unary_op_fcn) (octave_base_value&); - typedef octave_value (*binary_class_op_fcn) + typedef octave_value (*binary_class_op_fcn) (const octave_value&, const octave_value&); - typedef octave_value (*binary_op_fcn) + typedef octave_value (*binary_op_fcn) (const octave_base_value&, const octave_base_value&); - typedef octave_value (*cat_op_fcn) + typedef octave_value (*cat_op_fcn) (octave_base_value&, const octave_base_value&, const Array<octave_idx_type>& ra_idx); - typedef octave_value (*assign_op_fcn) + typedef octave_value (*assign_op_fcn) (octave_base_value&, const octave_value_list&, const octave_base_value&); - typedef octave_value (*assignany_op_fcn) + typedef octave_value (*assignany_op_fcn) (octave_base_value&, const octave_value_list&, const octave_value&); - static bool instance_ok (void); + explicit type_info (int init_tab_sz = 16); - static int register_type (const std::string&, const std::string&, - const octave_value&); + // No copying! + + type_info (const type_info&) = delete; - static bool register_unary_class_op (octave_value::unary_op, - unary_class_op_fcn); + type_info& operator = (const type_info&) = delete; - static bool register_unary_op (octave_value::unary_op, int, unary_op_fcn); + ~type_info (void) = default; - static bool register_non_const_unary_op (octave_value::unary_op, int, - non_const_unary_op_fcn); + // It is intentional that there is no install_type function. - static bool register_binary_class_op (octave_value::binary_op, - binary_class_op_fcn); + bool install_unary_class_op (octave_value::unary_op op, + unary_class_op_fcn f) + { + return register_unary_class_op (op, f, true); + } - static bool register_binary_op (octave_value::binary_op, int, int, - binary_op_fcn); + bool install_unary_op (octave_value::unary_op op, int t, unary_op_fcn f) + { + return register_unary_op (op, t, f, true); + } - static bool register_binary_class_op (octave_value::compound_binary_op, - binary_class_op_fcn); + bool install_non_const_unary_op (octave_value::unary_op op, int t, + non_const_unary_op_fcn f) + { + return register_non_const_unary_op (op, t, f, true); + } - static bool register_binary_op (octave_value::compound_binary_op, int, int, - binary_op_fcn); - - static bool register_cat_op (int, int, cat_op_fcn); - - static bool register_assign_op (octave_value::assign_op, int, int, - assign_op_fcn); + bool install_binary_class_op (octave_value::binary_op op, + binary_class_op_fcn f) + { + return register_binary_class_op (op, f, true); + } - static bool register_assignany_op (octave_value::assign_op, int, - assignany_op_fcn); - - static bool register_pref_assign_conv (int, int, int); + bool install_binary_op (octave_value::binary_op op, int t1, int t2, + binary_op_fcn f) + { + return register_binary_op (op, t1, t2, f, true); + } - static bool - register_widening_op (int, int, octave_base_value::type_conv_fcn); + bool install_binary_class_op (octave_value::compound_binary_op op, + binary_class_op_fcn f) + { + return register_binary_class_op (op, f, true); + } - static octave_value - lookup_type (const std::string& nm) - { - return instance->do_lookup_type (nm); - } + bool install_binary_op (octave_value::compound_binary_op op, + int t_lhs, int t_rhs, binary_op_fcn f) + { + return register_binary_op (op, t_lhs, t_rhs, f, true); + } - static unary_class_op_fcn - lookup_unary_class_op (octave_value::unary_op op) - { - return instance->do_lookup_unary_class_op (op); - } + bool install_cat_op (int t1, int t2, cat_op_fcn f) + { + return register_cat_op (t1, t2, f, true); + } + + bool install_assign_op (octave_value::assign_op op, + int t_lhs, int t_rhs, assign_op_fcn f) + { + return register_assign_op (op, t_lhs, t_rhs, f, true); + } - static unary_op_fcn - lookup_unary_op (octave_value::unary_op op, int t) - { - return instance->do_lookup_unary_op (op, t); - } + bool install_assignany_op (octave_value::assign_op op, int t_lhs, + assignany_op_fcn f) + { + return register_assignany_op (op, t_lhs, f, true); + } - static non_const_unary_op_fcn - lookup_non_const_unary_op (octave_value::unary_op op, int t) - { - return instance->do_lookup_non_const_unary_op (op, t); - } + bool install_pref_assign_conv (int t_lhs, int t_rhs, int t_result) + { + return register_pref_assign_conv (t_lhs, t_rhs, t_result, true); + } - static binary_class_op_fcn - lookup_binary_class_op (octave_value::binary_op op) - { - return instance->do_lookup_binary_class_op (op); - } + bool install_widening_op (int t, int t_result, + octave_base_value::type_conv_fcn f) + { + return register_widening_op (t, t_result, f, true); + } + + int register_type (const std::string&, const std::string&, + const octave_value&, bool abort_on_duplicate = false); - static binary_op_fcn - lookup_binary_op (octave_value::binary_op op, int t1, int t2) - { - return instance->do_lookup_binary_op (op, t1, t2); - } + bool register_unary_class_op (octave_value::unary_op, unary_class_op_fcn, + bool abort_on_duplicate = false); + + bool register_unary_op (octave_value::unary_op, int, unary_op_fcn, + bool abort_on_duplicate = false); + + bool register_non_const_unary_op (octave_value::unary_op, int, + non_const_unary_op_fcn, + bool abort_on_duplicate = false); - static binary_class_op_fcn - lookup_binary_class_op (octave_value::compound_binary_op op) - { - return instance->do_lookup_binary_class_op (op); - } + bool register_binary_class_op (octave_value::binary_op, + binary_class_op_fcn, + bool abort_on_duplicate = false); + + bool register_binary_op (octave_value::binary_op, int, int, + binary_op_fcn, bool abort_on_duplicate = false); - static binary_op_fcn - lookup_binary_op (octave_value::compound_binary_op op, int t1, int t2) - { - return instance->do_lookup_binary_op (op, t1, t2); - } + bool register_binary_class_op (octave_value::compound_binary_op, + binary_class_op_fcn, + bool abort_on_duplicate = false); - static cat_op_fcn - lookup_cat_op (int t1, int t2) - { - return instance->do_lookup_cat_op (t1, t2); - } + bool register_binary_op (octave_value::compound_binary_op, int, int, + binary_op_fcn, bool abort_on_duplicate = false); + + bool register_cat_op (int, int, cat_op_fcn, + bool abort_on_duplicate = false); + + bool register_assign_op (octave_value::assign_op, int, int, assign_op_fcn, + bool abort_on_duplicate = false); - static assign_op_fcn - lookup_assign_op (octave_value::assign_op op, int t_lhs, int t_rhs) - { - return instance->do_lookup_assign_op (op, t_lhs, t_rhs); - } + bool register_assignany_op (octave_value::assign_op, int, assignany_op_fcn, + bool abort_on_duplicate = false); + + bool register_pref_assign_conv (int, int, int, + bool abort_on_duplicate = false); + + bool register_widening_op (int, int, octave_base_value::type_conv_fcn, + bool abort_on_duplicate = false); - static assignany_op_fcn - lookup_assignany_op (octave_value::assign_op op, int t_lhs) - { - return instance->do_lookup_assignany_op (op, t_lhs); - } + octave_value lookup_type (const std::string& nm); + + unary_class_op_fcn lookup_unary_class_op (octave_value::unary_op); - static int - lookup_pref_assign_conv (int t_lhs, int t_rhs) - { - return instance->do_lookup_pref_assign_conv (t_lhs, t_rhs); - } + unary_op_fcn lookup_unary_op (octave_value::unary_op, int); + + non_const_unary_op_fcn + lookup_non_const_unary_op (octave_value::unary_op, int); + + binary_class_op_fcn lookup_binary_class_op (octave_value::binary_op); - static octave_base_value::type_conv_fcn - lookup_widening_op (int t, int t_result) - { - return instance->do_lookup_widening_op (t, t_result); - } + binary_op_fcn lookup_binary_op (octave_value::binary_op, int, int); + + binary_class_op_fcn + lookup_binary_class_op (octave_value::compound_binary_op); + + binary_op_fcn + lookup_binary_op (octave_value::compound_binary_op, int, int); + + cat_op_fcn lookup_cat_op (int, int); - static string_vector installed_type_names (void) - { - return instance->do_installed_type_names (); - } + assign_op_fcn lookup_assign_op (octave_value::assign_op, int, int); + + assignany_op_fcn lookup_assignany_op (octave_value::assign_op, int); - static octave_scalar_map installed_type_info (void) - { - return instance->do_installed_type_info (); - } + int lookup_pref_assign_conv (int, int); -protected: + octave_base_value::type_conv_fcn lookup_widening_op (int, int); + + string_vector installed_type_names (void) const; - octave_value_typeinfo (void) - : num_types (0), types (dim_vector (init_tab_sz, 1), ""), - vals (dim_vector (init_tab_sz, 1)), - unary_class_ops (dim_vector (octave_value::num_unary_ops, 1), nullptr), - unary_ops (dim_vector (octave_value::num_unary_ops, init_tab_sz), nullptr), - non_const_unary_ops (dim_vector (octave_value::num_unary_ops, init_tab_sz), nullptr), - binary_class_ops (dim_vector (octave_value::num_binary_ops, 1), nullptr), - binary_ops (dim_vector (octave_value::num_binary_ops, init_tab_sz, init_tab_sz), nullptr), - compound_binary_class_ops (dim_vector (octave_value::num_compound_binary_ops, 1), nullptr), - compound_binary_ops (dim_vector (octave_value::num_compound_binary_ops, init_tab_sz, init_tab_sz), nullptr), - cat_ops (dim_vector (init_tab_sz, init_tab_sz), nullptr), - assign_ops (dim_vector (octave_value::num_assign_ops, init_tab_sz, init_tab_sz), nullptr), - assignany_ops (dim_vector (octave_value::num_assign_ops, init_tab_sz), nullptr), - pref_assign_conv (dim_vector (init_tab_sz, init_tab_sz), -1), - widening_ops (dim_vector (init_tab_sz, init_tab_sz), nullptr) { } + octave_scalar_map installed_type_info (void) const; + + octave_scalar_map unary_ops_map (void) const; + + octave_scalar_map non_const_unary_ops_map (void) const; + + octave_scalar_map binary_ops_map (void) const; + + octave_scalar_map compound_binary_ops_map (void) const; + + octave_scalar_map assign_ops_map (void) const; + + octave_scalar_map assignany_ops_map (void) const; + + private: + + int num_types; - // No copying! + Array<std::string> types; - octave_value_typeinfo (const octave_value_typeinfo&) = delete; + Array<octave_value> vals; - octave_value_typeinfo& operator = (const octave_value_typeinfo&) = delete; + Array<void *> unary_class_ops; - ~octave_value_typeinfo (void) = default; + Array<void *> unary_ops; -private: + Array<void *> non_const_unary_ops; - static const int init_tab_sz; + Array<void *> binary_class_ops; - static octave_value_typeinfo *instance; + Array<void *> binary_ops; - static void cleanup_instance (void) { delete instance; instance = nullptr; } + Array<void *> compound_binary_class_ops; + + Array<void *> compound_binary_ops; - int num_types; + Array<void *> cat_ops; - Array<std::string> types; + Array<void *> assign_ops; - Array<octave_value> vals; + Array<void *> assignany_ops; - Array<void *> unary_class_ops; + Array<int> pref_assign_conv; - Array<void *> unary_ops; - - Array<void *> non_const_unary_ops; + Array<void *> widening_ops; + }; +} - Array<void *> binary_class_ops; +namespace octave_value_typeinfo +{ + typedef octave::type_info::unary_class_op_fcn unary_class_op_fcn; - Array<void *> binary_ops; + typedef octave::type_info::unary_op_fcn unary_op_fcn; - Array<void *> compound_binary_class_ops; + typedef octave::type_info::non_const_unary_op_fcn non_const_unary_op_fcn; - Array<void *> compound_binary_ops; + typedef octave::type_info::binary_class_op_fcn binary_class_op_fcn; - Array<void *> cat_ops; + typedef octave::type_info::binary_op_fcn binary_op_fcn; - Array<void *> assign_ops; + typedef octave::type_info::cat_op_fcn cat_op_fcn; + + typedef octave::type_info::assign_op_fcn assign_op_fcn; - Array<void *> assignany_ops; - - Array<int> pref_assign_conv; + typedef octave::type_info::assignany_op_fcn assignany_op_fcn; - Array<void *> widening_ops; + extern int register_type (const std::string& t_name, + const std::string& c_name, + const octave_value& val); - int do_register_type (const std::string&, const std::string&, - const octave_value&); - - bool do_register_unary_class_op (octave_value::unary_op, unary_class_op_fcn); + OCTAVE_DEPRECATED(4.4, "use octave::type_info::register_unary_class_op instead") + extern bool register_unary_class_op (octave_value::unary_op op, + unary_class_op_fcn f); - bool do_register_unary_op (octave_value::unary_op, int, unary_op_fcn); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_unary_op instead") + extern bool register_unary_op (octave_value::unary_op op, + int t, unary_op_fcn f); - bool do_register_non_const_unary_op (octave_value::unary_op, int, - non_const_unary_op_fcn); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_non_const_unary_op instead") + extern bool register_non_const_unary_op (octave_value::unary_op op, + int t, non_const_unary_op_fcn f); - bool do_register_binary_class_op (octave_value::binary_op, - binary_class_op_fcn); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_binary_class_op instead") + extern bool register_binary_class_op (octave_value::binary_op op, + binary_class_op_fcn f); - bool do_register_binary_op (octave_value::binary_op, int, int, - binary_op_fcn); - - bool do_register_binary_class_op (octave_value::compound_binary_op, - binary_class_op_fcn); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_binary_op instead") + extern bool register_binary_op (octave_value::binary_op op, + int t1, int t2, binary_op_fcn f); - bool do_register_binary_op (octave_value::compound_binary_op, int, int, - binary_op_fcn); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_binary_class_op instead") + extern bool register_binary_class_op (octave_value::compound_binary_op op, + binary_class_op_fcn f); - bool do_register_cat_op (int, int, cat_op_fcn); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_binary_op instead") + extern bool register_binary_op (octave_value::compound_binary_op op, + int t1, int t2, binary_op_fcn f); - bool do_register_assign_op (octave_value::assign_op, int, int, - assign_op_fcn); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_cat_op instead") + extern bool register_cat_op (int t1, int t2, cat_op_fcn f); - bool do_register_assignany_op (octave_value::assign_op, int, - assignany_op_fcn); - - bool do_register_pref_assign_conv (int, int, int); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_assign_op instead") + extern bool register_assign_op (octave_value::assign_op op, + int t_lhs, int t_rhs, assign_op_fcn f); - bool do_register_widening_op (int, int, octave_base_value::type_conv_fcn); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_assignany_op instead") + extern bool register_assignany_op (octave_value::assign_op op, + int t_lhs, assignany_op_fcn f); - octave_value do_lookup_type (const std::string& nm); - - unary_class_op_fcn do_lookup_unary_class_op (octave_value::unary_op); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_pref_assign_conv instead") + extern bool register_pref_assign_conv (int t_lhs, int t_rhs, int t_result); - unary_op_fcn do_lookup_unary_op (octave_value::unary_op, int); + OCTAVE_DEPRECATED (4.4, "use octave::type_info::register_widening_op instead") + extern bool register_widening_op (int t, int t_result, + octave_base_value::type_conv_fcn f); - non_const_unary_op_fcn do_lookup_non_const_unary_op - (octave_value::unary_op, int); + extern octave_value lookup_type (const std::string& nm); - binary_class_op_fcn do_lookup_binary_class_op (octave_value::binary_op); - - binary_op_fcn do_lookup_binary_op (octave_value::binary_op, int, int); + extern unary_class_op_fcn lookup_unary_class_op (octave_value::unary_op op); - binary_class_op_fcn do_lookup_binary_class_op (octave_value::compound_binary_op); + extern unary_op_fcn lookup_unary_op (octave_value::unary_op op, int t); + + extern non_const_unary_op_fcn + lookup_non_const_unary_op (octave_value::unary_op op, int t); - binary_op_fcn do_lookup_binary_op (octave_value::compound_binary_op, - int, int); + extern binary_class_op_fcn + lookup_binary_class_op (octave_value::binary_op op); - cat_op_fcn do_lookup_cat_op (int, int); - - assign_op_fcn do_lookup_assign_op (octave_value::assign_op, int, int); + extern binary_op_fcn + lookup_binary_op (octave_value::binary_op op, int t1, int t2); - assignany_op_fcn do_lookup_assignany_op (octave_value::assign_op, int); - - int do_lookup_pref_assign_conv (int, int); + extern binary_class_op_fcn + lookup_binary_class_op (octave_value::compound_binary_op op); - octave_base_value::type_conv_fcn do_lookup_widening_op (int, int); + extern binary_op_fcn + lookup_binary_op (octave_value::compound_binary_op op, int t1, int t2); - string_vector do_installed_type_names (void) const; + extern cat_op_fcn lookup_cat_op (int t1, int t2); + + extern assign_op_fcn + lookup_assign_op (octave_value::assign_op op, int t_lhs, int t_rhs); - octave_scalar_map do_installed_type_info (void) const; + extern assignany_op_fcn + lookup_assignany_op (octave_value::assign_op op, int t_lhs); + + extern int lookup_pref_assign_conv (int t_lhs, int t_rhs); - octave_scalar_map unary_ops_map (void) const; - octave_scalar_map non_const_unary_ops_map (void) const; - octave_scalar_map binary_ops_map (void) const; - octave_scalar_map compound_binary_ops_map (void) const; - octave_scalar_map assign_ops_map (void) const; - octave_scalar_map assignany_ops_map (void) const; -}; + extern octave_base_value::type_conv_fcn + lookup_widening_op (int t, int t_result); + + extern string_vector installed_type_names (void); + + extern octave_scalar_map installed_type_info (void); +} #endif