
#include "ruby.h"

extern VALUE cBasicNumArray;
extern VALUE cBasicNumArrayDouble;
static ID icoerce;
static ID iadd;
static ID isub;
static ID imul;
static ID idiv;
static ID ipow;
static ID imod;

enum eType {
    tDOUBLE
};

enum eOpt {
    oADD, 
    oSUB, 
    oMUL, 
    oDIV,
    oPOW,
    oMOD,

    oACOS,
    oACOSH,
    oASIN,
    oASINH,
    oATAN,
    oATANH,
    oCBRT,
    oCEIL,
    oCOPYSIGN,
    oCOS,
    oCOSH,
    oERF,
    oERFC,
    oEXP,
    oEXPM1,
    oFABS,
    oFLOOR,
    oILOGB,
    oJ0,
    oJ1,
    oLGAMMA,
    oLOG,
    oLOG10,
    oLOG1P,
    oRINT,
    oSIN,
    oSINH,
    oSQRT,
    oTAN,
    oTANH,
    oY0,
    oY1
};

typedef enum eType etype;
typedef enum eOpt  eopt;

struct BasicNumArray {
    etype  type;
    size_t len;
    void   *ptr;
};

#define BNA struct BasicNumArray

extern BNA * alloc_bna(etype type, size_t len);
extern void free_bna(BNA *ary);
extern VALUE bna_s_new(VALUE mod, VALUE klass, VALUE size);
extern VALUE na_trim(VALUE obj);
extern VALUE na_to_basic(VALUE obj);
extern VALUE bna_setall(VALUE obj, VALUE x);
extern VALUE bna_scaler(VALUE x, VALUE y);
extern VALUE bna_len(VALUE obj);
extern VALUE bna_aref0(VALUE obj, VALUE idx);
extern VALUE bna_aref(VALUE obj, VALUE idx);
extern VALUE bna_aset0(VALUE obj, VALUE idx, VALUE x);
extern VALUE bna_aset(VALUE obj, VALUE idx, VALUE x); 
extern etype bna_etype(VALUE obj);
extern VALUE bna_binop(VALUE x, VALUE y, ID op, eopt eop);
extern VALUE bna_add(VALUE x, VALUE y);
extern VALUE bna_sub(VALUE x, VALUE y);
extern VALUE bna_mul(VALUE x, VALUE y);
extern VALUE bna_div(VALUE x, VALUE y);
extern VALUE bna_pow(VALUE x, VALUE y);
extern VALUE bna_mod(VALUE x, VALUE y);
extern VALUE unary_op(VALUE x , eopt op);
extern VALUE bna_acos(VALUE x);
extern VALUE bna_acosh(VALUE x);
extern VALUE bna_asin(VALUE x);
extern VALUE bna_asinh(VALUE x);
extern VALUE bna_atan(VALUE x);
extern VALUE bna_atanh(VALUE x);
extern VALUE bna_cbrt(VALUE x);
extern VALUE bna_ceil(VALUE x);
extern VALUE bna_copysign(VALUE x);
extern VALUE bna_cos(VALUE x);
extern VALUE bna_cosh(VALUE x);
extern VALUE bna_erf(VALUE x);
extern VALUE bna_erfc(VALUE x);
extern VALUE bna_exp(VALUE x);
extern VALUE bna_expm1(VALUE x);
extern VALUE bna_fabs(VALUE x);
extern VALUE bna_floor(VALUE x);
extern VALUE bna_j0(VALUE x);
extern VALUE bna_j1(VALUE x);
extern VALUE bna_lgamma(VALUE x);
extern VALUE bna_log(VALUE x);
extern VALUE bna_log10(VALUE x);
extern VALUE bna_1p(VALUE x);
extern VALUE bna_rint(VALUE x);
extern VALUE bna_sin(VALUE x);
extern VALUE bna_sinh(VALUE x);
extern VALUE bna_sqrt(VALUE x);
extern VALUE bna_tan(VALUE x);
extern VALUE bna_tanh(VALUE x);
extern VALUE bna_y0(VALUE x);
extern VALUE bna_y1(VALUE x);
extern VALUE m_cos(VALUE obj, VALUE x); 
extern VALUE m_sin(VALUE obj, VALUE x);
extern VALUE m_tan(VALUE obj, VALUE x);
extern VALUE m_exp(VALUE obj, VALUE x);
extern VALUE m_log(VALUE obj, VALUE x);
extern VALUE m_log10(VALUE obj, VALUE x);
extern VALUE m_sqrt(VALUE obj, VALUE x);
extern VALUE bna_inspect_ary(VALUE obj);
extern VALUE bna_ary_inspect(VALUE obj);
extern void Init_basicnumarray(void);




