/* VASP modular - vector assembling signal processor / objects for Max/MSP and PD Copyright (c) 2002 Thomas Grill (xovo@gmx.net) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. */ #ifndef __VASP_OPDEFS_H #define __VASP_OPDEFS_H #include "oploop.h" #include "opbase.h" #ifdef VASP_CHN1 #define _D_ALWAYS1 1 #else #define _D_ALWAYS1 0 #endif namespace VecOp { /*! \brief skeleton for unary real operations */ //template BL V__run(register const T *sr,I rss,register T *dr,I rds,I frames) template BL V__run(register const T *sr,I rss,register T *dr,I rds,I frames) { register I i; if(sr == dr) if(_D_ALWAYS1 || rds == 1) _DE_LOOP(i,frames, ( OP::run(*dr,*dr), dr++ ) ) else _DE_LOOP(i,frames, ( OP::run(*dr,*dr), dr += rds ) ) else if(_D_ALWAYS1 || (rss == 1 && rds == 1)) _DE_LOOP(i,frames, ( OP::run(*dr,*sr), sr++,dr++ ) ) else _DE_LOOP(i,frames, ( OP::run(*dr,*sr), sr += rss,dr += rds ) ) return true; } /*! \brief skeleton for unary complex operations */ template BL V__cun(register const T *sr,register const T *si,I rss,I iss,register T *dr,register T *di,I rds,I ids,I frames) { register I i; if(sr == dr && si == di) if(_D_ALWAYS1 || (rds == 1 && ids == 1)) _DE_LOOP(i,frames, ( OP::cun(*dr,*di,*dr,*di), dr++,di++ ) ) else _DE_LOOP(i,frames, ( OP::cun(*dr,*di,*dr,*di), dr += rds,di += ids ) ) else if(_D_ALWAYS1 || (rss == 1 && iss == 1 && rds == 1 && ids == 1)) _DE_LOOP(i,frames, ( OP::cun(*dr,*di,*sr,*si), sr++,si++,dr++,di++ ) ) else _DE_LOOP(i,frames, ( OP::cun(*dr,*di,*sr,*si), sr += rss,si += iss,dr += rds,di += ids ) ) return true; } template BL V__vun(I layers,register const T *sr,register T *dr,I frames) { register I i; switch(layers) { case 1: V__run(sr,1,dr,1,frames); break; case 2: _DF_LOOP(i,frames, ( vec_un(dr,sr), sr += 2, dr += 2) ) break; case 3: _DF_LOOP(i,frames, ( vec_un(dr,sr), sr += 3, dr += 3) ) break; case 4: _DF_LOOP(i,frames, ( vec_un(dr,sr), sr += 4, dr += 4) ) break; default: _DF_LOOP(i,frames, ( vec_un(dr,sr,layers), sr += layers, dr += layers) ) break; } return true; } template BL V__rbin(register const T *sr,I rss,register T *dr,I rds,register const T *ar,I ras,I frames) { register I i; if(sr == dr) if(_D_ALWAYS1 || (rds == 1 && ras == 1)) _DE_LOOP(i,frames, ( OP::rbin(*dr,*dr,*ar), dr++,ar++ ) ) else _DE_LOOP(i,frames, ( OP::rbin(*dr,*dr,*ar), dr += rds,ar += ras ) ) else if(_D_ALWAYS1 || (rss == 1 && rds == 1 && ras == 1)) _DE_LOOP(i,frames, ( OP::rbin(*dr,*sr,*ar), sr++,dr++,ar++ ) ) else _DE_LOOP(i,frames, ( OP::rbin(*dr,*sr,*ar), sr += rss,dr += rds,ar += ras ) ) return true; } template BL V__cbin(register const T *sr,register const T *si,I rss,I iss,register T *dr,register T *di,I ids,I rds,const T *ar,const T *ai,I ras,I ias,I frames) { register I i; if(sr == dr && si == di) if(_D_ALWAYS1 || (rds == 1 && ids == 1 && ras == 1 && ias == 1)) _DE_LOOP(i,frames, ( OP::cbin(*dr,*di,*dr,*di,*ar,*ai), dr++,di++,ar++,ai++ ) ) else _DE_LOOP(i,frames, ( OP::cbin(*dr,*di,*dr,*di,*ar,*ai), dr += rds,di += ids,ar += ras,ai += ias ) ) else _DE_LOOP(i,frames, ( OP::cbin(*dr,*di,*sr,*si,*ar,*ai), sr += rss,si += iss,dr += rds,di += ids,ar += ras,ai += ias ) ) return true; } template class _A__vector { public: static TR ev(const TR *a,I i,I m) { return a[i*m]; } }; template class _A__scalar { public: static TR ev(TR a,I i,I m) { return a; } }; class _A__env { public: static R ev(Env::Iter &a,I i,I m) { return a.ValFwd(i); } }; template BL Vx__rbin(register const T *sr,I rss,register T *dr,I rds,TA ar,I frames) { register I i; if(sr == dr) if(_D_ALWAYS1 || rds == 1) _DE_LOOP(i,frames, ( OP::rbin(*dr,*dr,EVARG::ev(ar,i,1)), dr++ ) ) else _DE_LOOP(i,frames, ( OP::rbin(*dr,*dr,EVARG::ev(ar,i,1)), dr += rds ) ) else if(_D_ALWAYS1 || rss == 1 && rds == 1) _DE_LOOP(i,frames, ( OP::rbin(*dr,*sr,EVARG::ev(ar,i,1)), sr++,dr++ ) ) else _DE_LOOP(i,frames, ( OP::rbin(*dr,*sr,EVARG::ev(ar,i,1)), sr += rss,dr += rds ) ) return true; } template BL Vx__cbin(register const T *sr,register const T *si,I rss,I iss,register T *dr,register T *di,I ids,I rds,TA1 ar,TA2 ai,I ras,I ias,I frames) { register I i; if(sr == dr && si == di) if(_D_ALWAYS1 || (rds == 1 && ids == 1 && ras == 1 && ias == 1)) _DE_LOOP(i,frames, ( OP::cbin(*dr,*di,*dr,*di,EVARG1::ev(ar,i,1),EVARG2::ev(ai,i,1)), dr++,di++ ) ) else _DE_LOOP(i,frames, ( OP::cbin(*dr,*di,*dr,*di,EVARG1::ev(ar,i,ras),EVARG2::ev(ai,i,ias)), dr += rds,di += ids ) ) else _DE_LOOP(i,frames, ( OP::cbin(*dr,*di,*sr,*si,EVARG1::ev(ar,i,ras),EVARG2::ev(ai,i,ias)), sr += rss,si += iss,dr += rds,di += ids ) ) return true; } template BL Vx__vbin(I layers,register const T *sr,register T *dr,TA ar,I frames) { register I i; switch(layers) { case 1: Vx__rbin(sr,1,dr,1,ar,frames); break; case 2: _DF_LOOP(i,frames, ( vec_bin(dr,sr,EVARG::ev(ar,i,2)), sr += 2, dr += 2) ) break; case 3: _DF_LOOP(i,frames, ( vec_bin(dr,sr,EVARG::ev(ar,i,3)), sr += 3, dr += 3) ) break; case 4: _DF_LOOP(i,frames, ( vec_bin(dr,sr,EVARG::ev(ar,i,4)), sr += 4, dr += 4) ) break; default: _DF_LOOP(i,frames, ( vec_bin(dr,sr,EVARG::ev(ar,i,layers),layers), sr += layers, dr += layers) ) break; } return true; } template inline BL V__vbin(I layers,register const T *sr,register T *dr,register const T *ar,I frames) { return Vx__vbin >(layers,sr,dr,ar,frames); } /*! \brief skeleton for binary real operations */ template BL _F__rbin(OpParam &p) { if(p.HasArg() && p.arg[0].Is()) { switch(p.arg[0].argtp) { case OpParam::Arg::arg_v: { V__rbin(p.rsdt,p.rss,p.rddt,p.rds,p.arg[0].v.rdt,p.arg[0].v.rs,p.frames); break; } case OpParam::Arg::arg_env: { Env::Iter it(*p.arg[0].e.env); it.Init(0); Vx__rbin(p.rsdt,p.rss,p.rddt,p.rds,it,p.frames); break; } case OpParam::Arg::arg_x: { Vx__rbin >(p.rsdt,p.rss,p.rddt,p.rds,p.arg[0].x.r,p.frames); break; } } } else { Vx__rbin >(p.rsdt,p.rss,p.rddt,p.rds,p.rbin.arg,p.frames); } return true; } /*! \brief skeleton for binary complex operations */ template BL _F__cbin(OpParam &p) { if(p.HasArg() && p.arg[0].Is()) { switch(p.arg[0].argtp) { case OpParam::Arg::arg_v: { if(p.arg[0].v.idt) V__cbin(p.rsdt,p.isdt,p.rss,p.iss,p.rddt,p.iddt,p.rds,p.ids,p.arg[0].v.rdt,p.arg[0].v.idt,p.arg[0].v.rs,p.arg[0].v.is,p.frames); else Vx__cbin,_A__scalar >(p.rsdt,p.isdt,p.rss,p.iss,p.rddt,p.iddt,p.rds,p.ids,p.arg[0].v.rdt,0,p.arg[0].v.rs,1,p.frames); break; } case OpParam::Arg::arg_env: { Env::Iter it(*p.arg[0].e.env); it.Init(0); Vx__cbin >(p.rsdt,p.isdt,p.rss,p.iss,p.rddt,p.iddt,p.rds,p.ids,it,0,1,1,p.frames); break; } case OpParam::Arg::arg_x: { Vx__cbin,_A__scalar >(p.rsdt,p.isdt,p.rss,p.iss,p.rddt,p.iddt,p.rds,p.ids,p.arg[0].x.r,p.arg[0].x.i,1,1,p.frames); break; } } } else { Vx__cbin,_A__scalar >(p.rsdt,p.isdt,p.rss,p.iss,p.rddt,p.iddt,p.rds,p.ids,p.cbin.rarg,p.cbin.iarg,1,1,p.frames); } return true; } /*! \brief skeleton for real operations with parameter block */ template BL V__rop(ARG p,register const S *sr,I rss,register S *dr,I rds,I frames) { register I i; if(sr == dr) if(_D_ALWAYS1 || rds == 1) _DE_LOOP(i,frames, ( OP::rop(*dr,*dr,p), dr++ ) ) else _DE_LOOP(i,frames, ( OP::rop(*dr,*dr,p), dr += rds ) ) else if(_D_ALWAYS1 || (rss == 1 && p.rds == 1)) _DE_LOOP(i,frames, ( OP::rop(*dr,*sr,p), sr++,dr++ ) ) else _DE_LOOP(i,frames, ( OP::rop(*dr,*sr,p), sr += rss,dr += rds ) ) return true; } /*! \brief skeleton for complex operations with parameter block */ template BL V__cop(ARG p,register const S *sr,register const S *si,I rss,I iss,register S *dr,register S *di,I rds,I ids,I frames) { register I i; if(sr == dr && si == di) if(_D_ALWAYS1 || (rds == 1 && ids == 1)) _DE_LOOP(i,frames, ( OP::cop(*dr,*di,*dr,*di,p), dr++,di++ ) ) else _DE_LOOP(i,frames, ( OP::cop(*dr,*di,*dr,*di,p), dr += rds,di += ids ) ) else if(_D_ALWAYS1 || (p.rss == 1 && p.iss == 1 && p.rds == 1 && p.ids == 1)) _DE_LOOP(i,frames, ( OP::cop(*dr,*di,*sr,*si,p), sr++,si++,dr++,di++ ) ) else _DE_LOOP(i,frames, ( OP::cop(*dr,*di,*sr,*si,p), sr += rss,si += iss,dr += rds,di += ids ) ) return true; } template inline BL _D__run(OpParam &p) { return V__run(p.rsdt,p.rss,p.rddt,p.rds,p.frames); } template inline BL _D__cun(OpParam &p) { return V__cun(p.rsdt,p.isdt,p.rss,p.iss,p.rddt,p.iddt,p.rds,p.ids,p.frames); } template inline BL _D__rbin(OpParam &p) { return _F__rbin(p); } template inline BL _D__cbin(OpParam &p) { return _F__cbin(p); } template inline BL _D__rop(OpParam &p) { return V__rop(p,p.rsdt,p.rss,p.rddt,p.rds,p.frames); } template inline BL _D__cop(OpParam &p) { return V__cop(p,p.rsdt,p.isdt,p.rss,p.iss,p.rddt,p.iddt,p.rds,p.ids,p.frames); } template inline BL d__run(OpParam &p) { return _d__run(CL::run,p); } template inline BL d__cun(OpParam &p) { return _d__cun(CL::cun,p); } template inline BL d__rbin(OpParam &p) { return _d__rbin(CL::rbin,p); } template inline BL d__cbin(OpParam &p) { return _d__cbin(CL::cbin,p); } template inline BL d__rop(OpParam &p) { return _d__rop(CL::rop,p); } template inline BL d__cop(OpParam &p) { return _d__cop(CL::cop,p); } template inline BL f__run(OpParam &p) { return _d__run(CL::run,p); } template inline BL f__cun(OpParam &p) { return _d__cun(CL::cun,p); } template inline BL f__rbin(OpParam &p) { return _d__rbin(CL::rbin,p); } template inline BL f__cbin(OpParam &p) { return _d__cbin(CL::cbin,p); } template inline BL f__rop(OpParam &p) { return _d__rop(CL::rop,p); } template inline BL f__cop(OpParam &p) { return _d__cop(CL::cop,p); } #ifdef VASP_COMPACT template inline BL D__run(OpParam &p) { return _d__run(CL::run,p); } template inline BL D__cun(OpParam &p) { return _d__cun(CL::cun,p); } template inline BL D__rbin(OpParam &p) { return _d__rbin(CL::rbin,p); } template inline BL D__cbin(OpParam &p) { return _d__cbin(CL::cbin,p); } template inline BL D__rop(OpParam &p) { return _d__rop(CL::rop,p); } template inline BL D__cop(OpParam &p) { return _d__cop(CL::cop,p); } template inline BL F__run(OpParam &p) { return _d__run(CL::run,p); } template inline BL F__cun(OpParam &p) { return _d__cun(CL::cun,p); } template inline BL F__rbin(OpParam &p) { return _d__rbin(CL::rbin,p); } template inline BL F__cbin(OpParam &p) { return _d__cbin(CL::cbin,p); } template inline BL F__rop(OpParam &p) { return _d__rop(CL::rop,p); } template inline BL F__cop(OpParam &p) { return _d__cop(CL::cop,p); } #else template inline BL D__run(OpParam &p) { return _D__run(p); } template inline BL D__cun(OpParam &p) { return _D__cun(p); } template inline BL D__rbin(OpParam &p) { return _D__rbin(p); } template inline BL D__cbin(OpParam &p) { return _D__cbin(p); } template inline BL D__rop(OpParam &p) { return _D__rop(p); } template inline BL D__cop(OpParam &p) { return _D__cop(p); } template inline BL F__run(OpParam &p) { return V__run(p.rsdt,p.rss,p.rddt,p.rds,p.frames); } template inline BL F__cun(OpParam &p) { return V__cun(p.rsdt,p.isdt,p.rss,p.iss,p.rddt,p.iddt,p.rds,p.ids,p.frames); } template inline BL F__rbin(OpParam &p) { return _F__rbin(p); } template inline BL V__cbin(OpParam &p) { return _F__cbin(p); } template inline BL F__rop(OpParam &p) { return V__rop(p,p.rsdt,p.rss,p.rddt,p.rds,p.frames); } template inline BL F__cop(OpParam &p) { return V__cop(p,p.rsdt,p.isdt,p.rss,p.iss,p.rddt,p.iddt,p.rds,p.ids,p.frames); } #endif } // namespace VecOp #endif