Update of /cvsroot/pure-data/externals/gridflow/base
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18270
Modified Files:
bitpacking.c flow_objects.c flow_objects_for_image.c
flow_objects_for_matrix.c grid.c grid.h main.c number.c
Log Message:
0.8.1
Index: number.c
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/base/number.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** number.c 4 Oct 2005 02:02:13 -0000 1.1
--- number.c 15 Mar 2006 04:37:08 -0000 1.2
***************
*** 45,50 ****
// I call abort() on those because I can't say they're purevirtual.
static T f(T a, T b) {abort();}
! static bool is_neutral(T x, LeftRight side) {assert(!"Op::is_neutral called?");}
! static bool is_absorbent(T x, LeftRight side) {assert(!"Op::is_absorbent called?");}
};
--- 45,50 ----
// I call abort() on those because I can't say they're purevirtual.
static T f(T a, T b) {abort();}
! static bool is_neutral(T x, LeftRight side) {assert(!"Op::is_neutral called?"); return false;}
! static bool is_absorbent(T x, LeftRight side) {assert(!"Op::is_absorbent called?"); return false;}
};
***************
*** 59,63 ****
template <class T> static void op_zip (int n, T *as, T *bs) {
if (!n) return;
! int ba=bs-as; // really!
#define FOO(I) as[I]=O::f(as[I],as[ba+I]);
UNROLL_8(FOO,n,as)
--- 59,63 ----
template <class T> static void op_zip (int n, T *as, T *bs) {
if (!n) return;
! ptrdiff_t ba=bs-as; // really!
#define FOO(I) as[I]=O::f(as[I],as[ba+I]);
UNROLL_8(FOO,n,as)
***************
*** 67,71 ****
template <class T> static void op_zip2 (int n, T *as, T *bs, T *cs) {
if (!n) return;
! int ba=bs-as, ca=cs-as;
#define FOO(I) as[ca+I]=O::f(as[I],as[ba+I]);
UNROLL_8(FOO,n,as)
--- 67,71 ----
template <class T> static void op_zip2 (int n, T *as, T *bs, T *cs) {
if (!n) return;
! ptrdiff_t ba=bs-as, ca=cs-as;
#define FOO(I) as[ca+I]=O::f(as[I],as[ba+I]);
UNROLL_8(FOO,n,as)
***************
*** 137,175 ****
// classic two-input operator
! #define DEF_OP(op,expr,neutral,absorbent) \
template <class T> class Y##op : Op<T> { public: \
inline static T f(T a, T b) { return expr; } \
! inline static bool is_neutral (T x, LeftRight side) { return neutral; } \
! inline static bool is_absorbent(T x, LeftRight side) { return absorbent; } };
! #define DEF_OPFT(op,expr,neutral,absorbent,T) \
template <> class Y##op<T> : Op<T> { public: \
inline static T f(T a, T b) { return expr; } \
! inline static bool is_neutral (T x, LeftRight side) { return neutral; } \
! inline static bool is_absorbent(T x, LeftRight side) { return absorbent; } }; \
// this macro is for operators that have different code for the float version
! #define DEF_OPF(op,expr,expr2,neutral,absorbent) \
! DEF_OP( op,expr, neutral,absorbent) \
! DEF_OPFT(op,expr2,neutral,absorbent,float32) \
! DEF_OPFT(op,expr2,neutral,absorbent,float64)
#define DECL_OPON(base,op,T) NumopOn<T>( \
&base<Y##op<T> >::op_map, &base<Y##op<T> >::op_zip, \
&base<Y##op<T> >::op_fold, &base<Y##op<T> >::op_scan, \
! &Y##op<T>::is_neutral, &Y##op<T>::is_absorbent)
#define DECL_OPON_NOFOLD(base,op,T) NumopOn<T>( \
&base<Y##op<T> >::op_map, &base<Y##op<T> >::op_zip, 0,0, \
! &Y##op<T>::is_neutral, &Y##op<T>::is_absorbent)
#define DECL_OP(op,sym,flags) Numop(0, sym, \
DECL_OPON(OpLoops,op,uint8), DECL_OPON(OpLoops,op,int16), \
DECL_OPON(OpLoops,op,int32) NONLITE(, DECL_OPON(OpLoops,op,int64), \
! DECL_OPON(OpLoops,op,float32), DECL_OPON(OpLoops,op,float64)), flags)
#define DECL_OP_NOFLOAT(op,sym,flags) Numop(0, sym, \
DECL_OPON(OpLoops,op,uint8), DECL_OPON(OpLoops,op,int16), \
DECL_OPON(OpLoops,op,int32) NONLITE(, DECL_OPON(OpLoops,op,int64), \
! NumopOn<float32>(0,0,0,0,0,0), NumopOn<float64>(0,0,0,0,0,0)), flags)
#define DECL_OP_NOFOLD(op,sym,flags) Numop(0, sym, \
DECL_OPON_NOFOLD(OpLoops,op,uint8), DECL_OPON_NOFOLD(OpLoops,op,int16), \
DECL_OPON_NOFOLD(OpLoops,op,int32) NONLITE(, DECL_OPON_NOFOLD(OpLoops,op,int64), \
! DECL_OPON_NOFOLD(OpLoops,op,float32), DECL_OPON_NOFOLD(OpLoops,op,float64)), flags)
template <class T> static inline T gf_floor (T a) {
--- 137,180 ----
// classic two-input operator
! #define DEF_OP(op,expr,neu,isneu,isorb) \
template <class T> class Y##op : Op<T> { public: \
inline static T f(T a, T b) { return expr; } \
! inline static T neutral (LeftRight side) {return neu;} \
! inline static bool is_neutral (T x, LeftRight side) {return isneu;} \
! inline static bool is_absorbent(T x, LeftRight side) {return isorb;}};
! #define DEF_OPFT(op,expr,neu,isneu,isorb,T) \
template <> class Y##op<T> : Op<T> { public: \
inline static T f(T a, T b) { return expr; } \
! inline static T neutral (LeftRight side) {return neu;} \
! inline static bool is_neutral (T x, LeftRight side) {return isneu;} \
! inline static bool is_absorbent(T x, LeftRight side) {return isorb;}};
// this macro is for operators that have different code for the float version
! #define DEF_OPF(op,expr,expr2,neu,isneu,isorb) \
! DEF_OP( op,expr, neu,isneu,isorb) \
! DEF_OPFT(op,expr2,neu,isneu,isorb,float32) \
! DEF_OPFT(op,expr2,neu,isneu,isorb,float64)
#define DECL_OPON(base,op,T) NumopOn<T>( \
&base<Y##op<T> >::op_map, &base<Y##op<T> >::op_zip, \
&base<Y##op<T> >::op_fold, &base<Y##op<T> >::op_scan, \
! &Y##op<T>::neutral, &Y##op<T>::is_neutral, &Y##op<T>::is_absorbent)
#define DECL_OPON_NOFOLD(base,op,T) NumopOn<T>( \
&base<Y##op<T> >::op_map, &base<Y##op<T> >::op_zip, 0,0, \
! &Y##op<T>::neutral, &Y##op<T>::is_neutral, &Y##op<T>::is_absorbent)
#define DECL_OP(op,sym,flags) Numop(0, sym, \
DECL_OPON(OpLoops,op,uint8), DECL_OPON(OpLoops,op,int16), \
DECL_OPON(OpLoops,op,int32) NONLITE(, DECL_OPON(OpLoops,op,int64), \
! DECL_OPON(OpLoops,op,float32), DECL_OPON(OpLoops,op,float64), \
! DECL_OPON(OpLoops,op,ruby)), flags)
#define DECL_OP_NOFLOAT(op,sym,flags) Numop(0, sym, \
DECL_OPON(OpLoops,op,uint8), DECL_OPON(OpLoops,op,int16), \
DECL_OPON(OpLoops,op,int32) NONLITE(, DECL_OPON(OpLoops,op,int64), \
! NumopOn<float32>(0,0,0,0,0,0,0), NumopOn<float64>(0,0,0,0,0,0,0), \
! DECL_OPON(OpLoops,op,ruby)), flags)
#define DECL_OP_NOFOLD(op,sym,flags) Numop(0, sym, \
DECL_OPON_NOFOLD(OpLoops,op,uint8), DECL_OPON_NOFOLD(OpLoops,op,int16), \
DECL_OPON_NOFOLD(OpLoops,op,int32) NONLITE(, DECL_OPON_NOFOLD(OpLoops,op,int64), \
! DECL_OPON_NOFOLD(OpLoops,op,float32), DECL_OPON_NOFOLD(OpLoops,op,float64), \
! DECL_OPON_NOFOLD(OpLoops,op,ruby)), flags)
template <class T> static inline T gf_floor (T a) {
***************
*** 178,253 ****
return (T) floor(abs((double)a)) * (a<0?-1:1); }
! /*
! uint8 clipadd(uint8 a, uint8 b) { int32 c=a+b; return c<0?0:c>255?255:c; }
! int16 clipadd(int16 a, int16 b) { int32 c=a+b; return c<-0x8000?-0x8000:c>0x7fff?0x7fff:c; }
! int32 clipadd(int32 a, int32 b) { int64 c=a+b; return c<-0x80000000?-0x80000000:c>0x7fffffff?0x7fffffff:c; }
! int64 clipadd(int64 a, int64 b) { int64 c=(a>>1)+(b>>1)+(a&b&1);
! return c<(nt_smallest(0LL)/2?nt_smallest(0LL):c>nt_greatest(0LL)/2?nt_greatest(0LL):a+b; }
! uint8 clipsub(uint8 a, uint8 b) { int32 c=a-b; return c<0?0:c>255?255:c; }
! int16 clipsub(int16 a, int16 b) { int32 c=a-b; return c<-0x8000?-0x8000:c>0x7fff?0x7fff:c; }
! int32 clipsub(int32 a, int32 b) { int64 c=a-b; return c<-0x80000000?-0x80000000:c>0x7fffffff?0x7fffffff:c; }
! int64 clipsub(int64 a, int64 b) { int64 c=(a>>1)-(b>>1); //???
! return c<(nt_smallest(0LL)/2?nt_smallest(0LL):c>nt_greatest(0LL)/2?nt_greatest(0LL):a-b; }
! */
#ifdef PASS1
! DEF_OP(ignore, a, side==at_right, side==at_left)
! DEF_OP(put, b, side==at_left, side==at_right)
! DEF_OP(add, a+b, x==0, false)
! DEF_OP(sub, a-b, side==at_right && x==0, false)
! DEF_OP(bus, b-a, side==at_left && x==0, false)
! DEF_OP(mul, a*b, x==1, x==0)
! DEF_OP(mulshr8, ((int32)a*(int32)b)>>8, (int64)x==256, x==0) //!@#$ bug with int64
! DEF_OP(div, b==0 ? 0 : a/b, side==at_right && x==1, false)
! DEF_OP(div2, b==0 ? 0 : div2(a,b), side==at_right && x==1, false)
! DEF_OP(vid, a==0 ? 0 : b/a, side==at_left && x==1, false)
! DEF_OP(vid2, a==0 ? 0 : div2(b,a), side==at_left && x==1, false)
! DEF_OPF(mod, b==0 ? 0 : mod(a,b), b==0 ? 0 : a-b*gf_floor(a/b),
! false, side==at_left && x==0 || side==at_right && x==1)
! DEF_OPF(dom, a==0 ? 0 : mod(b,a), a==0 ? 0 : b-a*gf_floor(b/a),
! false, side==at_left && x==0 || side==at_right && x==1)
//DEF_OPF(rem, b==0 ? 0 : a%b, b==0 ? 0 : a-b*gf_trunc(a/b))
//DEF_OPF(mer, a==0 ? 0 : b%a, a==0 ? 0 : b-a*gf_trunc(b/a))
! DEF_OP(rem, b==0?0:a%b, false, side==at_left&&x==0 || side==at_right&&x==1)
! DEF_OP(mer, a==0?0:b%a, false, side==at_left&&x==0 || side==at_right&&x==1)
#endif
#ifdef PASS2
! DEF_OP(gcd, gcd(a,b), x==0, x==1)
! DEF_OP(gcd2, gcd2(a,b), x==0, x==1) // should test those and pick one of the two
! DEF_OP(lcm, a==0 || b==0 ? 0 : lcm(a,b), x==1, x==0)
! DEF_OPF(or , a|b, (float32)((int32)a | (int32)b), x==0, x==nt_all_ones(&x))
! DEF_OPF(xor, a^b, (float32)((int32)a ^ (int32)b), x==0, false)
! DEF_OPF(and, a&b, (float32)((int32)a & (int32)b), x==nt_all_ones(&x), x==0)
! DEF_OPF(shl, a<<b, a*pow(2.0,+b), side==at_right && x==0, false)
! DEF_OPF(shr, a>>b, a*pow(2.0,-b), side==at_right && x==0, false)
! DEF_OP(sc_and, a ? b : a, side==at_left && x!=0, side==at_left && x==0)
! DEF_OP(sc_or, a ? a : b, side==at_left && x==0, side==at_left && x!=0)
! DEF_OP(min, min(a,b), x==nt_greatest(&x), x==nt_smallest(&x))
! DEF_OP(max, max(a,b), x==nt_smallest(&x), x==nt_greatest(&x))
#endif
#ifdef PASS3
! DEF_OP(cmp, cmp(a,b), false, false)
! DEF_OP(eq, a == b, false, false)
! DEF_OP(ne, a != b, false, false)
! DEF_OP(gt, a > b, false, side==at_left&&x==nt_smallest(&x)||side==at_right&&x==nt_greatest(&x))
! DEF_OP(le, a <= b, false, side==at_left&&x==nt_smallest(&x)||side==at_right&&x==nt_greatest(&x))
! DEF_OP(lt, a < b, false, side==at_left&&x==nt_greatest(&x)||side==at_right&&x==nt_smallest(&x))
! DEF_OP(ge, a >= b, false, side==at_left&&x==nt_greatest(&x)||side==at_right&&x==nt_smallest(&x))
! DEF_OP(sin, (T)(b * sin(a * (M_PI / 18000))), false, false) // "LN=9000+36000n RA=0 LA=..."
! DEF_OP(cos, (T)(b * cos(a * (M_PI / 18000))), false, false) // "LN=36000n RA=0 LA=..."
! DEF_OP(atan, (T)(atan2(a,b) * (18000 / M_PI)), false, false) // "LA=0"
! DEF_OP(tanh, (T)(b * tanh(a * (M_PI / 18000))), false, x==0)
! DEF_OP(gamma, b<=0 ? 0 : (T)(0+floor(pow(a/256.0,256.0/b)*256.0)), false, false) // "RN=256"
! DEF_OP(pow, ipow(a,b), false, false) // "RN=1"
! DEF_OP(log, (T)(a==0 ? 0 : b * log(gf_abs(a))), false, false) // "RA=0"
! // 0.7.8
! //DEF_OPF(clipadd, clipadd(a,b), a+b, x==0, false)
! //DEF_OPF(clipsub, clipsub(a,b), a-b, side==at_right && x==0, false)
! DEF_OP(abssub, gf_abs(a-b), false, false)
! DEF_OP(sqsub, (a-b)*(a-b), false, false)
! DEF_OP(avg, (a+b)/2, false, false)
! DEF_OP(hypot, (T)(0+floor(sqrt(a*a+b*b))), false, false)
! DEF_OP(sqrt, (T)(0+floor(sqrt(a))), false, false)
! DEF_OP(rand, a==0 ? 0 : random()%(int32)a, false, false)
//DEF_OP(erf,"erf*", 0)
#endif
--- 183,247 ----
return (T) floor(abs((double)a)) * (a<0?-1:1); }
! // trying to avoid GCC warning about uint8 too small for ==256
! template <class T> static bool equal256 (T x) {return x==256;}
! template <> static bool equal256 (uint8 x) {return false;}
#ifdef PASS1
! DEF_OP(ignore, a, 0, side==at_right, side==at_left)
! DEF_OP(put, b, 0, side==at_left, side==at_right)
! DEF_OP(add, a+b, 0, x==0, false)
! DEF_OP(sub, a-b, 0, side==at_right && x==0, false)
! DEF_OP(bus, b-a, 0, side==at_left && x==0, false)
! DEF_OP(mul, a*b, 1, x==1, x==0)
! DEF_OP(mulshr8, (a*b)>>8, 256, equal256(x), x==0)
! DEF_OP(div, b==0 ? (T)0 : a/b , 1, side==at_right && x==1, false)
! DEF_OP(div2, b==0 ? 0 : div2(a,b), 1, side==at_right && x==1, false)
! DEF_OP(vid, a==0 ? (T)0 : b/a , 1, side==at_left && x==1, false)
! DEF_OP(vid2, a==0 ? 0 : div2(b,a), 1, side==at_left && x==1, false)
! DEF_OPF(mod, b==0 ? 0 : mod(a,b), b==0 ? 0 : a-b*gf_floor(a/b), 0, false, side==at_left && x==0 || side==at_right && x==1)
! DEF_OPF(dom, a==0 ? 0 : mod(b,a), a==0 ? 0 : b-a*gf_floor(b/a), 0, false, side==at_left && x==0 || side==at_right && x==1)
//DEF_OPF(rem, b==0 ? 0 : a%b, b==0 ? 0 : a-b*gf_trunc(a/b))
//DEF_OPF(mer, a==0 ? 0 : b%a, a==0 ? 0 : b-a*gf_trunc(b/a))
! DEF_OP(rem, b==0?(T)0:a%b, 0, false, side==at_left&&x==0 || side==at_right&&x==1)
! DEF_OP(mer, a==0?(T)0:b%a, 0, false, side==at_left&&x==0 || side==at_right&&x==1)
#endif
#ifdef PASS2
! DEF_OP(gcd, gcd(a,b), 0, x==0, x==1)
! DEF_OP(gcd2, gcd2(a,b), 0, x==0, x==1) // should test those and pick one of the two
! DEF_OP(lcm, a==0 || b==0 ? (T)0 : lcm(a,b), 1, x==1, x==0)
! DEF_OPF(or , a|b, (float32)((int32)a | (int32)b), 0, x==0, x==nt_all_ones(&x))
! DEF_OPF(xor, a^b, (float32)((int32)a ^ (int32)b), 0, x==0, false)
! DEF_OPF(and, a&b, (float32)((int32)a & (int32)b), -1 /*nt_all_ones((T*)0)*/, x==nt_all_ones(&x), x==0)
! DEF_OPF(shl, a<<b, a*pow(2.0,+b), 0, side==at_right && x==0, false)
! DEF_OPF(shr, a>>b, a*pow(2.0,-b), 0, side==at_right && x==0, false)
! DEF_OP(sc_and, a ? b : a, 1, side==at_left && x!=0, side==at_left && x==0)
! DEF_OP(sc_or, a ? a : b, 0, side==at_left && x==0, side==at_left && x!=0)
! DEF_OP(min, min(a,b), nt_greatest((T*)0), x==nt_greatest(&x), x==nt_smallest(&x))
! DEF_OP(max, max(a,b), nt_smallest((T*)0), x==nt_smallest(&x), x==nt_greatest(&x))
! DEF_OP(cmp, cmp(a,b), 0, false, false)
! DEF_OP(eq, a == b, 0, false, false)
! DEF_OP(ne, a != b, 0, false, false)
! DEF_OP(gt, a > b, 0, false, side==at_left&&x==nt_smallest(&x)||side==at_right&&x==nt_greatest(&x))
! DEF_OP(le, a <= b, 0, false, side==at_left&&x==nt_smallest(&x)||side==at_right&&x==nt_greatest(&x))
! DEF_OP(lt, a < b, 0, false, side==at_left&&x==nt_greatest(&x)||side==at_right&&x==nt_smallest(&x))
! DEF_OP(ge, a >= b, 0, false, side==at_left&&x==nt_greatest(&x)||side==at_right&&x==nt_smallest(&x))
#endif
#ifdef PASS3
! DEF_OP(sin, (T)((float64)b * sin((float64)a * (M_PI / 18000))), 0, false, false) // "LN=9000+36000n RA=0 LA=..."
! DEF_OP(cos, (T)((float64)b * cos((float64)a * (M_PI / 18000))), 0, false, false) // "LN=36000n RA=0 LA=..."
! DEF_OP(atan, (T)(atan2(a,b) * (18000 / M_PI)), 0, false, false) // "LA=0"
! DEF_OP(tanh, (T)((float64)b * tanh((float64)a * (M_PI / 18000))), 0, false, x==0)
! DEF_OP(gamma, b<=0 ? (T)0 : (T)(0+floor(pow((float64)a/256.0,256.0/(float64)b)*256.0)), 0, false, false) // "RN=256"
! DEF_OP(pow, ipow(a,b), 0, false, false) // "RN=1"
! DEF_OP(log, (T)(a==0 ? (T)0 : (T)((float64)b * log((float64)gf_abs(a)))), 0, false, false) // "RA=0"
! // 0.8
! DEF_OPF(clipadd, clipadd(a,b), a+b, 0, x==0, false)
! DEF_OPF(clipsub, clipsub(a,b), a-b, 0, side==at_right && x==0, false)
! DEF_OP(abssub, gf_abs(a-b), 0, false, false)
! DEF_OP(sqsub, (a-b)*(a-b), 0, false, false)
! DEF_OP(avg, (a+b)/2, 0, false, false)
! DEF_OP(hypot, (T)(0+floor(sqrt(a*a+b*b))), 0, false, false)
! DEF_OP(sqrt, (T)(0+floor(sqrt(a))), 0, false, false)
! DEF_OP(rand, a==0 ? (T)0 : (T)(random()%(int32)a), 0, false, false)
//DEF_OP(erf,"erf*", 0)
#endif
***************
*** 290,307 ****
DECL_OP(min, "min", OP_ASSOC|OP_COMM),
DECL_OP(max, "max", OP_ASSOC|OP_COMM),
};
const long op_table2_n = COUNT(op_table2);
#endif
#ifdef PASS3
Numop op_table3[] = {
! DECL_OP_NOFOLD(eq, "==", OP_COMM),
! DECL_OP_NOFOLD(ne, "!=", OP_COMM),
! DECL_OP_NOFOLD(gt, ">", 0),
! DECL_OP_NOFOLD(le, "<=", 0),
! DECL_OP_NOFOLD(lt, "<", 0),
! DECL_OP_NOFOLD(ge, ">=", 0),
! DECL_OP_NOFOLD(cmp, "cmp", 0),
! DECL_OP_NOFOLD(sin, "sin*", 0),
! DECL_OP_NOFOLD(cos, "cos*", 0),
DECL_OP_NOFOLD(atan, "atan", 0),
DECL_OP_NOFOLD(tanh, "tanh*", 0),
--- 284,316 ----
DECL_OP(min, "min", OP_ASSOC|OP_COMM),
DECL_OP(max, "max", OP_ASSOC|OP_COMM),
+ DECL_OP_NOFOLD(eq, "==", OP_COMM),
+ DECL_OP_NOFOLD(ne, "!=", OP_COMM),
+ DECL_OP_NOFOLD(gt, ">", 0),
+ DECL_OP_NOFOLD(le, "<=", 0),
+ DECL_OP_NOFOLD(lt, "<", 0),
+ DECL_OP_NOFOLD(ge, ">=", 0),
+ DECL_OP_NOFOLD(cmp, "cmp", 0),
};
const long op_table2_n = COUNT(op_table2);
#endif
#ifdef PASS3
+ uint8 clipadd(uint8 a, uint8 b) { int32 c=a+b; return c<0?0:c>255?255:c; }
+ int16 clipadd(int16 a, int16 b) { int32 c=a+b; return c<-0x8000?-0x8000:c>0x7fff?0x7fff:c; }
+ int32 clipadd(int32 a, int32 b) { int64 c=a+b; return c<-0x80000000?-0x80000000:c>0x7fffffff?0x7fffffff:c; }
+ int64 clipadd(int64 a, int64 b) { int64 c=(a>>1)+(b>>1)+(a&b&1), p=nt_smallest((int64 *)0), q=nt_greatest((int64 *)0);
+ return c<p/2?p:c>q/2?q:a+b; }
+ uint8 clipsub(uint8 a, uint8 b) { int32 c=a-b; return c<0?0:c>255?255:c; }
+ int16 clipsub(int16 a, int16 b) { int32 c=a-b; return c<-0x8000?-0x8000:c>0x7fff?0x7fff:c; }
+ int32 clipsub(int32 a, int32 b) { int64 c=a-b; return c<-0x80000000?-0x80000000:c>0x7fffffff?0x7fffffff:c; }
+ int64 clipsub(int64 a, int64 b) { int64 c=(a>>1)-(b>>1); //???
+ int64 p=nt_smallest((int64 *)0), q=nt_greatest((int64 *)0);
+ return c<p/2?p:c>q/2?q:a-b; }
+
+ ruby clipadd(ruby a, ruby b) { return a+b; }
+ ruby clipsub(ruby a, ruby b) { return a-b; }
+
Numop op_table3[] = {
! DECL_OP_NOFOLD(sin, "sin*", 0),
! DECL_OP_NOFOLD(cos, "cos*", 0),
DECL_OP_NOFOLD(atan, "atan", 0),
DECL_OP_NOFOLD(tanh, "tanh*", 0),
***************
*** 309,315 ****
DECL_OP_NOFOLD(pow, "**", 0),
DECL_OP_NOFOLD(log, "log*", 0),
! // 0.7.8
! // DECL_OP(clipadd,"clip+", OP_ASSOC|OP_COMM),
! // DECL_OP(clipsub,"clip-", 0),
DECL_OP_NOFOLD(abssub,"abs-", OP_COMM),
DECL_OP_NOFOLD(sqsub,"sq-", OP_COMM),
--- 318,324 ----
DECL_OP_NOFOLD(pow, "**", 0),
DECL_OP_NOFOLD(log, "log*", 0),
! // 0.8
! DECL_OP(clipadd,"clip+", OP_ASSOC|OP_COMM),
! DECL_OP(clipsub,"clip-", 0),
DECL_OP_NOFOLD(abssub,"abs-", OP_COMM),
DECL_OP_NOFOLD(sqsub,"sq-", OP_COMM),
Index: flow_objects_for_image.c
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/base/flow_objects_for_image.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** flow_objects_for_image.c 4 Oct 2005 02:02:13 -0000 1.1
--- flow_objects_for_image.c 15 Mar 2006 04:37:08 -0000 1.2
***************
*** 3,7 ****
GridFlow
! Copyright (c) 2001,2002,2003 by Mathieu Bouchard
This program is free software; you can redistribute it and/or
--- 3,7 ----
GridFlow
! Copyright (c) 2001,2002,2003,2004,2005 by Mathieu Bouchard
This program is free software; you can redistribute it and/or
***************
*** 208,212 ****
#define LOOP(z) \
for (int i=0; i<rowsize; i+=z) \
! for (int k=0; k<scalex; k++, p+=3)
switch (chans) {
case 3: LOOP(3) {Z(0);Z(1);Z(2);} break;
--- 208,212 ----
#define LOOP(z) \
for (int i=0; i<rowsize; i+=z) \
! for (int k=0; k<scalex; k++, p+=z)
switch (chans) {
case 3: LOOP(3) {Z(0);Z(1);Z(2);} break;
***************
*** 478,481 ****
--- 478,482 ----
} GRID_END
+
GRID_INPUT(DrawPolygon,1,color) {} GRID_END
GRID_INPUT(DrawPolygon,2,polygon) {init_lines();} GRID_END
Index: flow_objects.c
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/base/flow_objects.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** flow_objects.c 4 Oct 2005 02:02:13 -0000 1.1
--- flow_objects.c 15 Mar 2006 04:37:08 -0000 1.2
***************
*** 3,7 ****
GridFlow
! Copyright (c) 2001,2002,2003,2004 by Mathieu Bouchard
This program is free software; you can redistribute it and/or
--- 3,7 ----
GridFlow
! Copyright (c) 2001,2002,2003,2004,2005 by Mathieu Bouchard
This program is free software; you can redistribute it and/or
***************
*** 159,162 ****
--- 159,163 ----
static Ruby INTORFLOAT2NUM(float32 value) {return rb_float_new(value);}
static Ruby INTORFLOAT2NUM(float64 value) {return rb_float_new(value);}
+ static Ruby INTORFLOAT2NUM(ruby value) {return value.r;}
GRID_INLET(GridExport,0) {
***************
*** 214,220 ****
PtrGrid put_at; // can't be //\attr
\attr Numop *op;
! int32 wdex [Dim::MAX_DIMENSIONS]; // temporary buffer, copy of put_at
! int32 fromb[Dim::MAX_DIMENSIONS];
! int32 to2 [Dim::MAX_DIMENSIONS];
int lsd; // lsd = Last Same Dimension (for put_at)
int d; // goes with wdex
--- 215,221 ----
PtrGrid put_at; // can't be //\attr
\attr Numop *op;
! int32 wdex [Dim::MAX_DIM]; // temporary buffer, copy of put_at
! int32 fromb[Dim::MAX_DIM];
! int32 to2 [Dim::MAX_DIM];
int lsd; // lsd = Last Same Dimension (for put_at)
int d; // goes with wdex
***************
*** 259,263 ****
int nb = r->dim->n;
int nc = in->dim->get(na-1);
! STACK_ARRAY(int32,v,Dim::MAX_DIMENSIONS);
if (na<1) RAISE("must have at least 1 dimension.",na,1,1+nb);
int lastindexable = r->dim->prod()/r->dim->prod(nc) - 1;
--- 260,264 ----
int nb = r->dim->n;
int nc = in->dim->get(na-1);
! STACK_ARRAY(int32,v,Dim::MAX_DIM);
if (na<1) RAISE("must have at least 1 dimension.",na,1,1+nb);
int lastindexable = r->dim->prod()/r->dim->prod(nc) - 1;
***************
*** 414,417 ****
--- 415,420 ----
out=new GridOutlet(this,0,in->dim,in->nt);
in->set_mode(6);
+ } GRID_ALLOC {
+ //out->ask(in->allocn,(Pt<T> &)in->alloc,in->allocfactor,in->allocmin,in->allocmax);
} GRID_FLOW {
Pt<T> rdata = (Pt<T>)*r;
***************
*** 788,792 ****
RAISE("dimension mismatch");
#define FOO(T) trigger((T)0);
! TYPESWITCH_NOFLOAT(from->nt,FOO,);
#undef FOO
}
--- 791,795 ----
RAISE("dimension mismatch");
#define FOO(T) trigger((T)0);
! TYPESWITCH_JUSTINT(from->nt,FOO,);
#undef FOO
}
***************
*** 1049,1053 ****
STACK_ARRAY(T,res,na*nb*nc*nd);
if (dim1==dim2) { out->send(n,data); return; }
! for (; n; n-=na*nb*nc*nd, data+=na*nb*nc*nd) {
for (int a=0; a<na; a++)
for (int b=0; b<nb; b++)
--- 1052,1057 ----
STACK_ARRAY(T,res,na*nb*nc*nd);
if (dim1==dim2) { out->send(n,data); return; }
! int prod = na*nb*nc*nd;
! for (; n; n-=prod, data+=prod) {
for (int a=0; a<na; a++)
for (int b=0; b<nb; b++)
***************
*** 1108,1113 ****
//****************************************************************
! \class GridCentroid2 < GridObject
! struct GridCentroid2 : GridObject {
\decl void initialize ();
\grin 0 int
--- 1112,1117 ----
//****************************************************************
! \class GridCentroid < GridObject
! struct GridCentroid : GridObject {
\decl void initialize ();
\grin 0 int
***************
*** 1115,1119 ****
};
! GRID_INLET(GridCentroid2,0) {
if (in->dim->n != 3) RAISE("expecting 3 dims");
if (in->dim->v[2] != 1) RAISE("expecting 1 channel");
--- 1119,1123 ----
};
! GRID_INLET(GridCentroid,0) {
if (in->dim->n != 3) RAISE("expecting 3 dims");
if (in->dim->v[2] != 1) RAISE("expecting 1 channel");
***************
*** 1138,1141 ****
--- 1142,1147 ----
blah[1] = sum ? sumx/sum : 0;
out->send(2,blah);
+ rb_funcall(rself,SI(send_out),2,INT2NUM(1),INT2NUM(blah[0]));
+ rb_funcall(rself,SI(send_out),2,INT2NUM(2),INT2NUM(blah[1]));
} GRID_END
***************
*** 1144,1149 ****
}
! \classinfo { IEVAL(rself,"install '#centroid2',1,1"); }
! \end class GridCentroid2
//****************************************************************
--- 1150,1155 ----
}
! \classinfo { IEVAL(rself,"install '#centroid',1,3"); }
! \end class GridCentroid
//****************************************************************
Index: bitpacking.c
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/base/bitpacking.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** bitpacking.c 4 Oct 2005 02:02:13 -0000 1.1
--- bitpacking.c 15 Mar 2006 04:37:06 -0000 1.2
***************
*** 27,42 ****
#include <stdio.h>
#define CONVERT1 t = \
! (((in[0] << hb[0]) >> 7) & mask[0]) | \
! (((in[1] << hb[1]) >> 7) & mask[1]) | \
! (((in[2] << hb[2]) >> 7) & mask[2])
#define CONVERT2 \
! for (t=0,i=0; i<self->size; i++) t |= (((in[i] << hb[i]) >> 7) & mask[i]);
#define CONVERT3 \
! for (t=0,i=0; i<self->size; i++) { \
! t |= ((in[i]>>(7-hb[i]))|(in[i]<<(hb[i]-7))) & mask[i]; \
! }
#define WRITE_LE \
--- 27,42 ----
#include <stdio.h>
+ //#define CONVERT0(z) (((in[z] << hb[z]) >> 7) & mask[z])
+ #define CONVERT0(z) ((in[z] >> chop[z]) << slide[z])
+
#define CONVERT1 t = \
! CONVERT0(0) | CONVERT0(1) | CONVERT0(2)
#define CONVERT2 \
! for (t=0,i=0; i<self->size; i++) t |= CONVERT0(i);
#define CONVERT3 \
! for (t=0,i=0; i<self->size; i++) \
! t |= (((unsigned)in[i]>>(7-hb[i]))|(in[i]<<(hb[i]-7))) & mask[i];
#define WRITE_LE \
***************
*** 75,90 ****
uint32 t;
int i;
- int hb[4];
- uint32 mask[4];
int sameorder = self->endian==2 || self->endian==::is_le();
int size = self->size;
!
! for (i=0; i<self->size; i++) hb[i] = highest_bit(self->mask[i]);
! memcpy(mask,self->mask,size*sizeof(uint32));
!
if (sameorder && size==3) {
switch(self->bytes) {
! case 2: NTIMES(t=CONVERT1; *((int16 *)out)=t; out+=2; in+=3;) return;
! case 4: NTIMES(t=CONVERT1; *((int32 *)out)=t; out+=4; in+=3;) return;
}
}
--- 75,90 ----
uint32 t;
int i;
int sameorder = self->endian==2 || self->endian==::is_le();
int size = self->size;
! uint32 mask[4]; memcpy(mask,self->mask,size*sizeof(uint32));
! uint32 hb[4]; for (i=0; i<size; i++) hb[i] = highest_bit(mask[i]);
! uint32 span[4]; for (i=0; i<size; i++) span[i] = hb[i] - lowest_bit(mask[i]);
! uint32 chop[4]; for (i=0; i<size; i++) chop[i] = 7-span[i];
! uint32 slide[4]; for (i=0; i<size; i++) slide[i] = hb[i]-span[i];
!
if (sameorder && size==3) {
switch(self->bytes) {
! case 2: NTIMES(CONVERT1; *((int16 *)out)=t; out+=2; in+=3;) return;
! case 4: NTIMES(CONVERT1; *((int32 *)out)=t; out+=4; in+=3;) return;
}
}
***************
*** 92,101 ****
switch (size) {
case 3: for (; n--; in+=3) {CONVERT1; WRITE_LE;} break;
! case 4: for (; n--; in+=4) {CONVERT3; WRITE_LE;} break;
default:for (; n--; in+=size) {CONVERT2; WRITE_LE;}}
} else {
switch (size) {
case 3: for (; n--; in+=3) {CONVERT1; WRITE_BE;} break;
! case 4: for (; n--; in+=4) {CONVERT3; WRITE_BE;} break;
default:for (; n--; in+=size) {CONVERT2; WRITE_BE;}}
}
--- 92,101 ----
switch (size) {
case 3: for (; n--; in+=3) {CONVERT1; WRITE_LE;} break;
! case 4: for (; n--; in+=4) {CONVERT1; WRITE_LE;} break;
default:for (; n--; in+=size) {CONVERT2; WRITE_LE;}}
} else {
switch (size) {
case 3: for (; n--; in+=3) {CONVERT1; WRITE_BE;} break;
! case 4: for (; n--; in+=4) {CONVERT1; WRITE_BE;} break;
default:for (; n--; in+=size) {CONVERT2; WRITE_BE;}}
}
***************
*** 133,138 ****
const int hb[3] = {15,10,4};
const uint32 mask[3] = {0x0000f800,0x000007e0,0x0000001f};
uint32 t;
! NTIMES( t=CONVERT1; *((short *)out)=t; out+=2; in+=3; )
}
--- 133,141 ----
const int hb[3] = {15,10,4};
const uint32 mask[3] = {0x0000f800,0x000007e0,0x0000001f};
+ uint32 span[3] = {4,5,4};
+ uint32 chop[3] = {3,2,3};
+ uint32 slide[3] = {11,5,0};
uint32 t;
! NTIMES(CONVERT1; *((short *)out)=t; out+=2; in+=3;)
}
***************
*** 188,192 ****
}
! /* (R,G,B,?) -> B:8,G:8,R:8,0:8 */
template <class T>
static void pack3_bgrn8888(BitPacking *self, int n, Pt<T> in, Pt<uint8> out) {
--- 191,196 ----
}
! // (R,G,B,?) -> B:8,G:8,R:8,0:8
! // fishy
template <class T>
static void pack3_bgrn8888(BitPacking *self, int n, Pt<T> in, Pt<uint8> out) {
Index: grid.h
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/base/grid.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** grid.h 4 Oct 2005 02:02:13 -0000 1.1
--- grid.h 15 Mar 2006 04:37:08 -0000 1.2
***************
*** 3,7 ****
GridFlow
! Copyright (c) 2001,2002,2003,2004 by Mathieu Bouchard
This program is free software; you can redistribute it and/or
--- 3,7 ----
GridFlow
! Copyright (c) 2001,2002,2003,2004,2005 by Mathieu Bouchard
This program is free software; you can redistribute it and/or
***************
*** 26,30 ****
// current version number as string literal
! #define GF_VERSION "0.8.0"
#define GF_COMPILE_TIME __DATE__ ", " __TIME__
--- 26,30 ----
// current version number as string literal
! #define GF_VERSION "0.8.1"
#define GF_COMPILE_TIME __DATE__ ", " __TIME__
***************
*** 37,40 ****
--- 37,46 ----
#include <math.h>
+ #ifdef __APPLE__
+ static inline void *memalign (size_t a, size_t n) {return malloc(n);}
+ #else
+ #include <malloc.h>
+ #endif
+
extern "C" {
#include <ruby.h>
***************
*** 59,67 ****
#define BUG(s,args...) {fprintf(stderr,s "\nat: %s\n",args,__PRETTY_FUNCTION__); ::raise(11);}
!
! // !@#$ what am I going to do about this? should this be changed?
! // should I wrap all of the Ruby API for C++-style convenience?
! typedef VALUE Ruby;
! // typedef struct Ruby { VALUE x };
#ifdef IS_BRIDGE
--- 65,69 ----
#define BUG(s,args...) {fprintf(stderr,s "\nat: %s\n",args,__PRETTY_FUNCTION__); ::raise(11);}
! #define L gfpost("%s:%d in %s",__FILE__,__LINE__,__PRETTY_FUNCTION__);
#ifdef IS_BRIDGE
***************
*** 77,80 ****
--- 79,84 ----
#endif
+ typedef VALUE Ruby;
+
/* undocumented function from Ruby that is one thing we need to fix a very elusive bug
that manifests itself when embedding ruby inside a plugin of another app. This exists
***************
*** 87,91 ****
__attribute__ ((noreturn));
};
- #define L fprintf(stderr,"%s:%d in %s\n",__FILE__,__LINE__,__PRETTY_FUNCTION__);
#define SI(_sym_) (rb_intern(#_sym_))
#define SYM(_sym_) (ID2SYM(SI(_sym_)))
--- 91,94 ----
***************
*** 105,123 ****
static inline const char *rb_sym_name(Ruby sym) {return rb_id2name(SYM2ID(sym));}
#define rb_str_pt(s,t) Pt<t>((t*)rb_str_ptr(s),rb_str_len(s))
-
- // shorthands
#define IEVAL(_self_,s) rb_funcall(_self_,SI(instance_eval),1,rb_str_new2(s))
#define EVAL(s) rb_eval_string(s)
#define rassert(_p_) if (!(_p_)) RAISE(#_p_);
-
// because of older versions of Ruby (1.6.?)
#define rb_obj_class(o) rb_funcall((o),SI(class),0)
#define WATCH(n,ar) { \
! char foo[16*1024], *p=foo; \
! p += sprintf(p,"%s: ",#ar); \
for (int q=0; q<n; q++) p += sprintf(p,"%lld ",(long long)ar[q]); \
! gfpost("%s",foo); \
! }
// we're gonna override assert, so load it first, to avoid conflicts
--- 108,121 ----
static inline const char *rb_sym_name(Ruby sym) {return rb_id2name(SYM2ID(sym));}
#define rb_str_pt(s,t) Pt<t>((t*)rb_str_ptr(s),rb_str_len(s))
#define IEVAL(_self_,s) rb_funcall(_self_,SI(instance_eval),1,rb_str_new2(s))
#define EVAL(s) rb_eval_string(s)
#define rassert(_p_) if (!(_p_)) RAISE(#_p_);
// because of older versions of Ruby (1.6.?)
#define rb_obj_class(o) rb_funcall((o),SI(class),0)
#define WATCH(n,ar) { \
! char foo[16*1024], *p=foo; p += sprintf(p,"%s: ",#ar); \
for (int q=0; q<n; q++) p += sprintf(p,"%lld ",(long long)ar[q]); \
! gfpost("%s",foo);}
// we're gonna override assert, so load it first, to avoid conflicts
***************
*** 149,153 ****
static inline Ruby PTR2FIX (const void *ptr) {
long p = (long)ptr;
! if ((p&3)!=0) BUG("unaligned pointer: %08x\n",(long)(ptr));
return LONG2NUM(p>>2);
}
--- 147,151 ----
static inline Ruby PTR2FIX (const void *ptr) {
long p = (long)ptr;
! if ((p&3)!=0) BUG("unaligned pointer: %p\n",ptr);
return LONG2NUM(p>>2);
}
***************
*** 185,189 ****
template <class T> static inline T ipow(T a, T b) {
for(T r=1;;) {if (b&1) r*=a; b>>=1; if (!b) return r; a*=a;}
! }
// kludge
--- 183,187 ----
template <class T> static inline T ipow(T a, T b) {
for(T r=1;;) {if (b&1) r*=a; b>>=1; if (!b) return r; a*=a;}
! }
// kludge
***************
*** 197,201 ****
template <class T> static inline T max(T a, T b) { return a>b?a:b; }
//template <class T> inline T min(T a, T b) { T c = (a-b)>>31; return (a&c)|(b&~c); }
- //template <class T> inline T max(T a, T b) { T c = (a-b)>>31; return (a&c)|(b&~c); }
// greatest common divisor, by euclid's algorithm
--- 195,198 ----
***************
*** 222,231 ****
// returns the position (0..31) of highest bit set in a word, or 0 if none.
! #define FOO(N) if ((x>>N)&(((typeof(x))1<<N)-1)) { x>>=N; i+=N; }
! static int highest_bit(uint8 x) {int i=0; FOO(4)FOO(2)FOO(1)return i;}
! static int highest_bit(uint16 x) {int i=0; FOO(8)FOO(4)FOO(2)FOO(1)return i;}
! static int highest_bit(uint32 x) {int i=0; FOO(16)FOO(8)FOO(4)FOO(2)FOO(1)return i;}
! static int highest_bit(uint64 x) {int i=0;FOO(32)FOO(16)FOO(8)FOO(4)FOO(2)FOO(1)return i;}
! #undef FOO
// returns the position (0..31) of lowest bit set in a word, or 0 if none.
template <class T> static int lowest_bit(T n) { return highest_bit((~n+1)&n); }
--- 219,228 ----
// returns the position (0..31) of highest bit set in a word, or 0 if none.
! #define Z(N) if ((x>>N)&(((typeof(x))1<<N)-1)) { x>>=N; i+=N; }
! static int highest_bit(uint8 x) {int i=0; Z(4)Z(2)Z(1)return i;}
! static int highest_bit(uint16 x) {int i=0; Z(8)Z(4)Z(2)Z(1)return i;}
! static int highest_bit(uint32 x) {int i=0; Z(16)Z(8)Z(4)Z(2)Z(1)return i;}
! static int highest_bit(uint64 x) {int i=0;Z(32)Z(16)Z(8)Z(4)Z(2)Z(1)return i;}
! #undef Z
// returns the position (0..31) of lowest bit set in a word, or 0 if none.
template <class T> static int lowest_bit(T n) { return highest_bit((~n+1)&n); }
***************
*** 263,267 ****
#define EACH_FLOAT_TYPE(MACRO) MACRO(float32) MACRO(float64)
#endif
! #define EACH_NUMBER_TYPE(MACRO) EACH_INT_TYPE(MACRO) EACH_FLOAT_TYPE(MACRO)
// note: loop unrolling macros assume N!=0
--- 260,264 ----
#define EACH_FLOAT_TYPE(MACRO) MACRO(float32) MACRO(float64)
#endif
! #define EACH_NUMBER_TYPE(MACRO) EACH_INT_TYPE(MACRO) EACH_FLOAT_TYPE(MACRO) MACRO(ruby)
// note: loop unrolling macros assume N!=0
***************
*** 280,283 ****
--- 277,406 ----
//****************************************************************
+ // my own little Ruby <-> C++ layer
+
+ //struct Arg { Ruby a; };
+ //struct ArgList { int n; Pt<Arg> v; };
+ static inline bool INTEGER_P(Ruby x) {return FIXNUM_P(x)||TYPE(x)==T_BIGNUM;}
+ static inline bool FLOAT_P(Ruby x) {return TYPE(x)==T_FLOAT;}
+ #define INT(x) TO(int32,x)
+ #define TO(t,x) convert(x,(t*)0)
+
+ // not using NUM2INT because Ruby can convert Symbol to int
+ // (by compatibility with Ruby 1.4)
+ static inline int32 convert(Ruby x, int32 *foo) {
+ if (INTEGER_P(x)) return NUM2INT(x);
+ if (FLOAT_P(x)) return NUM2INT(rb_funcall(x,SI(round),0));
+ RAISE("expected Integer or Float (got %s)",
+ rb_str_ptr(rb_funcall(x,SI(inspect),0)));
+ }
+ static int16 convert(Ruby x, int16 *foo) {
+ int v = INT(x);
+ if (v<-0x8000 || v>=0x8000) RAISE("value %d is out of range",v);
+ return v;}
+ static uint16 convert(Ruby x, uint16 *foo) {
+ int v = INT(x);
+ if (v<0 || v>=0x10000) RAISE("value %d is out of range",v);
+ return v;}
+ static bool convert(Ruby x, bool *foo) {
+ if (x==Qtrue) return true;
+ if (x==Qfalse) return false;
+ switch (TYPE(x)) {
+ case T_FIXNUM: case T_BIGNUM: case T_FLOAT: return !!INT(x);
+ default: RAISE("can't convert to bool");
+ }
+ }
+
+ #ifdef HAVE_GCC64
+ static uint64 convert(Ruby val, uint64 *foo) { return NUM2ULONG(val); }
+ static int64 convert(Ruby val, int64 *foo) { return NUM2ULONG(val); }
+ static Ruby gf_ull2num(uint64 val) { return ULONG2NUM(val); }
+ static Ruby gf_ll2num(uint64 val) { return LONG2NUM(val); }
+ #else
+ static uint64 convert(Ruby val, uint64 *foo) {
+ if (FIXNUM_P(val)) return (uint64)FIX2LONG(val);
+ if (TYPE(val)!=T_BIGNUM) RAISE("type error");
+ uint64 v = (uint64)NUM2UINT(rb_funcall(val,SI(>>),1,INT2FIX(32))) << 32;
+ return v + NUM2UINT(rb_funcall(val,SI(&),1,UINT2NUM(0xffffffff)));}
+ static int64 convert(Ruby val, int64 *foo) {
+ if (FIXNUM_P(val)) return (int64)FIX2LONG(val);
+ if (TYPE(val)!=T_BIGNUM) RAISE("type error");
+ int64 v = (int64)NUM2INT(rb_funcall(val,SI(>>),1,INT2FIX(32))) << 32;
+ return v + NUM2UINT(rb_funcall(val,SI(&),1,UINT2NUM(0xffffffff)));}
+ static Ruby gf_ull2num(uint64 val) {
+ Ruby x = rb_funcall(UINT2NUM((uint32)(val>>32)),SI(<<),1,INT2FIX(32));
+ return rb_funcall(x,SI(+),1,UINT2NUM((uint32)val));}
+ static Ruby gf_ll2num(int64 val) {
+ Ruby x = rb_funcall( INT2NUM(( int32)(val>>32)),SI(<<),1,INT2FIX(32));
+ return rb_funcall(x,SI(+),1,UINT2NUM((uint32)val));}
+ #endif
+
+ static long convert(Ruby x, long *foo) {
+ return sizeof(long)==sizeof(int32) ?
+ convert(x,(int32 *)0) :
+ convert(x,(int64 *)0);
+ }
+
+ static float64 convert(Ruby x, float64 *foo) {
+ if (INTEGER_P(x)) return INT(x);
+ if (TYPE(x)!=T_FLOAT) RAISE("not a Float");
+ return ((RFloat*)x)->value;}
+ static float32 convert(Ruby x, float32 *foo) {
+ return (float32) convert(x,(float64 *)0);}
+ typedef Ruby Symbol, Array, String, Integer;
+ static Ruby convert(Ruby x, Ruby *bogus) { return x; }
+ typedef Ruby (*RMethod)(...); /* !@#$ fishy */
+
+ #define BUILTIN_SYMBOLS(MACRO) \
+ MACRO(_grid,"grid") MACRO(_bang,"bang") MACRO(_float,"float") \
+ MACRO(_list,"list") MACRO(_sharp,"#") \
+ MACRO(iv_outlets,"@outlets") \
+ MACRO(iv_ninlets,"@ninlets") \
+ MACRO(iv_noutlets,"@noutlets")
+ extern struct BuiltinSymbols {
+ #define FOO(_sym_,_str_) Ruby _sym_;
+ BUILTIN_SYMBOLS(FOO)
+ #undef FOO
+ } bsym;
+
+ typedef struct R {
+ VALUE r;
+ R() {r=Qnil;}
+ R(int x) {r=INT2NUM(x);}
+ R(unsigned x) {r=UINT2NUM(x);}
+ R(long x) {r=LONG2NUM(x);}
+ R(unsigned long x) {r=ULONG2NUM(x);}
+ R(double x) {r=rb_float_new(x);}
+ R( int64 x) {r= gf_ll2num(x);}
+ R(uint64 x) {r=gf_ull2num(x);}
+ operator bool() {return !!INT2NUM(r);}
+ operator uint8 () {return INT2NUM(r);}
+ operator int16 () {return INT2NUM(r);}
+ operator int32 () {return INT2NUM(r);}
+ operator int64 () {return convert(r,(int64*)0);}
+ operator float32 () {return convert(r,(float32*)0);}
+ operator float64 () {return convert(r,(float64*)0);}
+ #define FOO(As,Op) \
+ R &operator As (int x) {r=rb_funcall(r, SI(Op),1,INT2NUM(x)); return *this;}
+ FOO(+=,+) FOO(-=,-) FOO(*=,*) FOO(/=,/) FOO(%=,%)
+ FOO(&=,&) FOO(|=,|) FOO(^=,^) FOO(<<=,<<) FOO(>>=,>>)
+ #undef FOO
+ // bool operator == (int x) {return rb_funcall(r,SI(==),1,INT2NUM(x));}
+ #define FOO(Op) \
+ R operator Op (R x) {return rb_funcall(r,SI(Op),1,x.r);} \
+ R operator Op (int x) {return rb_funcall(r,SI(Op),1,INT2NUM(x));}
+ FOO(+) FOO(-) FOO(*) FOO(/) FOO(%)
+ FOO(&) FOO(|) FOO(^) FOO(<<) FOO(>>)
+ FOO(<) FOO(>) FOO(<=) FOO(>=) FOO(==) FOO(!=)
+ #undef FOO
+ static R value(VALUE r) {R x; x.r=r; return x;}
+ } ruby;
+
+ static R operator -(int a, R b) {return rb_funcall(a,SI(Op),1,INT2NUM(b.r));}
+
+ static inline R ipow(R a, R b) {return R::value(rb_funcall(a.r,SI(**),1,b.r));}
+ static inline R gf_abs(R a) { return R::value(rb_funcall(a.r,SI(abs),0)); }
+ static inline R cmp(R a, R b) { return R::value(rb_funcall(a.r,SI(<=>),1,b.r));}
+
+ //****************************************************************
// hook into pointer manipulation. will help find memory corruption bugs.
***************
*** 378,385 ****
extern "C" void *gfmalloc(size_t n);
extern "C" void gffree(void *p);
! inline void *::operator new (size_t n) { return gfmalloc(n); }
! inline void *::operator new[] (size_t n) { return gfmalloc(n); }
! inline void ::operator delete (void *p) { gffree(p); }
! inline void ::operator delete[] (void *p) { gffree(p); }
#endif
--- 501,509 ----
extern "C" void *gfmalloc(size_t n);
extern "C" void gffree(void *p);
! // note that C++ (GCC 3.4) now refuses the :: prefix so i removed it in the 4 following lines:
! inline void *operator new (size_t n) { return gfmalloc(n); }
! inline void *operator new[] (size_t n) { return gfmalloc(n); }
! inline void operator delete (void *p) { gffree(p); }
! inline void operator delete[] (void *p) { gffree(p); }
#endif
***************
*** 401,486 ****
//****************************************************************
- // my own little Ruby <-> C++ layer
-
- struct Arg { Ruby a; };
- struct ArgList { int n; Pt<Arg> v; };
- static inline bool INTEGER_P(Ruby x) {return FIXNUM_P(x)||TYPE(x)==T_BIGNUM;}
- static inline bool FLOAT_P(Ruby x) {return TYPE(x)==T_FLOAT;}
- #define INT(x) TO(int32,x)
- #define TO(t,x) convert(x,(t*)0)
-
- // not using NUM2INT because Ruby can convert Symbol to int
- // (by compatibility with Ruby 1.4)
- static inline int32 convert(Ruby x, int32 *foo) {
- if (INTEGER_P(x)) return NUM2INT(x);
- if (FLOAT_P(x)) return NUM2INT(rb_funcall(x,SI(round),0));
- RAISE("expected Integer or Float (got %s)",
- rb_str_ptr(rb_funcall(x,SI(inspect),0)));
- }
- static int16 convert(Ruby x, int16 *foo) {
- int v = INT(x);
- if (v<-0x8000 || v>=0x8000) RAISE("value %d is out of range",v);
- return v;}
- static uint16 convert(Ruby x, uint16 *foo) {
- int v = INT(x);
- if (v<0 || v>=0x10000) RAISE("value %d is out of range",v);
- return v;}
- static bool convert(Ruby x, bool *foo) {
- if (x==Qtrue) return true;
- if (x==Qfalse) return false;
- switch (TYPE(x)) {
- case T_FIXNUM: case T_BIGNUM: case T_FLOAT: return !!INT(x);
- default: RAISE("can't convert to bool");
- }
- }
-
- static uint64 convert(Ruby val, uint64 *foo) {
- if (FIXNUM_P(val)) return (uint64)FIX2LONG(val);
- if (TYPE(val)!=T_BIGNUM) RAISE("type error");
- uint64 v = (uint64)NUM2UINT(rb_funcall(val,SI(>>),1,INT2FIX(32))) << 32;
- return v + NUM2UINT(rb_funcall(val,SI(&),1,UINT2NUM(0xffffffff)));}
- static int64 convert(Ruby val, int64 *foo) {
- if (FIXNUM_P(val)) return (int64)FIX2LONG(val);
- if (TYPE(val)!=T_BIGNUM) RAISE("type error");
- int64 v = (int64)NUM2INT(rb_funcall(val,SI(>>),1,INT2FIX(32))) << 32;
- return v + NUM2UINT(rb_funcall(val,SI(&),1,UINT2NUM(0xffffffff)));}
-
- static Ruby gf_ull2num(uint64 val) {
- return rb_funcall(
- rb_funcall(UINT2NUM((uint32)(val>>32)),SI(<<),1,INT2FIX(32)),
- SI(+),1,UINT2NUM((uint32)val));}
- static Ruby gf_ll2num(int64 val) {
- return rb_funcall(
- rb_funcall(INT2NUM((int32)(val>>32)),SI(<<),1,INT2FIX(32)),
- SI(+),1,UINT2NUM((uint32)val));}
-
- static long convert(Ruby x, long *foo) {
- return sizeof(long)==sizeof(int32) ?
- convert(x,(int32 *)0) :
- convert(x,(int64 *)0);
- }
- static float64 convert(Ruby x, float64 *foo) {
- if (INTEGER_P(x)) return INT(x);
- if (TYPE(x)!=T_FLOAT) RAISE("not a Float");
- return ((RFloat*)x)->value;}
- static float32 convert(Ruby x, float32 *foo) {
- return (float32) convert(x,(float64 *)0);}
- typedef Ruby Symbol, Array, String, Integer;
- static Ruby convert(Ruby x, Ruby *bogus) { return x; }
- typedef Ruby (*RMethod)(...); /* !@#$ fishy */
-
- #define BUILTIN_SYMBOLS(MACRO) \
- MACRO(_grid,"grid") MACRO(_bang,"bang") MACRO(_float,"float") \
- MACRO(_list,"list") MACRO(_sharp,"#") \
- MACRO(iv_outlets,"@outlets") \
- MACRO(iv_ninlets,"@ninlets") \
- MACRO(iv_noutlets,"@noutlets")
- extern struct BuiltinSymbols {
- #define FOO(_sym_,_str_) Ruby _sym_;
- BUILTIN_SYMBOLS(FOO)
- #undef FOO
- } bsym;
-
- //****************************************************************
// CObject is the base class for C++ classes that get exported to Ruby.
// BTW: It's quite convenient to have virtual-methods in the base class
--- 525,528 ----
***************
*** 510,514 ****
struct MethodDecl { const char *selector; RMethod method; };
void define_many_methods(Ruby rself, int n, MethodDecl *methods);
-
extern Ruby mGridFlow, cFObject, cGridObject, cFormat;
--- 552,555 ----
***************
*** 517,539 ****
\class Dim < CObject
struct Dim : CObject {
! static const int MAX_DIMENSIONS=16; // maximum number of dimensions in a grid
int n;
Pt<int32> v; // safe pointer
! int32 v2[MAX_DIMENSIONS]; // real stuff
void check(); // test invariants
! Dim(int n, Pt<int32> v) {
! this->v = Pt<int32>(v2,MAX_DIMENSIONS);
! this->n = n;
! COPY(this->v,v,n); check();
! }
! Dim(int n, int32* v) {
! this->v = Pt<int32>(v2,MAX_DIMENSIONS);
! this->n = n;
! COPY(this->v,Pt<int32>(v,n),n); check();
! }
! Dim() {v=Pt<int32>(v2,MAX_DIMENSIONS); n=0; check();}
! Dim(int a) {v=Pt<int32>(v2,MAX_DIMENSIONS); n=1;v[0]=a; check();}
! Dim(int a,int b) {v=Pt<int32>(v2,MAX_DIMENSIONS); n=2;v[0]=a;v[1]=b; check();}
! Dim(int a,int b,int c){v=Pt<int32>(v2,MAX_DIMENSIONS); n=3;v[0]=a;v[1]=b;v[2]=c;check();}
int count() {return n;}
int get(int i) { return v[i]; }
--- 558,572 ----
\class Dim < CObject
struct Dim : CObject {
! static const int MAX_DIM=16; // maximum number of dimensions in a grid
int n;
Pt<int32> v; // safe pointer
! int32 v2[MAX_DIM]; // real stuff
void check(); // test invariants
! Dim(int n, Pt<int32> v) { this->v = Pt<int32>(v2,MAX_DIM); this->n = n; COPY(this->v,v,n); check();}
! Dim(int n, int32 *v) { this->v = Pt<int32>(v2,MAX_DIM); this->n = n; COPY(this->v,Pt<int32>(v,n),n); check();}
! Dim() {v=Pt<int32>(v2,MAX_DIM); n=0; check();}
! Dim(int a) {v=Pt<int32>(v2,MAX_DIM); n=1;v[0]=a; check();}
! Dim(int a,int b) {v=Pt<int32>(v2,MAX_DIM); n=2;v[0]=a;v[1]=b; check();}
! Dim(int a,int b,int c){v=Pt<int32>(v2,MAX_DIM); n=3;v[0]=a;v[1]=b;v[2]=c;check();}
int count() {return n;}
int get(int i) { return v[i]; }
***************
*** 611,614 ****
--- 644,648 ----
NUMBER_TYPE_LIMITS(float32,-HUGE_VAL,+HUGE_VAL,(RAISE("all_ones"),0))
NUMBER_TYPE_LIMITS(float64,-HUGE_VAL,+HUGE_VAL,(RAISE("all_ones"),0))
+ NUMBER_TYPE_LIMITS( ruby,ruby(-HUGE_VAL),ruby(+HUGE_VAL),(RAISE("all_ones"),0))
#ifdef HAVE_LITE
***************
*** 625,629 ****
MACRO( uint64,64,NT_UNSIGNED|NT_UNIMPL, "u64") MACRO(int64,64,NT_NOTLITE, "i64,l") \
MACRO(float32,32,NT_NOTLITE|NT_FLOAT, "f32,f") \
! MACRO(float64,64,NT_NOTLITE|NT_FLOAT, "f64,d")
enum NumberTypeE {
--- 659,664 ----
MACRO( uint64,64,NT_UNSIGNED|NT_UNIMPL, "u64") MACRO(int64,64,NT_NOTLITE, "i64,l") \
MACRO(float32,32,NT_NOTLITE|NT_FLOAT, "f32,f") \
! MACRO(float64,64,NT_NOTLITE|NT_FLOAT, "f64,d") \
! MACRO( ruby,sizeof(long),NT_NOTLITE,"r")
enum NumberTypeE {
***************
*** 662,670 ****
case uint8_e: C(uint8) break; case int16_e: C(int16) break; \
case int32_e: C(int32) break; NONLITE(case int64_e: C(int64) break; \
! case float32_e: C(float32) break; case float64_e: C(float64) break;) \
default: E; RAISE("type '%s' not available here",number_type_table[T].sym);}
! #define TYPESWITCH_NOFLOAT(T,C,E) switch (T) { \
case uint8_e: C(uint8) break; case int16_e: C(int16) break; \
! case int32_e: C(int32) break; NONLITE(case int64_e: C(int64) break;)\
default: E; RAISE("type '%s' not available here",number_type_table[T].sym);}
--- 697,706 ----
case uint8_e: C(uint8) break; case int16_e: C(int16) break; \
case int32_e: C(int32) break; NONLITE(case int64_e: C(int64) break; \
! case float32_e: C(float32) break; case float64_e: C(float64) break; \
! case ruby_e: C(ruby) break;) \
default: E; RAISE("type '%s' not available here",number_type_table[T].sym);}
! #define TYPESWITCH_JUSTINT(T,C,E) switch (T) { \
case uint8_e: C(uint8) break; case int16_e: C(int16) break; \
! case int32_e: C(int32) break; NONLITE(case int64_e: C(int64) break;) \
default: E; RAISE("type '%s' not available here",number_type_table[T].sym);}
***************
*** 684,696 ****
// neutral: right: forall y {f(x,y)=x}; left: forall x {f(x,y)=y};
// absorbent: right: exists a forall y {f(x,y)=a}; ...
AlgebraicCheck is_neutral, is_absorbent;
! NumopOn(Map m, Zip z, Fold f, Scan s, AlgebraicCheck n, AlgebraicCheck a) :
! op_map(m), op_zip(z), op_fold(f), op_scan(s),
! is_neutral(n), is_absorbent(a) {}
NumopOn() {}
NumopOn(const NumopOn &z) {
op_map = z.op_map; op_zip = z.op_zip;
op_fold = z.op_fold; op_scan = z.op_scan;
! is_neutral = z.is_neutral; is_absorbent = z.is_absorbent; }
};
--- 720,733 ----
// neutral: right: forall y {f(x,y)=x}; left: forall x {f(x,y)=y};
// absorbent: right: exists a forall y {f(x,y)=a}; ...
+ T (*neutral)(LeftRight); // default neutral: e.g. 0 for addition, 1 for multiplication
AlgebraicCheck is_neutral, is_absorbent;
! NumopOn(Map m, Zip z, Fold f, Scan s, T (*neu)(LeftRight), AlgebraicCheck n, AlgebraicCheck a) :
! op_map(m), op_zip(z), op_fold(f), op_scan(s), neutral(neu), is_neutral(n), is_absorbent(a) {}
NumopOn() {}
NumopOn(const NumopOn &z) {
op_map = z.op_map; op_zip = z.op_zip;
op_fold = z.op_fold; op_scan = z.op_scan;
! is_neutral = z.is_neutral; neutral = z.neutral;
! is_absorbent = z.is_absorbent; }
};
***************
*** 698,702 ****
#define OP_ASSOC (1<<0)
// abelian property: commutativity: f(a,b)=f(b,a)
! #define OP_COMM (1<<1)
\class Numop < CObject
--- 735,739 ----
#define OP_ASSOC (1<<0)
// abelian property: commutativity: f(a,b)=f(b,a)
! #define OP_COMM (1<<1)
\class Numop < CObject
***************
*** 774,778 ****
NumberTypeE nt;
void *data;
- void *rdata;
Grid(P<Dim> dim, NumberTypeE nt, bool clear=false) : dim(0), nt(int32_e), data(0) {
if (!dim) RAISE("hell");
--- 811,814 ----
***************
*** 796,807 ****
return foo;
}
! ~Grid() {if (rdata) delete[] (uint8 *)rdata;}
private:
void init(P<Dim> dim, NumberTypeE nt) {
this->dim = dim;
this->nt = nt;
! rdata = dim ? new int64[1+(bytes()+7)/8] : 0;
! int align = ((long)rdata) & 7;
! data = (char *)rdata + ((8-align)&7);
//fprintf(stderr,"rdata=%p data=%p align=%d\n",rdata,data,align);
}
--- 832,842 ----
return foo;
}
! ~Grid() {if (data) free(data);}
private:
void init(P<Dim> dim, NumberTypeE nt) {
this->dim = dim;
this->nt = nt;
! data = 0;
! if (dim) data = memalign(16,bytes()+16);
//fprintf(stderr,"rdata=%p data=%p align=%d\n",rdata,data,align);
}
***************
*** 938,953 ****
// GRIN1 : int32 only
// GRIN4 : all types
! // GRIN2 : integers only; no floats
// GRINF : floats only; no integers
#ifndef HAVE_LITE
! #define GRIN(TB,TS,TI,TL,TF,TD) {TB,TS,TI,TL,TF,TD}
#else
! #define GRIN(TB,TS,TI,TL,TF,TD) {TB,TS,TI}
#endif // HAVE_LITE
! #define GRIN1(C,I) GRIN(0,0,C::grinw_##I,0,0,0)
! #define GRIN4(C,I) GRIN(C::grinw_##I,C::grinw_##I,C::grinw_##I,C::grinw_##I,C::grinw_##I,C::grinw_##I)
! #define GRIN2(C,I) GRIN(C::grinw_##I,C::grinw_##I,C::grinw_##I,C::grinw_##I,0,0)
! #define GRINF(C,I) GRIN(0,0,0,0,C::grinw_##I,C::grinw_##I)
struct FClass { // 0.7.8: removed all GridObject-specific stuff.
--- 973,988 ----
// GRIN1 : int32 only
// GRIN4 : all types
! // GRIN2 : integers only; no floats (no R either actually)
// GRINF : floats only; no integers
#ifndef HAVE_LITE
! #define GRIN(TB,TS,TI,TL,TF,TD,TR) {TB,TS,TI,TL,TF,TD,TR}
#else
! #define GRIN(TB,TS,TI,TL,TF,TD,TR) {TB,TS,TI}
#endif // HAVE_LITE
! #define GRIN1(C,I) GRIN(0,0,C::grinw_##I,0,0,0,0)
! #define GRIN4(C,I) GRIN(C::grinw_##I,C::grinw_##I,C::grinw_##I,C::grinw_##I,C::grinw_##I,C::grinw_##I,C::grinw_##I)
! #define GRIN2(C,I) GRIN(C::grinw_##I,C::grinw_##I,C::grinw_##I,C::grinw_##I,0,0,0)
! #define GRINF(C,I) GRIN(0,0,0,0,C::grinw_##I,C::grinw_##I,0)
struct FClass { // 0.7.8: removed all GridObject-specific stuff.
***************
*** 1082,1085 ****
--- 1117,1122 ----
// a stack for the profiler, etc.
#define GF_STACK_MAX 256
+ //#define NO_INLINE(decl) decl __attribute__((noinline))
+ #define NO_INLINE(decl) decl
struct GFStack {
struct GFStackFrame {
***************
*** 1091,1096 ****
int n;
GFStack() { n = 0; }
! void push (FObject *o) __attribute__((noinline));
! void pop () __attribute__((noinline));
};
extern GFStack gf_stack;
--- 1128,1133 ----
int n;
GFStack() { n = 0; }
! NO_INLINE(void push (FObject *o));
! NO_INLINE(void pop ());
};
extern GFStack gf_stack;
Index: main.c
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/base/main.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** main.c 4 Oct 2005 02:02:13 -0000 1.1
--- main.c 15 Mar 2006 04:37:08 -0000 1.2
***************
*** 92,96 ****
void Dim::check() {
! if (n>MAX_DIMENSIONS) RAISE("too many dimensions");
for (int i=0; i<n; i++) if (v[i]<0) RAISE("Dim: negative dimension");
}
--- 92,96 ----
void Dim::check() {
! if (n>MAX_DIM) RAISE("too many dimensions");
for (int i=0; i<n; i++) if (v[i]<0) RAISE("Dim: negative dimension");
}
***************
*** 436,440 ****
}
const char *se = s+strlen(s);
! while (se[-1]==')' || se[-1]=='}') { se--; close++; }
if (s!=se) {
Ruby u = rb_str_new(s,se-s);
--- 436,440 ----
}
const char *se = s+strlen(s);
! while (se>s && (se[-1]==')' || se[-1]=='}')) { se--; close++; }
if (s!=se) {
Ruby u = rb_str_new(s,se-s);
***************
*** 496,500 ****
void *gfmalloc(size_t n) {
uint64 t = rdtsc();
! void *p = malloc(n);
long align = (long)p & 7;
if (align) fprintf(stderr,"malloc alignment = %ld mod 8\n",align);
--- 496,501 ----
void *gfmalloc(size_t n) {
uint64 t = rdtsc();
! // void *p = malloc(n);
! void *p = memalign(16,n);
long align = (long)p & 7;
if (align) fprintf(stderr,"malloc alignment = %ld mod 8\n",align);
***************
*** 574,578 ****
rb_define_const(mGridFlow, "GF_VERSION", rb_str_new2(GF_VERSION));
rb_define_const(mGridFlow, "GF_COMPILE_TIME", rb_str_new2(GF_COMPILE_TIME));
!
cFObject = rb_define_class_under(mGridFlow, "FObject", rb_cObject);
EVAL(
--- 575,579 ----
rb_define_const(mGridFlow, "GF_VERSION", rb_str_new2(GF_VERSION));
rb_define_const(mGridFlow, "GF_COMPILE_TIME", rb_str_new2(GF_COMPILE_TIME));
! rb_define_const(mGridFlow, "GCC_VERSION", rb_str_new2(GCC_VERSION));
cFObject = rb_define_class_under(mGridFlow, "FObject", rb_cObject);
EVAL(
Index: grid.c
===================================================================
RCS file: /cvsroot/pure-data/externals/gridflow/base/grid.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** grid.c 4 Oct 2005 02:02:13 -0000 1.1
--- grid.c 15 Mar 2006 04:37:08 -0000 1.2
***************
*** 33,40 ****
/* copied from bridge/puredata.c (sorry: linkage issue) */
! struct Pointer : CObject { void *p; Pointer(void *_p) : p(_p) {}};
! Ruby Pointer_s_noo (void *ptr) {
! return Data_Wrap_Struct(EVAL("GridFlow::Pointer"), 0, 0, new Pointer(ptr));}
! static void *Pointer_gut (Ruby rself) {DGS(Pointer); return self->p;}
//#define TRACE fprintf(stderr,"%s %s [%s:%d]\n",INFO(parent),__PRETTY_FUNCTION__,__FILE__,__LINE__);assert(this);
--- 33,54 ----
/* copied from bridge/puredata.c (sorry: linkage issue) */
! struct Pointer : CObject {
! void *p;
! Pointer(void *_p) : p(_p) {}
! };
!
! #define Pointer_s_new Pointer_s_new_2
! #define Pointer_get Pointer_get_2
!
! static Ruby Pointer_s_new (void *ptr) {
! Pointer *self = new Pointer(ptr);
! Ruby rself = Data_Wrap_Struct(EVAL("GridFlow::Pointer"), 0, CObject_free, self);
! self->rself = rself;
! return rself;
! }
! static void *Pointer_get (Ruby rself) {
! DGS(Pointer);
! return self->p;
! }
//#define TRACE fprintf(stderr,"%s %s [%s:%d]\n",INFO(parent),__PRETTY_FUNCTION__,__FILE__,__LINE__);assert(this);
***************
*** 44,49 ****
if (NumberTypeE_type_of(d)!=this->nt) RAISE("%s(%s): " \
"type mismatch during transmission (got %s expecting %s)", \
! INFO(parent), \
! __PRETTY_FUNCTION__, \
number_type_table[NumberTypeE_type_of(d)].name, \
number_type_table[this->nt].name);
--- 58,62 ----
if (NumberTypeE_type_of(d)!=this->nt) RAISE("%s(%s): " \
"type mismatch during transmission (got %s expecting %s)", \
! INFO(parent), __PRETTY_FUNCTION__, \
number_type_table[NumberTypeE_type_of(d)].name, \
number_type_table[this->nt].name);
***************
*** 78,81 ****
--- 91,96 ----
#undef FOO
+ static inline void NUM(Ruby x, ruby &y) { y.r=x; }
+
void Grid::init_from_ruby_list(int n, Ruby *a, NumberTypeE nt) {
Ruby delim = SYM(#);
***************
*** 163,175 ****
Ruby GridInlet::begin(int argc, Ruby *argv) {TRACE;
if (!argc) return PTR2FIX(this);
! GridOutlet *back_out = (GridOutlet *) Pointer_gut(argv[0]);
nt = (NumberTypeE) INT(argv[1]);
argc-=2, argv+=2;
PROF(parent) {
! if (dim) {
! gfpost("%s: grid inlet conflict; aborting %s in favour of %s",
INFO(parent), INFO(sender), INFO(back_out->parent));
- abort();
- }
sender = back_out->parent;
if ((int)nt<0 || (int)nt>=(int)number_type_table_end)
--- 178,187 ----
Ruby GridInlet::begin(int argc, Ruby *argv) {TRACE;
if (!argc) return PTR2FIX(this);
! GridOutlet *back_out = (GridOutlet *) Pointer_get(argv[0]);
nt = (NumberTypeE) INT(argv[1]);
argc-=2, argv+=2;
PROF(parent) {
! if (dim) RAISE("%s: grid inlet conflict; aborting %s in favour of %s",
INFO(parent), INFO(sender), INFO(back_out->parent));
sender = back_out->parent;
if ((int)nt<0 || (int)nt>=(int)number_type_table_end)
***************
*** 329,333 ****
a[0] = INT2NUM(woutlet);
a[1] = bsym._grid;
! a[2] = Pointer_s_noo(this);
a[3] = INT2NUM(nt);
for(int i=0; i<n; i++) a[4+i] = INT2NUM(dim->get(i));
--- 341,345 ----
a[0] = INT2NUM(woutlet);
a[1] = bsym._grid;
! a[2] = Pointer_s_new(this);
a[3] = INT2NUM(nt);
for(int i=0; i<n; i++) a[4+i] = INT2NUM(dim->get(i));