Mercurial > octave-nkf
diff src/ov-typeinfo.cc @ 7800:5861b95e9879
support for compound operators, implement trans_mul, mul_trans, herm_mul and mul_herm
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Wed, 07 May 2008 16:33:15 +0200 |
parents | 402168152bb9 |
children | 7be5917f181a |
line wrap: on
line diff
--- a/src/ov-typeinfo.cc Wed May 21 14:12:16 2008 -0400 +++ b/src/ov-typeinfo.cc Wed May 07 16:33:15 2008 +0200 @@ -142,6 +142,23 @@ } bool +octave_value_typeinfo::register_binary_class_op (octave_value::compound_binary_op op, + octave_value_typeinfo::binary_class_op_fcn f) +{ + return (instance_ok ()) + ? instance->do_register_binary_class_op (op, f) : false; +} + +bool +octave_value_typeinfo::register_binary_op (octave_value::compound_binary_op op, + int t1, int t2, + octave_value_typeinfo::binary_op_fcn f) +{ + return (instance_ok ()) + ? instance->do_register_binary_op (op, t1, t2, f) : false; +} + +bool octave_value_typeinfo::register_cat_op (int t1, int t2, octave_value_typeinfo::cat_op_fcn f) { return (instance_ok ()) @@ -223,6 +240,9 @@ binary_ops.resize (static_cast<int> (octave_value::num_binary_ops), len, len, static_cast<octave_value_typeinfo::binary_op_fcn> (0)); + compound_binary_ops.resize (static_cast<int> (octave_value::num_compound_binary_ops), + len, len, static_cast<octave_value_typeinfo::binary_op_fcn> (0)); + cat_ops.resize (len, len, static_cast<octave_value_typeinfo::cat_op_fcn> (0)); assign_ops.resize (static_cast<int> (octave_value::num_assign_ops), @@ -338,6 +358,43 @@ } bool +octave_value_typeinfo::do_register_binary_class_op (octave_value::compound_binary_op op, + octave_value_typeinfo::binary_class_op_fcn f) +{ + if (lookup_binary_class_op (op)) + { + std::string op_name = octave_value::binary_op_fcn_name (op); + + warning ("duplicate compound binary operator `%s' for class dispatch", + op_name.c_str ()); + } + + compound_binary_class_ops.checkelem (static_cast<int> (op)) = f; + + return false; +} + +bool +octave_value_typeinfo::do_register_binary_op (octave_value::compound_binary_op op, + int t1, int t2, + octave_value_typeinfo::binary_op_fcn f) +{ + if (lookup_binary_op (op, t1, t2)) + { + std::string op_name = octave_value::binary_op_fcn_name (op); + std::string t1_name = types(t1); + std::string t2_name = types(t2); + + warning ("duplicate compound binary operator `%s' for types `%s' and `%s'", + op_name.c_str (), t1_name.c_str (), t1_name.c_str ()); + } + + compound_binary_ops.checkelem (static_cast<int> (op), t1, t2) = f; + + return false; +} + +bool octave_value_typeinfo::do_register_cat_op (int t1, int t2, octave_value_typeinfo::cat_op_fcn f) { if (lookup_cat_op (t1, t2)) @@ -496,6 +553,19 @@ return binary_ops.checkelem (static_cast<int> (op), t1, t2); } +octave_value_typeinfo::binary_class_op_fcn +octave_value_typeinfo::do_lookup_binary_class_op (octave_value::compound_binary_op op) +{ + return compound_binary_class_ops.checkelem (static_cast<int> (op)); +} + +octave_value_typeinfo::binary_op_fcn +octave_value_typeinfo::do_lookup_binary_op (octave_value::compound_binary_op op, + int t1, int t2) +{ + return compound_binary_ops.checkelem (static_cast<int> (op), t1, t2); +} + octave_value_typeinfo::cat_op_fcn octave_value_typeinfo::do_lookup_cat_op (int t1, int t2) {