# HG changeset patch # User jwe # Date 1093999746 0 # Node ID bfd57b466752bbf2f407154b7a07b73a0f00895c # Parent 0a21e1bf18c4b2c2aab3f5e32e90d2e15790ca0f [project @ 2004-09-01 00:49:05 by jwe] diff -r 0a21e1bf18c4 -r bfd57b466752 liboctave/ChangeLog --- a/liboctave/ChangeLog Tue Aug 31 21:27:10 2004 +0000 +++ b/liboctave/ChangeLog Wed Sep 01 00:49:06 2004 +0000 @@ -1,3 +1,24 @@ +2004-08-31 John W. Eaton + + * oct-inttypes.h (pow): Args now const reference. + (octave_int::operator *=, octave_int::operator /=, + octave_int::operator <<=, octave_int::operator >>=): + New member functions. + (OCTAVE_INT_BITSHIFT_OP): Delete macro. + (operator >> (const octave_int& x, const T2& y)): + Define in terms of >>=. + (operator << (const octave_int& x, const T2& y)): + Define in terms of <<=. + (bitshift): Operate on octave_int objects, not the values, so + we get proper saturation properties. + +2004-08-31 David Bateman + + * oct-inttypes.h (pow (constT, T)): New template. + + * int8NDArray.cc, int16NDArray.cc, int32NDArray.cc, uint8NDArray.cc, + uint16NDArray.cc, uint32NDArray.cc: Instantiate power function. + 2004-08-31 John W. Eaton * oct-inttypes.h (octave_int::byte_size): New function. diff -r 0a21e1bf18c4 -r bfd57b466752 liboctave/int16NDArray.cc --- a/liboctave/int16NDArray.cc Tue Aug 31 21:27:10 2004 +0000 +++ b/liboctave/int16NDArray.cc Wed Sep 01 00:49:06 2004 +0000 @@ -35,6 +35,8 @@ template class intNDArray; +template octave_int16 pow (const octave_int16& a, const octave_int16& b); + template std::ostream& operator << (std::ostream& os, const intNDArray& a); diff -r 0a21e1bf18c4 -r bfd57b466752 liboctave/int32NDArray.cc --- a/liboctave/int32NDArray.cc Tue Aug 31 21:27:10 2004 +0000 +++ b/liboctave/int32NDArray.cc Wed Sep 01 00:49:06 2004 +0000 @@ -35,6 +35,8 @@ template class intNDArray; +template octave_int32 pow (const octave_int32& a, const octave_int32& b); + template std::ostream& operator << (std::ostream& os, const intNDArray& a); diff -r 0a21e1bf18c4 -r bfd57b466752 liboctave/int8NDArray.cc --- a/liboctave/int8NDArray.cc Tue Aug 31 21:27:10 2004 +0000 +++ b/liboctave/int8NDArray.cc Wed Sep 01 00:49:06 2004 +0000 @@ -35,6 +35,8 @@ template class intNDArray; +template octave_int8 pow (const octave_int8& a, const octave_int8& b); + template std::ostream& operator << (std::ostream& os, const intNDArray& a); diff -r 0a21e1bf18c4 -r bfd57b466752 liboctave/oct-inttypes.h --- a/liboctave/oct-inttypes.h Tue Aug 31 21:27:10 2004 +0000 +++ b/liboctave/oct-inttypes.h Wed Sep 01 00:49:06 2004 +0000 @@ -267,6 +267,36 @@ return *this; } + octave_int& operator *= (const octave_int& x) + { + double t = static_cast (value ()); + double tx = static_cast (x.value ()); + ival = OCTAVE_INT_FIT_TO_RANGE (t * tx, T); + return *this; + } + + octave_int& operator /= (const octave_int& x) + { + double t = static_cast (value ()); + double tx = static_cast (x.value ()); + ival = OCTAVE_INT_FIT_TO_RANGE (t / tx, T); + return *this; + } + + template + octave_int& operator <<= (const T2& x) + { + ival = ((ival << x) > std::numeric_limits::max ()) ? 0 : (ival << x); + return *this; + } + + template + octave_int& operator >>= (const T2& x) + { + ival >>= x; + return *this; + } + octave_int min (void) const { return std::numeric_limits::min (); } octave_int max (void) const { return std::numeric_limits::max (); } @@ -280,6 +310,43 @@ }; template +T +pow (const T& a, const T& b) +{ + T retval; + + T zero = T (0); + T one = T (1); + + if (b == zero) + retval = one; + else if (b < zero) + retval = zero; + else + { + T a_val = a; + T b_val = b; + + retval = a; + + b_val -= 1; + + while (b_val) + { + if (b_val & one) + retval = retval * a_val; + + b_val = b_val >> 1; + + if (b_val > zero) + a_val = a_val * a_val; + } + } + + return retval; +} + +template std::ostream& operator << (std::ostream& os, const octave_int& ival) { @@ -337,17 +404,21 @@ OCTAVE_INT_BITCMP_OP (|) OCTAVE_INT_BITCMP_OP (^) -#define OCTAVE_INT_BITSHIFT_OP(OP) \ - \ - template \ - octave_int \ - operator OP (const octave_int& x, const T2& y) \ - { \ - return ((x.value () OP y) > std::numeric_limits::max ()) ? 0 : (x.value () OP y); \ - } +template +octave_int +operator << (const octave_int& x, const T2& y) +{ + T1 retval = x; + return retval <<= y; +} -OCTAVE_INT_BITSHIFT_OP (<<) -OCTAVE_INT_BITSHIFT_OP (>>) +template +octave_int +operator >> (const octave_int& x, const T2& y) +{ + T1 retval = x; + return retval >>= y; +} template octave_int @@ -355,9 +426,9 @@ const octave_int& mask = std::numeric_limits::max ()) { if (n > 0) - return (a.value () << n) & mask.value (); + return (a << n) & mask; else if (n < 0) - return (a.value () >> -n) & mask.value (); + return (a >> -n) & mask; else return a; } diff -r 0a21e1bf18c4 -r bfd57b466752 liboctave/uint16NDArray.cc --- a/liboctave/uint16NDArray.cc Tue Aug 31 21:27:10 2004 +0000 +++ b/liboctave/uint16NDArray.cc Wed Sep 01 00:49:06 2004 +0000 @@ -35,6 +35,8 @@ template class intNDArray; +template octave_uint16 pow (const octave_uint16& a, const octave_uint16& b); + template std::ostream& operator << (std::ostream& os, const intNDArray& a); diff -r 0a21e1bf18c4 -r bfd57b466752 liboctave/uint32NDArray.cc --- a/liboctave/uint32NDArray.cc Tue Aug 31 21:27:10 2004 +0000 +++ b/liboctave/uint32NDArray.cc Wed Sep 01 00:49:06 2004 +0000 @@ -35,6 +35,8 @@ template class intNDArray; +template octave_uint32 pow (const octave_uint32& a, const octave_uint32& b); + template std::ostream& operator << (std::ostream& os, const intNDArray& a); diff -r 0a21e1bf18c4 -r bfd57b466752 liboctave/uint8NDArray.cc --- a/liboctave/uint8NDArray.cc Tue Aug 31 21:27:10 2004 +0000 +++ b/liboctave/uint8NDArray.cc Wed Sep 01 00:49:06 2004 +0000 @@ -35,6 +35,8 @@ template class intNDArray; +template octave_uint8 pow (const octave_uint8& a, const octave_uint8& b); + template std::ostream& operator << (std::ostream& os, const intNDArray& a); diff -r 0a21e1bf18c4 -r bfd57b466752 src/ChangeLog --- a/src/ChangeLog Tue Aug 31 21:27:10 2004 +0000 +++ b/src/ChangeLog Wed Sep 01 00:49:06 2004 +0000 @@ -1,3 +1,26 @@ +2004-08-31 David Bateman + + * OPERATORS/op-int.h (ss_pow, ms_el_pow, mm_el_pow): New power + functions. + (sm_el_pow): Return correct type. + (OCTAVE_SS_POW_OPS, OCTAVE_SM_POW_OPS, OCTAVE_MS_POW_OPS, + OCTAVE_MM_POW_OPS): New macros to define the power operator over + integer types. + (OCTAVE_SS_INT_OPS, OCTAVE_SM_INT_OPS, OCTAVE_MS_INT_OPS, + OCTAVE_MM_INT_OPS): Use the new macros for the power operators. + (OCTAVE_INSTALL_SS_INT_OPS, OCTAVE_INSTALL_MS_INT_OPS, + OCTAVE_INSTALL_MM_INT_OPS): Install new power functions. + + * OPERATORS/op-int-conv.cc (INT_CONV_FUNCTIONS): Correct return + types for unsigned integer scalars and signed integer matrices. + + * ov-type-conv.h (OCTAVE_TYPE_CONV_BODY3): Conversion betwen same + types returns the original value. + + * bitfcns.cc (BITOP): Fix for mixed scalar/matrix ops. Allow + octave_range as an argument, by using class_name rather than + type_id to test. + 2004-08-31 John W. Eaton * pr-output.cc (pr_int): Also handle bank_format. diff -r 0a21e1bf18c4 -r bfd57b466752 src/OPERATORS/op-int-conv.cc --- a/src/OPERATORS/op-int-conv.cc Tue Aug 31 21:27:10 2004 +0000 +++ b/src/OPERATORS/op-int-conv.cc Wed Sep 01 00:49:06 2004 +0000 @@ -83,15 +83,15 @@ DEFCONVFN2 (tfrom ## _scalar_to_int32, tfrom, scalar, int32) \ DEFCONVFN2 (tfrom ## _scalar_to_int64, tfrom, scalar, int64) \ \ - DEFCONVFN2 (tfrom ## _scalar_to_uint8, tfrom, scalar, int8) \ - DEFCONVFN2 (tfrom ## _scalar_to_uint16, tfrom, scalar, int16) \ - DEFCONVFN2 (tfrom ## _scalar_to_uint32, tfrom, scalar, int32) \ - DEFCONVFN2 (tfrom ## _scalar_to_uint64, tfrom, scalar, int64) \ + DEFCONVFN2 (tfrom ## _scalar_to_uint8, tfrom, scalar, uint8) \ + DEFCONVFN2 (tfrom ## _scalar_to_uint16, tfrom, scalar, uint16) \ + DEFCONVFN2 (tfrom ## _scalar_to_uint32, tfrom, scalar, uint32) \ + DEFCONVFN2 (tfrom ## _scalar_to_uint64, tfrom, scalar, uint64) \ \ - DEFCONVFN2 (tfrom ## _matrix_to_int8, tfrom, matrix, uint8) \ - DEFCONVFN2 (tfrom ## _matrix_to_int16, tfrom, matrix, uint16) \ - DEFCONVFN2 (tfrom ## _matrix_to_int32, tfrom, matrix, uint32) \ - DEFCONVFN2 (tfrom ## _matrix_to_int64, tfrom, matrix, uint64) \ + DEFCONVFN2 (tfrom ## _matrix_to_int8, tfrom, matrix, int8) \ + DEFCONVFN2 (tfrom ## _matrix_to_int16, tfrom, matrix, int16) \ + DEFCONVFN2 (tfrom ## _matrix_to_int32, tfrom, matrix, int32) \ + DEFCONVFN2 (tfrom ## _matrix_to_int64, tfrom, matrix, int64) \ \ DEFCONVFN2 (tfrom ## _matrix_to_uint8, tfrom, matrix, uint8) \ DEFCONVFN2 (tfrom ## _matrix_to_uint16, tfrom, matrix, uint16) \ diff -r 0a21e1bf18c4 -r bfd57b466752 src/OPERATORS/op-int.h --- a/src/OPERATORS/op-int.h Tue Aug 31 21:27:10 2004 +0000 +++ b/src/OPERATORS/op-int.h Wed Sep 01 00:49:06 2004 +0000 @@ -20,6 +20,8 @@ */ +#include "quit.h" + #define OCTAVE_CONCAT_FN(TYPE) \ DEFNDCATOP_FN (TYPE ## _s_s, TYPE ## _scalar, TYPE ## _scalar, TYPE ## _array, TYPE ## _array, concat) \ DEFNDCATOP_FN (TYPE ## _s_m, TYPE ## _scalar, TYPE ## _matrix, TYPE ## _array, TYPE ## _array, concat) \ @@ -62,7 +64,7 @@ return octave_value (v1.T1 ## _scalar_value () / d); \ } \ \ - /* DEFBINOP_FN (ss_pow, T1 ## _scalar, T2 ## _scalar, xpow) */ \ + DEFBINOP_FN (ss_pow, T1 ## _scalar, T2 ## _scalar, xpow) \ \ DEFBINOP (ss_ldiv, T1 ## _scalar, T2 ## _scalar) \ { \ @@ -116,8 +118,12 @@ DEFBINOP_OP (ss_gt, T1 ## _scalar, T2 ## _scalar, >) \ DEFBINOP_OP (ss_ne, T1 ## _scalar, T2 ## _scalar, !=) +#define OCTAVE_SS_POW_OPS(T1, T2) \ + octave_value xpow (octave_ ## T1 a, octave_ ## T2 b) {return pow (a, b);} + #define OCTAVE_SS_INT_OPS(TYPE) \ OCTAVE_S_INT_UNOPS (TYPE) \ + OCTAVE_SS_POW_OPS (TYPE, TYPE) \ OCTAVE_SS_INT_ARITH_OPS (TYPE, TYPE) \ OCTAVE_SS_INT_CMP_OPS (TYPE, TYPE) \ OCTAVE_SS_INT_BOOL_OPS (TYPE, TYPE) @@ -160,15 +166,7 @@ \ DEFNDBINOP_OP (sm_el_mul, TS ## _scalar, TM ## _matrix, TS ## _scalar, TM ## _array, *) \ /* DEFNDBINOP_FN (sm_el_div, TS ## _scalar, TM ## _matrix, TS ## _scalar, TM ## _array, x_el_div) */ \ - DEFBINOP (sm_el_pow, TS ## _scalar, TM ## _matrix) \ - { \ - CAST_BINOP_ARGS (const octave_ ## TS ## _scalar&, const octave_ ## TM ## _matrix&); \ - \ - double d = v1.TS ## _scalar_value (); \ - \ - /* XXX FIXME XXX Return type wrong */ \ - return octave_value (elem_xpow (d, v2.array_value())); \ - } \ + DEFNDBINOP_FN (sm_el_pow, TS ## _scalar, TM ## _matrix, TS ## _scalar, TM ## _array, elem_xpow) \ \ /* DEFBINOP (sm_el_ldiv, TS ## _scalar, TM ## _matrix) */ \ /* { */ \ @@ -194,7 +192,20 @@ /* DEFNDBINOP_FN (sm_el_and, TS ## _scalar, TYPE ## _matrix, TS ## _scalar, TYPE ## _array, mx_el_and) */ \ /* DEFNDBINOP_FN (sm_el_or, TS ## _scalar, TYPE ## _matrix, TS ## _scalar, TYPE ## _array, mx_el_or) */ +#define OCTAVE_SM_POW_OPS(T1, T2) \ +octave_value elem_xpow (octave_ ## T1 a, T2 ## NDArray b) \ +{ \ + T2 ## NDArray result (b.dims ()); \ + for (int i = 0; i < b.length (); i++) \ + { \ + OCTAVE_QUIT; \ + result (i) = pow (a, b(i)); \ + } \ + return octave_value (result); \ +} + #define OCTAVE_SM_INT_OPS(TYPE) \ + OCTAVE_SM_POW_OPS (TYPE, TYPE) \ OCTAVE_SM_INT_ARITH_OPS (TYPE, TYPE) \ OCTAVE_SM_INT_CMP_OPS (TYPE, TYPE) \ OCTAVE_SM_INT_BOOL_OPS (TYPE, TYPE) \ @@ -256,7 +267,7 @@ /* return octave_value (v1.TM ## _array_value () / d); */ \ /* } */ \ \ - /* DEFNDBINOP_FN (ms_el_pow, TM ## _matrix, TS ## _scalar, TM ## _array, TS ## _scalar, elem_xpow) */ \ + DEFNDBINOP_FN (ms_el_pow, TM ## _matrix, TS ## _scalar, TM ## _array, TS ## _scalar, elem_xpow) \ \ /* DEFBINOP (el_ldiv, TM ## _matrix, TS ## _scalar) */ \ /* { */ \ @@ -281,7 +292,20 @@ #define OCTAVE_MS_INT_ASSIGN_OPS(TM, TS) \ DEFNDASSIGNOP_FN (ms_assign, TM ## _matrix, TS ## _scalar, TS ## _array, assign) +#define OCTAVE_MS_POW_OPS(T1, T2) \ +octave_value elem_xpow (T1 ## NDArray a, octave_ ## T2 b) \ +{ \ + T1 ## NDArray result (a.dims ()); \ + for (int i = 0; i < a.length (); i++) \ + { \ + OCTAVE_QUIT; \ + result (i) = pow (a(i), b); \ + } \ + return octave_value (result); \ +} + #define OCTAVE_MS_INT_OPS(TYPE) \ + OCTAVE_MS_POW_OPS (TYPE, TYPE) \ OCTAVE_MS_INT_ARITH_OPS (TYPE, TYPE) \ OCTAVE_MS_INT_CMP_OPS (TYPE, TYPE) \ OCTAVE_MS_INT_BOOL_OPS (TYPE, TYPE) \ @@ -330,7 +354,7 @@ \ DEFNDBINOP_FN (mm_el_div, T1 ## _matrix, T2 ## _matrix, T1 ## _array, T2 ## _array, quotient) \ \ - /* DEFNDBINOP_FN (mm_el_pow, T1 ## _matrix, T2 ## _matrix, T1 ## _array, T2 ## _array, elem_xpow) */ \ + DEFNDBINOP_FN (mm_el_pow, T1 ## _matrix, T2 ## _matrix, T1 ## _array, T2 ## _array, elem_xpow) \ \ /* DEFBINOP (mm_el_ldiv, T1 ## _matrix, T2 ## _matrix) */ \ /* { */ \ @@ -354,8 +378,28 @@ #define OCTAVE_MM_INT_ASSIGN_OPS(TYPE) \ DEFNDASSIGNOP_FN (mm_assign, TYPE ## _matrix, TYPE ## _matrix, TYPE ## _array, assign) +#define OCTAVE_MM_POW_OPS(T1, T2) \ +octave_value elem_xpow (T1 ## NDArray a, T2 ## NDArray b) \ +{ \ + dim_vector a_dims = a.dims (); \ + dim_vector b_dims = b.dims (); \ + if (a_dims != b_dims) \ + { \ + gripe_nonconformant ("operator .^", a_dims, b_dims); \ + return octave_value (); \ + } \ + T1 ## NDArray result (a_dims); \ + for (int i = 0; i < a.length (); i++) \ + { \ + OCTAVE_QUIT; \ + result (i) = pow (a(i), b(i)); \ + } \ + return octave_value (result); \ +} + #define OCTAVE_MM_INT_OPS(TYPE) \ OCTAVE_M_INT_UNOPS (TYPE) \ + OCTAVE_MM_POW_OPS (TYPE, TYPE) \ OCTAVE_MM_INT_ARITH_OPS (TYPE, TYPE) \ OCTAVE_MM_INT_CMP_OPS (TYPE, TYPE) \ OCTAVE_MM_INT_BOOL_OPS (TYPE, TYPE) \ @@ -387,7 +431,7 @@ INSTALL_BINOP (op_sub, octave_ ## T1 ## _scalar, octave_ ## T2 ## _scalar, ss_sub); \ INSTALL_BINOP (op_mul, octave_ ## T1 ## _scalar, octave_ ## T2 ## _scalar, ss_mul); \ INSTALL_BINOP (op_div, octave_ ## T1 ## _scalar, octave_ ## T2 ## _scalar, ss_div); \ - /* INSTALL_BINOP (op_pow, octave_ ## T1 ## _scalar, octave_ ## T2 ## _scalar, ss_pow); */ \ + INSTALL_BINOP (op_pow, octave_ ## T1 ## _scalar, octave_ ## T2 ## _scalar, ss_pow); \ INSTALL_BINOP (op_ldiv, octave_ ## T1 ## _scalar, octave_ ## T2 ## _scalar, ss_ldiv); \ INSTALL_BINOP (op_el_mul, octave_ ## T1 ## _scalar, octave_ ## T2 ## _scalar, ss_el_mul); \ INSTALL_BINOP (op_el_div, octave_ ## T1 ## _scalar, octave_ ## T2 ## _scalar, ss_el_div); \ @@ -464,7 +508,7 @@ \ INSTALL_BINOP (op_el_mul, octave_ ## T1 ## _matrix, octave_ ## T2 ## _scalar, ms_el_mul); \ /* INSTALL_BINOP (op_el_div, octave_ ## T1 ## _matrix, octave_ ## T2 ## _scalar, ms_el_div); */ \ - /* INSTALL_BINOP (op_el_pow, octave_ ## T1 ## _matrix, octave_ ## T2 ## _scalar, ms_el_pow); */ \ + INSTALL_BINOP (op_el_pow, octave_ ## T1 ## _matrix, octave_ ## T2 ## _scalar, ms_el_pow); \ /* INSTALL_BINOP (op_el_ldiv, octave_ ## T1 ## _matrix, octave_ ## T2 ## _scalar, ms_el_ldiv); */ #define OCTAVE_INSTALL_MS_INT_CMP_OPS(T1, T2) \ @@ -513,7 +557,7 @@ /* INSTALL_BINOP (op_ldiv, octave_ ## T1 ## _matrix, octave_ ## T2 ## _matrix, mm_ldiv); */ \ INSTALL_BINOP (op_el_mul, octave_ ## T1 ## _matrix, octave_ ## T2 ## _matrix, mm_el_mul); \ INSTALL_BINOP (op_el_div, octave_ ## T1 ## _matrix, octave_ ## T2 ## _matrix, mm_el_div); \ - /* INSTALL_BINOP (op_el_pow, octave_ ## T1 ## _matrix, octave_ ## T2 ## _matrix, mm_el_pow); */ \ + INSTALL_BINOP (op_el_pow, octave_ ## T1 ## _matrix, octave_ ## T2 ## _matrix, mm_el_pow); \ /* INSTALL_BINOP (op_el_ldiv, octave_ ## T1 ## _matrix, octave_ ## T2 ## _matrix, mm_el_ldiv); */ #define OCTAVE_INSTALL_MM_INT_CMP_OPS(T1, T2) \ diff -r 0a21e1bf18c4 -r bfd57b466752 src/bitfcns.cc --- a/src/bitfcns.cc Tue Aug 31 21:27:10 2004 +0000 +++ b/src/bitfcns.cc Wed Sep 01 00:49:06 2004 +0000 @@ -86,23 +86,15 @@ \ if (nargin == 2) \ { \ - if (args(0).type_id () == octave_matrix::static_type_id () \ - || args(0).type_id () == octave_scalar::static_type_id () \ - || args(1).type_id () == octave_matrix::static_type_id () \ - || args(1).type_id () == octave_scalar::static_type_id ()) \ + if ((args(0).class_name () == octave_scalar::static_class_name ()) \ + || (args(1).class_name () == octave_scalar::static_class_name ())) \ { \ - bool arg0_is_int = true; \ - bool arg1_is_int = true; \ - \ - if (args(0).type_id () == octave_matrix::static_type_id () \ - || args(0).type_id () == octave_scalar::static_type_id ()) \ - arg0_is_int = false; \ - \ - if (args(1).type_id () == octave_matrix::static_type_id () \ - || args(1).type_id () == octave_scalar::static_type_id ()) \ - arg1_is_int = false; \ - \ - if (!arg0_is_int && !arg1_is_int) \ + bool arg0_is_int = (args(0).class_name () != \ + octave_scalar::static_class_name ()); \ + bool arg1_is_int = (args(1).class_name () != \ + octave_scalar::static_class_name ()); \ + \ + if (! (arg0_is_int || arg1_is_int)) \ { \ uint64NDArray x (args(0).array_value ()); \ uint64NDArray y (args(1).array_value ()); \ @@ -185,7 +177,7 @@ error ("%s: invalid operand type", FNAME); \ } \ } \ - else if (args(0).type_id () == args(1).type_id ()) \ + else if (args(0).class_name () == args(1).class_name ()) \ { \ if (args(0).type_id () == octave_uint64_matrix::static_type_id () \ || args(0).type_id () == octave_uint64_scalar::static_type_id ()) \ diff -r 0a21e1bf18c4 -r bfd57b466752 src/ov-type-conv.h --- a/src/ov-type-conv.h Tue Aug 31 21:27:10 2004 +0000 +++ b/src/ov-type-conv.h Wed Sep 01 00:49:06 2004 +0000 @@ -61,6 +61,8 @@ gripe_invalid_conversion (arg_tname, result_tname); \ } \ } \ + else \ + retval = arg; \ } \ else \ print_usage (#NAME); \