/*
narray_local.h
Numerical Array Extention for Ruby
(C) Copyright 1999-2003 by Masahiro TANAKA
This program is free software.
You can distribute/modify this program
under the same terms as Ruby itself.
NO WARRANTY.
*/
typedef int32_t na_index_t;
struct slice {
char *p; /* pointer to data --- used in loop */
int n; /* n of indices of this rank */
int pstep; /* = step * stride * elmsz --- set in na_init_slice */
int pbeg; /* = beg * stride * elmsz --- set in na_init_slice */
int stride; /* = shape[0]*shape[1]*...*shape[r-1]
--- set in na_init_slice */
int step;
int beg;
na_index_t *idx; /* NULL if normal step */
};
typedef void (*na_setfunc_t[NA_NTYPES][NA_NTYPES]) ();
typedef void (*na_func_t[NA_NTYPES]) ();
typedef void (*na_ufunc_t[NA_NTYPES]) ();
typedef void (*na_bifunc_t[NA_NTYPES]) ();
typedef void (*na_mathfunc_t[NA_NTYPES]) ();
typedef int (*na_sortfunc_t[NA_NTYPES]) (const void *, const void *);
/* function arrays */
extern na_setfunc_t SetFuncs;
extern na_ufunc_t SwpFuncs;
extern na_ufunc_t H2NFuncs;
extern na_ufunc_t H2VFuncs;
extern na_ufunc_t NegFuncs;
extern na_ufunc_t RcpFuncs;
extern na_ufunc_t AbsFuncs;
extern na_ufunc_t RealFuncs;
extern na_ufunc_t ImagFuncs;
extern na_ufunc_t AnglFuncs;
extern na_ufunc_t ImagMulFuncs;
extern na_ufunc_t ConjFuncs;
extern na_ufunc_t FloorFuncs;
extern na_ufunc_t CeilFuncs;
extern na_ufunc_t RoundFuncs;
extern na_ufunc_t ToStrFuncs;
extern na_ufunc_t InspFuncs;
extern na_ufunc_t IndGenFuncs;
extern na_ufunc_t AddUFuncs;
extern na_ufunc_t SbtUFuncs;
extern na_ufunc_t MulUFuncs;
extern na_ufunc_t DivUFuncs;
extern na_bifunc_t AddBFuncs;
extern na_bifunc_t SbtBFuncs;
extern na_bifunc_t MulBFuncs;
extern na_bifunc_t DivBFuncs;
extern na_bifunc_t MulAddFuncs;
extern na_bifunc_t MulSbtFuncs;
extern na_bifunc_t ModBFuncs;
extern na_bifunc_t BAnFuncs;
extern na_bifunc_t BOrFuncs;
extern na_bifunc_t BXoFuncs;
extern na_ufunc_t BRvFuncs;
extern na_bifunc_t ImgSetFuncs;
extern na_setfunc_t PowFuncs;
extern na_bifunc_t atan2Funcs;
extern na_bifunc_t CmpFuncs;
extern na_bifunc_t EqlFuncs;
extern na_ufunc_t AndFuncs;
extern na_ufunc_t Or_Funcs;
extern na_ufunc_t XorFuncs;
extern na_ufunc_t NotFuncs;
extern na_ufunc_t MinFuncs;
extern na_ufunc_t MaxFuncs;
extern na_sortfunc_t SortFuncs;
extern na_sortfunc_t SortIdxFuncs;
extern na_bifunc_t RefMaskFuncs;
extern na_bifunc_t SetMaskFuncs;
/* variables */
extern VALUE rb_mNMath;
extern ID na_id_beg, na_id_end, na_id_exclude_end;
extern ID na_id_minus, na_id_abs, na_id_power;
extern ID na_id_compare, na_id_and, na_id_or;
extern ID na_id_equal;
extern ID na_id_class_dim;
extern ID na_id_add, na_id_sbt, na_id_mul, na_id_div, na_id_mod;
extern ID na_id_real, na_id_imag;
extern ID na_id_coerce_rev;
extern ID na_id_new;
extern const int na_upcast[NA_NTYPES][NA_NTYPES];
extern const int na_no_cast[NA_NTYPES];
extern const int na_cast_real[NA_NTYPES];
extern const int na_cast_comp[NA_NTYPES];
extern const int na_cast_round[NA_NTYPES];
extern const int na_cast_byte[NA_NTYPES];
extern const char *na_typestring[];
extern VALUE cNArrayScalar, cComplex;
/* narray.c */
VALUE na_newdim_ref(int argc, VALUE *argv, VALUE self);
/* na_func.c */
int na_max3(int a, int b, int c);
void na_shape_max3(int ndim, int *max_shp, int *shp1, int *shp2, int *shp3);
void na_shape_copy( int ndim, int *shape, struct NARRAY *a );
void na_init_slice(struct slice *s, int rank, int *shape, int elmsz);
void na_set_slice_1obj(int ndim, struct slice *slc, int *shape);
int na_set_slice_3obj( int ndim,
struct slice *s1, struct slice *s2, struct slice *s3,
int *shp1, int *shp2, int *shp3, int *shape );
void na_loop_general(struct NARRAY *a1, struct NARRAY *a2,
struct slice *s1, struct slice *s2, void (*func)());
void na_loop_index_ref(struct NARRAY *a1, struct NARRAY *a2,
struct slice *s1, struct slice *s2, void (*func)());
/* na_index.c */
void na_aset_slice(struct NARRAY *dst, struct NARRAY *src, struct slice *s1);
int na_shrink_class(int class_dim, int *shrink);
VALUE na_shrink_rank(VALUE obj, int class_dim, int *shrink);
#define rb_complex_new(r,i) \
rb_funcall(cComplex, na_id_new, 2, rb_float_new(r), rb_float_new(i))
typedef union {
u_int8_t b[2];
int16_t s;
} na_size16_t;
typedef union {
u_int8_t b[4];
int32_t i;
float f;
} na_size32_t;
typedef union {
u_int8_t b[8];
float f[2];
double d;
} na_size64_t;
typedef union {
u_int8_t b[16];
double d[2];
} na_size128_t;
#define swap16(d,s) \
(d).b[0]=(s).b[1];\
(d).b[1]=(s).b[0];
#define swap32(d,s) \
(d).b[0]=(s).b[3];\
(d).b[1]=(s).b[2];\
(d).b[2]=(s).b[1];\
(d).b[3]=(s).b[0];
#define swap64(d,s) \
(d).b[0]=(s).b[7];\
(d).b[1]=(s).b[6];\
(d).b[2]=(s).b[5];\
(d).b[3]=(s).b[4];\
(d).b[4]=(s).b[3];\
(d).b[5]=(s).b[2];\
(d).b[6]=(s).b[1];\
(d).b[7]=(s).b[0];
#define swap64c(d,s) \
(d).b[0]=(s).b[3];\
(d).b[1]=(s).b[2];\
(d).b[2]=(s).b[1];\
(d).b[3]=(s).b[0];\
(d).b[4]=(s).b[7];\
(d).b[5]=(s).b[6];\
(d).b[6]=(s).b[5];\
(d).b[7]=(s).b[4];
#define swap128c(d,s) \
(d).b[0]=(s).b[7];\
(d).b[1]=(s).b[6];\
(d).b[2]=(s).b[5];\
(d).b[3]=(s).b[4];\
(d).b[4]=(s).b[3];\
(d).b[5]=(s).b[2];\
(d).b[6]=(s).b[1];\
(d).b[7]=(s).b[0];\
(d).b[8]=(s).b[15];\
(d).b[9]=(s).b[14];\
(d).b[10]=(s).b[13];\
(d).b[11]=(s).b[12];\
(d).b[12]=(s).b[11];\
(d).b[13]=(s).b[10];\
(d).b[14]=(s).b[9];\
(d).b[15]=(s).b[8];
syntax highlighted by Code2HTML, v. 0.9.1