aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/vasp/source/ops_search.cpp
diff options
context:
space:
mode:
authorThomas Grill <xovo@users.sourceforge.net>2002-12-02 19:21:08 +0000
committerThomas Grill <xovo@users.sourceforge.net>2002-12-02 19:21:08 +0000
commit9815096db22c73cacdbb65512d1b61d633db7fa8 (patch)
tree4a6582ead85b8efd031f68e717fbc8a5b3a3df3f /externals/grill/vasp/source/ops_search.cpp
parent0a109da279e9df66fb5ea7d6bdaeffed16592f02 (diff)
"version 0.1.1"
svn path=/trunk/; revision=267
Diffstat (limited to 'externals/grill/vasp/source/ops_search.cpp')
-rw-r--r--externals/grill/vasp/source/ops_search.cpp187
1 files changed, 187 insertions, 0 deletions
diff --git a/externals/grill/vasp/source/ops_search.cpp b/externals/grill/vasp/source/ops_search.cpp
new file mode 100644
index 00000000..7afc84c2
--- /dev/null
+++ b/externals/grill/vasp/source/ops_search.cpp
@@ -0,0 +1,187 @@
+/*
+
+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.
+
+*/
+
+#include "ops_search.h"
+#include "util.h"
+#include "oploop.h"
+
+
+BL VecOp::d_search(OpParam &p)
+{
+ const I off = p.srch.offs;
+ const S val = p.srch.val;
+ const R cur = p.rsdt[off];
+
+ I i,ofl = -1,ofr = -1;
+
+ if(p.srch.dir <= 0) {
+ BL y = cur >= val;
+ i = off-1;
+ _D_WHILE(i >= 0)
+ BL y2 = p.rsdt[i] >= val;
+ if(y != y2) {
+ if(p.srch.slope <= 0 && y2) break;
+ if(p.srch.slope >= 0 && !y2) break;
+ }
+ y = y2;
+ --i;
+ _E_WHILE
+
+ if(i >= 0) ofl = i;
+ }
+
+ if(p.srch.dir >= 0) {
+ BL y = cur >= val;
+ i = off+1;
+ _D_WHILE(i < p.frames)
+ BL y2 = p.rsdt[i] >= val;
+ if(y != y2) {
+ if(p.srch.slope <= 0 && !y2) break;
+ if(p.srch.slope >= 0 && y2) break;
+ }
+ y = y2;
+ ++i;
+ _E_WHILE
+
+ if(i < p.frames) ofr = i;
+ }
+
+ if(!p.srch.dir) {
+ if(ofl >= 0) {
+ p.srch.dif = ofl-off;
+ if(ofr >= 0 && abs(p.srch.dif) < abs(ofr-off)) p.srch.dif = ofr-off;
+ }
+ else
+ p.srch.dif = ofr >= 0?ofr-off:0;
+ }
+ else if(p.srch.dir > 0)
+ p.srch.dif = ofr >= 0?ofr-off:0;
+ else
+ p.srch.dif = ofl >= 0?ofl-off:0;
+
+ return true;
+}
+
+Vasp *VaspOp::m_search(OpParam &p,Vasp &src,const Argument &arg,Vasp *dst,BL st)
+{
+ Vasp *ret = NULL;
+ if(src.Vectors() > 1)
+ post("%s - More than one vector in vasp!",p.opName());
+ else if(arg.CanbeFloat() || (arg.IsList() && arg.GetList().Count() >= 1)) {
+ I fr = src.ChkFrames();
+ I o = src.Vector(0).Offset();
+ I sz = src.Buffer(0)->Frames();
+
+ Vasp all(src);
+ if(st) {
+ // search start point
+ p.srch.offs = o;
+
+ // set bounds of search buffer
+ all.Offset(0);
+ all.Frames(fr+o); // all frames of buffer
+ }
+ else {
+ // search end point
+ p.srch.offs = o+fr;
+ // check if current offset is past buffer
+ if(p.srch.offs >= sz) p.srch.offs = sz-1;
+
+ // set bounds of search buffer
+ all.Offset(o);
+ all.Frames(sz-o); // all frames of buffer
+ }
+
+ RVecBlock *vecs = GetRVecs(p.opname,all,dst);
+ if(vecs) {
+ p.srch.val = arg.IsList()?flext::GetAFloat(arg.GetList()[0]):arg.GetAFloat();
+
+ ret = DoOp(vecs,VecOp::d_search,p);
+
+ if(st) o += p.srch.dif,fr -= p.srch.dif;
+ else fr += p.srch.dif;
+
+ if(ret) {
+ ret->Offset(o);
+ ret->Frames(fr);
+ ret->Frames(ret->ChkFrames());
+ }
+
+ delete vecs;
+ }
+ }
+ else
+ post("%s - no arguments: no operation",p.opName());
+
+ return ret;
+}
+
+
+class vasp_search:
+ public vasp_anyop
+{
+ FLEXT_HEADER(vasp_search,vasp_anyop)
+public:
+
+ vasp_search(I argc,t_atom *argv):
+ vasp_anyop(argc,argv,VASP_ARG_R(0),false,XletCode(xlet::tp_float,0)),
+ slope(0),dir(0)
+ {
+ FLEXT_ADDMETHOD_I(0,"dir",m_dir);
+ FLEXT_ADDMETHOD_I(0,"slope",m_slope);
+ }
+
+ virtual Vasp *do_work(OpParam &p) = 0;
+
+ virtual Vasp *tx_work(const Argument &arg)
+ {
+ OpParam p(thisName(),1);
+ p.srch.dir = dir;
+ p.srch.slope = slope;
+
+ Vasp *ret = do_work(p);
+ if(ret) ToOutFloat(1,p.srch.dif);
+ return ret;
+ }
+
+ V m_dir(I d) { dir = d; }
+ V m_slope(I sl) { slope = sl; }
+
+protected:
+ I dir,slope;
+
+private:
+ FLEXT_CALLBACK_I(m_dir)
+ FLEXT_CALLBACK_I(m_slope)
+};
+
+
+class vasp_soffset:
+ public vasp_search
+{
+ FLEXT_HEADER(vasp_soffset,vasp_search)
+public:
+ vasp_soffset(I argc,t_atom *argv): vasp_search(argc,argv) {}
+ virtual Vasp *do_work(OpParam &p) { return VaspOp::m_soffset(p,ref,arg,&dst); }
+};
+FLEXT_LIB_V("vasp, vasp.offset= vasp.o=",vasp_soffset)
+
+
+class vasp_sframes:
+ public vasp_search
+{
+ FLEXT_HEADER(vasp_sframes,vasp_search)
+public:
+ vasp_sframes(I argc,t_atom *argv): vasp_search(argc,argv) {}
+ virtual Vasp *do_work(OpParam &p) { return VaspOp::m_sframes(p,ref,arg,&dst); }
+};
+FLEXT_LIB_V("vasp, vasp.frames= vasp.f=",vasp_sframes)
+
+