aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/vasp/source/classes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/vasp/source/classes.cpp')
-rw-r--r--externals/grill/vasp/source/classes.cpp405
1 files changed, 405 insertions, 0 deletions
diff --git a/externals/grill/vasp/source/classes.cpp b/externals/grill/vasp/source/classes.cpp
new file mode 100644
index 00000000..658cf0a7
--- /dev/null
+++ b/externals/grill/vasp/source/classes.cpp
@@ -0,0 +1,405 @@
+/*
+
+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 "classes.h"
+//#include <stdarg.h>
+
+
+///////////////////////////////////////////////////////////////////////////
+// vasp_base class
+///////////////////////////////////////////////////////////////////////////
+
+const t_symbol *vasp_base::sym_radio;
+const t_symbol *vasp_base::sym_vasp;
+const t_symbol *vasp_base::sym_env;
+const t_symbol *vasp_base::sym_double;
+const t_symbol *vasp_base::sym_complex;
+const t_symbol *vasp_base::sym_vector;
+
+V vasp_base::setup(t_class *)
+{
+ sym_radio = MakeSymbol("radio");
+ sym_vasp = MakeSymbol("vasp");
+ sym_env = MakeSymbol("env");
+ sym_double = MakeSymbol("double");
+ sym_complex = MakeSymbol("complex");
+ sym_vector = MakeSymbol("vector");
+}
+
+vasp_base::vasp_base():
+ refresh(false),argchk(false),
+ unit(xsu_sample),loglvl(0)
+{
+ FLEXT_ADDMETHOD_(0,"radio",m_radio);
+ FLEXT_ADDMETHOD_(0,"argchk",m_argchk);
+ FLEXT_ADDMETHOD_(0,"loglvl",m_loglvl);
+ FLEXT_ADDMETHOD_E(0,"unit",m_unit);
+}
+
+vasp_base::~vasp_base() {}
+
+
+V vasp_base::m_radio(I argc,t_atom *argv)
+{
+ if(argc > 0 && IsSymbol(argv[0])) {
+ // send command to self!
+ m_methodmain(0,GetSymbol(argv[0]),argc-1,argv+1);
+
+ // send command to the next objects in line
+ ToOutAnything(0,sym_radio,argc,argv);
+ }
+ else
+ post("%s - radio message invalid",thisName());
+}
+
+
+V vasp_base::m_unit(xs_unit u) { unit = u; }
+V vasp_base::m_argchk(BL chk) { argchk = chk; }
+V vasp_base::m_loglvl(I lvl) { loglvl = lvl; }
+
+
+BL vasp_base::ToOutVasp(I oix,Vasp &v)
+{
+ AtomList *lst = v.MakeList(false);
+ if(lst) {
+ ToOutAnything(oix,sym_vasp,lst->Count(),lst->Atoms());
+ delete lst;
+ return true;
+ }
+ else return false;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// vasp_op class
+///////////////////////////////////////////////////////////////////////////
+
+vasp_op::vasp_op(BL op)
+#ifdef FLEXT_THREADS
+ :detach(false),prior(-2),
+ thrid(0)
+#endif
+{
+ FLEXT_ADDBANG(0,m_dobang);
+ FLEXT_ADDMETHOD_(0,"vasp",m_vasp);
+ FLEXT_ADDMETHOD_(0,"set",m_set);
+ if(op) FLEXT_ADDMETHOD_(0,"to",m_to);
+
+ FLEXT_ADDMETHOD_(0,"update",m_update);
+
+ FLEXT_ADDMETHOD_(0,"detach",m_detach);
+ FLEXT_ADDMETHOD_(0,"stop",m_stop);
+ FLEXT_ADDMETHOD_(0,"prior",m_prior);
+}
+
+V vasp_op::m_dobang()
+{
+#ifdef FLEXT_THREADS
+ if(detach)
+ FLEXT_CALLMETHOD(m_bang);
+ else
+#endif
+ m_bang();
+}
+
+I vasp_op::m_set(I argc,t_atom *argv)
+{
+ Vasp arg(argc,argv);
+
+ if(argc && !arg.Ok()) {
+ ref.Clear();
+ post("%s - invalid vasp detected and ignored",thisName());
+ }
+ else {
+ if(arg.Check())
+ ref = arg;
+ else {
+ ref.Clear();
+ post("%s - vasp reference is invalid",thisName());
+ }
+ }
+
+ return 0;
+}
+
+V vasp_op::m_vasp(I argc,t_atom *argv)
+{
+ m_set(argc,argv);
+ m_dobang();
+}
+
+V vasp_op::m_to(I argc,t_atom *argv)
+{
+ Vasp to(argc,argv);
+
+ if(argc && !to.Ok()) {
+ // empty vasp
+ dst.Clear();
+ }
+ else
+ dst = to;
+}
+
+V vasp_op::m_update(I argc,t_atom *argv)
+{
+ if(argc == 0)
+ ref.Refresh();
+ else {
+ if(CanbeInt(argv[0]))
+ refresh = GetAInt(argv[0]) != 0;
+ else
+ post("%s(update) - argument should be omitted or integer",thisName());
+ }
+}
+
+V vasp_op::m_detach(BL thr)
+{
+#ifdef FLEXT_THREADS
+ detach = thr;
+#endif
+}
+
+V vasp_op::m_prior(I p)
+{
+#ifdef FLEXT_THREADS
+ prior = p;
+#endif
+}
+
+V vasp_op::m_stop() {}
+
+///////////////////////////////////////////////////////////////////////////
+// vasp_tx class
+///////////////////////////////////////////////////////////////////////////
+
+vasp_tx::vasp_tx(BL to): vasp_op(to) {}
+
+V vasp_tx::m_bang()
+{
+ // Thread has to wait until previous is finished
+ Lock();
+
+#ifdef FLEXT_THREADS
+// ChangePriority(prior);
+#endif
+
+ if(ref.Ok())
+ {
+ Vasp *ret = x_work();
+ if(ret) {
+ AtomList *lst = ret->MakeList(false);
+ if(lst) {
+ ToOutAnything(0,sym_vasp,lst->Count(),lst->Atoms());
+ delete lst;
+ }
+ else
+ post("%s - empty list",thisName());
+ if(refresh) ret->Refresh();
+ delete ret;
+ }
+ else {
+#ifdef _DEBUG
+ post("%s - no valid return",thisName());
+#endif
+ }
+ }
+ else {
+ post("%s - no valid vasp to work with",thisName());
+ }
+
+#ifdef FLEXT_THREADS
+ thrid = 0;
+#endif
+ Unlock();
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// vasp_unop class
+///////////////////////////////////////////////////////////////////////////
+
+vasp_unop::vasp_unop(BL op,UL outcode):
+ vasp_tx(op)
+{
+ AddInAnything();
+ AddOutAnything(1);
+ AddOutlets(outcode);
+}
+
+Vasp *vasp_unop::x_work() { return tx_work(); }
+
+Vasp *vasp_unop::tx_work()
+{
+ error("%s - no work method implemented",thisName());
+ return NULL;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// vasp_binop class
+///////////////////////////////////////////////////////////////////////////
+
+
+vasp_binop::vasp_binop(I argc,t_atom *argv,const Argument &def,BL op,UL outcode):
+ vasp_tx(op)
+{
+ a_list(argc,argv);
+ if(arg.IsNone() && !def.IsNone()) arg = def;
+
+ AddInAnything(2);
+ AddOutAnything(1);
+ AddOutlets(outcode);
+
+ FLEXT_ADDMETHOD(1,a_list);
+ FLEXT_ADDMETHOD_(1,"vasp",a_vasp);
+ FLEXT_ADDMETHOD_(1,"env",a_env);
+ FLEXT_ADDMETHOD_(1,"float",a_float);
+ FLEXT_ADDMETHOD_(1,"double",a_double);
+ FLEXT_ADDMETHOD_(1,"int",a_int);
+ FLEXT_ADDMETHOD_(1,"complex",a_complex);
+ FLEXT_ADDMETHOD_(1,"vector",a_vector);
+ FLEXT_ADDMETHOD_(1,"radio",a_radio);
+}
+
+V vasp_binop::a_list(I argc,t_atom *argv)
+{
+ if(argc) {
+ arg.Parse(argc,argv);
+ if(arg.IsNone())
+ post("%s - list argument could not be evaluated (ignored)",thisName());
+ else if(argchk) {
+ // check argument feasibility
+ }
+ }
+ else {
+// post("%s - Empty list argument (ignored)",thisName());
+ }
+}
+
+V vasp_binop::a_vasp(I argc,t_atom *argv)
+{
+ Vasp *v = new Vasp(argc,argv);
+ if(v->Ok()) {
+ arg.SetVasp(v);
+ if(argchk) {
+ // check argument feasibility
+ }
+ }
+ else {
+ post("%s - invalid vasp argument (ignored)",thisName());
+ delete v;
+ }
+}
+
+V vasp_binop::a_env(I argc,t_atom *argv)
+{
+ Env *bp = new Env(argc,argv);
+ if(bp->Ok()) {
+ arg.SetEnv(bp);
+ if(argchk) {
+ // check argument feasibility
+ }
+ }
+ else {
+ post("%s - invalid env argument (ignored)",thisName());
+ delete bp;
+ }
+}
+
+V vasp_binop::a_float(F v) { arg.SetR(v); }
+
+V vasp_binop::a_double(I argc,t_atom *argv)
+{
+ if(
+ (argc == 1 && CanbeFloat(argv[0])) ||
+ (argc == 2 && CanbeFloat(argv[0]) && CanbeFloat(argv[1]))
+ ) {
+ arg.SetR((D)GetAFloat(argv[0])+(D)GetAFloat(argv[1]));
+ if(argchk) {
+ // check argument feasibility
+ }
+ }
+ else
+ post("%s - invalid double argument (ignored)",thisName());
+}
+
+V vasp_binop::a_int(I v) { arg.SetI(v); }
+
+V vasp_binop::a_complex(I argc,t_atom *argv)
+{
+ if(
+ (argc == 1 && CanbeFloat(argv[0])) ||
+ (argc == 2 && CanbeFloat(argv[0]) && CanbeFloat(argv[1]))
+ ) {
+ arg.SetCX(GetAFloat(argv[0]),GetAFloat(argv[1]));
+ if(argchk) {
+ // check argument feasibility
+ }
+ }
+ else
+ post("%s - invalid complex argument (ignored)",thisName());
+}
+
+V vasp_binop::a_vector(I argc,t_atom *argv)
+{
+ error("%s - vector type not implemented",thisName());
+}
+
+
+Vasp *vasp_binop::x_work() { return tx_work(arg); }
+
+Vasp *vasp_binop::tx_work(const Argument &arg)
+{
+ error("%s - no work method implemented",thisName());
+ return NULL;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// vasp_anyop class
+///////////////////////////////////////////////////////////////////////////
+
+
+vasp_anyop::vasp_anyop(I argc,t_atom *argv,const Argument &def,BL op,UL outcode):
+ vasp_tx(op)
+{
+ a_list(argc,argv);
+ if(arg.IsNone() && !def.IsNone()) arg = def;
+
+ AddInAnything(2);
+ AddOutAnything(1);
+ AddOutlets(outcode);
+
+ FLEXT_ADDMETHOD(1,a_list);
+ FLEXT_ADDMETHOD_(1,"vasp",a_list);
+ FLEXT_ADDMETHOD_(1,"radio",a_radio);
+}
+
+V vasp_anyop::a_list(I argc,t_atom *argv)
+{
+ if(argc) {
+ arg.SetList(argc,argv);
+ if(arg.IsNone())
+ post("%s - argument could not be evaluated (ignored)",thisName());
+ else if(argchk) {
+ // check argument feasibility
+ }
+ }
+ else {
+// post("%s - Empty list argument (ignored)",thisName());
+ }
+}
+
+Vasp *vasp_anyop::x_work() { return tx_work(arg); }
+
+Vasp *vasp_anyop::tx_work(const Argument &arg)
+{
+ error("%s - no work method implemented",thisName());
+ return NULL;
+}
+