aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/flext/source/flclass.h
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/flext/source/flclass.h')
-rw-r--r--externals/grill/flext/source/flclass.h1098
1 files changed, 0 insertions, 1098 deletions
diff --git a/externals/grill/flext/source/flclass.h b/externals/grill/flext/source/flclass.h
deleted file mode 100644
index 3da63719..00000000
--- a/externals/grill/flext/source/flclass.h
+++ /dev/null
@@ -1,1098 +0,0 @@
-/*
-
-flext - C++ layer for Max/MSP and pd (pure data) externals
-
-Copyright (c) 2001-2006 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-
-*/
-
-/*! \file flclass.h
- \brief User accessible flext base classes
-
-*/
-
-#ifndef __FLCLASS_H
-#define __FLCLASS_H
-
-// include the header file declaring the base classes
-#include "flbase.h"
-#include "flsupport.h"
-#include "flmap.h"
-#include "flinternal.h"
-
-#ifdef _MSC_VER
-#pragma warning(disable: 4786)
-#endif
-
-#ifdef __BORLANDC__
-#pragma warn -8008 // Condition is always false
-#pragma warn -8057 // Parameter is never used
-#pragma warn -8066 // Unreachable code
-#endif
-
-
-// === flext_base ==================================================
-
-/*! \brief Flext message only base object
-
- This is the base class from which typical external objects derive.
- DSP objects should use the flext_dsp class which inherits from flext_base and
- provides the necessary functionality.
-
- For a valid external object class you would also need FLEXT_HEADER, also if it's only
- a base class without instantiated objects again.
- To make an instance of an object class you would typically use FLEXT_NEW or
- its companions.
-
- See the flext_obj class for additional information.
-*/
-
-
-class FLEXT_SHARE FLEXT_CLASSDEF(flext_base);
-typedef class FLEXT_SHARE FLEXT_CLASSDEF(flext_base) flext_base;
-
-class FLEXT_SHARE FLEXT_CLASSDEF(flext_base):
- public flext_obj
-{
- FLEXT_HEADER_S(FLEXT_CLASSDEF(flext_base),flext_obj,Setup)
-
- friend class FLEXT_SHARE FLEXT_CLASSDEF(flext_obj);
-
-public:
-
-// --- inheritable virtual methods --------------------------------
-
- /*! \defgroup FLEXT_C_VIRTUAL Virtual base class functions
-
- @{
- */
-
- //! called on patcher load (not on mere object creation!)
- virtual void CbLoadbang();
- virtual void m_loadbang();
-
- //! called on (double-)click into object box
- virtual void CbClick();
-
- /*! \brief Called for every incoming message.
- All method handling is done in there
- \return True if a handler was found and called
- */
- virtual bool CbMethodHandler(int inlet,const t_symbol *s,int argc,const t_atom *argv);
-
- /*! \brief Called for every unhandled message (by CbMethodHandler)
- */
- virtual bool CbMethodResort(int inlet,const t_symbol *s,int argc,const t_atom *argv);
- virtual bool m_method_(int inlet,const t_symbol *s,int argc,const t_atom *argv);
-
-//! @} FLEXT_C_VIRTUAL
-
-
-// --- inlet/outlet stuff -----------------------------------------
-
- /*! \defgroup FLEXT_C_INOUT Flext in-/outlet functions
- \note These must be called in the class' constructor
- \note All (also default) inlets must be defined
- @{
- */
-
- /*! \defgroup FLEXT_C_IO_ADD Announce in-/outlet functions
- @{
- */
-
- // argument m specifies multiple inlet/outlet count
-
-// void AddInDef() { AddInlet(xlet_def,1); }
-
- /*! \brief Add inlet(s) for anythings
- \remark That's the one to choose for the left-most (first) inlet unless it's a signal inlet.
- */
- void AddInAnything(int m = 1) { AddInlet(xlet_any,m); }
- /*! \brief Add inlet(s) for anythings (with description)
- \remark That's the one to choose for the left-most (first) inlet unless it's a signal inlet.
- */
- void AddInAnything(const char *desc,int m = 1) { AddInlet(xlet_any,m,desc); }
- //! Add inlet(s) for floats
- void AddInFloat(int m = 1) { AddInlet(xlet_float,m); }
- //! Add inlet(s) for floats (with description)
- void AddInFloat(const char *desc,int m = 1) { AddInlet(xlet_float,m,desc); }
- //! Add inlet(s) for integers
- void AddInInt(int m = 1) { AddInlet(xlet_int,m); }
- //! Add inlet(s) for integers (with description)
- void AddInInt(const char *desc,int m = 1) { AddInlet(xlet_int,m,desc); }
- //! Add inlet(s) for symbols
- void AddInSymbol(int m = 1) { AddInlet(xlet_sym,m); }
- //! Add inlet(s) for symbol (with description)
- void AddInSymbol(const char *desc,int m = 1) { AddInlet(xlet_sym,m,desc); }
- //! Add inlet(s) for bang
- void AddInBang(int m = 1) { AddInlet(xlet_sym,m); }
- //! Add inlet(s) for bangs (with description)
- void AddInBang(const char *desc,int m = 1) { AddInlet(xlet_sym,m,desc); }
- //! Add inlet(s) for lists
- void AddInList(int m = 1) { AddInlet(xlet_list,m); }
- //! Add inlet(s) for lists (with description)
- void AddInList(const char *desc,int m = 1) { AddInlet(xlet_list,m,desc); }
-
- //! Add outlet(s) for anythings
- void AddOutAnything(int m = 1) { AddOutlet(xlet_any,m); }
- //! Add outlet(s) for anythings (with description)
- void AddOutAnything(const char *desc,int m = 1) { AddOutlet(xlet_any,m,desc); }
- //! Add outlet(s) for floats
- void AddOutFloat(int m = 1) { AddOutlet(xlet_float,m); }
- //! Add outlet(s) for floats (with description)
- void AddOutFloat(const char *desc,int m = 1) { AddOutlet(xlet_float,m,desc); }
- //! Add outlet(s) for integers
- void AddOutInt(int m = 1) { AddOutlet(xlet_int,m); }
- //! Add outlet(s) for integers (with description)
- void AddOutInt(const char *desc,int m = 1) { AddOutlet(xlet_int,m,desc); }
- //! Add outlet(s) for symbols
- void AddOutSymbol(int m = 1) { AddOutlet(xlet_sym,m); }
- //! Add outlet(s) for symbols (with description)
- void AddOutSymbol(const char *desc,int m = 1) { AddOutlet(xlet_sym,m,desc); }
- //! Add outlet(s) for bangs
- void AddOutBang(int m = 1) { AddOutlet(xlet_sym,m); }
- //! Add outlet(s) for bangs (with description)
- void AddOutBang(const char *desc,int m = 1) { AddOutlet(xlet_sym,m,desc); }
- //! Add outlet(s) for lists
- void AddOutList(int m = 1) { AddOutlet(xlet_list,m); }
- //! Add outlet(s) for lists (with description)
- void AddOutList(const char *desc,int m = 1) { AddOutlet(xlet_list,m,desc); }
-
- //! \deprecated inlets and outlets are now set up automatically
- bool SetupInOut() { return true; }
-
- //! @} FLEXT_C_IO_ADD
-
- /*! \defgroup FLEXT_C_IO_MISC Miscellanous in-/outlet functionality
- @{
- */
-
- //! Get number of inlets
- int CntIn() const { return incnt; }
- //! Get number of outlets
- int CntOut() const { return outcnt; }
- //! Get number of signal inlets
- int CntInSig() const { return insigs; }
- //! Get number of signal outlets
- int CntOutSig() const { return outsigs; }
-
-
- //! Retrieve currently processed message tag (NULL if no message processing)
- static const t_symbol *thisTag() { return curtag; }
-
- class outlet;
-
- //! Get pointer to outlet (not in the constructor!)
- outlet *GetOut(int ix) const { return outlets[ix]; }
-
- int GetOutAttr() const { return HasAttributes()?CntOut():0; }
-
- //! @} FLEXT_C_IO_MISC
-
- /*! \defgroup FLEXT_C_IO_OUT Output data to inlets/outlets
- @{
- */
-
- // output messages
-
- //! Output bang (index n starts with 0)
- void ToOutBang(int n) const;
-
- //! Output float (index n starts with 0)
- void ToOutFloat(int n,float f) const;
-
- //! Output integer (index n starts with 0)
- void ToOutInt(int n,int f) const;
-
- //! Output boolean (index n starts with 0)
- void ToOutBool(int n,bool f) const { ToOutInt(n,f?1:0); }
-
- //! Output symbol (index n starts with 0)
- void ToOutSymbol(int n,const t_symbol *s) const;
- //! Output string aka symbol (index n starts with 0)
- void ToOutString(int n,const char *s) const { ToOutSymbol(n,MakeSymbol(s)); }
-
- //! Output atom (index n starts with 0)
- void ToOutAtom(int n,const t_atom &at) const;
-
- //! Output list (index n starts with 0)
- void ToOutList(int n,int argc,const t_atom *argv) const;
- //! Output list (index n starts with 0)
- void ToOutList(int n,const AtomList &list) const { ToOutList(n,list.Count(),list.Atoms()); }
-
- //! Output anything (index n starts with 0)
- void ToOutAnything(int n,const t_symbol *s,int argc,const t_atom *argv) const;
- //! Output anything (index n starts with 0)
- void ToOutAnything(int n,const AtomAnything &any) const { ToOutAnything(n,any.Header(),any.Count(),any.Atoms()); }
- //! Output anything (index n starts with 0)
- void ToOutAnything(int n,const t_symbol *s,const AtomList &list) const { ToOutAnything(n,s,list.Count(),list.Atoms()); }
-
- //! @} FLEXT_C_IO_OUT
-
- /*! \defgroup FLEXT_C_IO_QUEUE Low-priority output of data to inlets/outlets
- @{
- */
-
- //! Output low priority bang (index n starts with 0)
- void ToQueueBang(int n) const;
-
- //! Output low priority float (index n starts with 0)
- void ToQueueFloat(int n,float f) const;
-
- //! Output low priority integer (index n starts with 0)
- void ToQueueInt(int n,int f) const;
-
- //! Output low priority boolean (index n starts with 0)
- void ToQueueBool(int n,bool f) const { ToQueueInt(n,f?1:0); }
-
- //! Output low priority symbol (index n starts with 0)
- void ToQueueSymbol(int n,const t_symbol *s) const;
- //! Output low priority string aka symbol (to appointed outlet)
- void ToQueueString(int n,const char *s) const { ToQueueSymbol(n,MakeSymbol(s)); }
-
- //! Output low priority atom (index n starts with 0)
- void ToQueueAtom(int n,const t_atom &at) const;
-
- //! Output low priority list (index n starts with 0)
- void ToQueueList(int n,int argc,const t_atom *argv) const;
- //! Output low priority list (index n starts with 0)
- void ToQueueList(int n,const AtomList &list) const { ToQueueList(n,list.Count(),list.Atoms()); }
-
- //! Output low priority anything (index n starts with 0)
- void ToQueueAnything(int n,const t_symbol *s,int argc,const t_atom *argv) const;
- //! Output low priority anything (index n starts with 0)
- void ToQueueAnything(int n,const AtomAnything &any) const { ToQueueAnything(n,any.Header(),any.Count(),any.Atoms()); }
-
- //! @} FLEXT_C_IO_QUEUE
-
-
- /*! \defgroup FLEXT_C_IO_SELF Output of data to inlets/outlets of this object
- @{
- */
-
- //! Send bang to self (inlet n)
- void ToSelfBang(int n) const { ToQueueBang(-1-n); }
-
- //! Send float to self (inlet n)
- void ToSelfFloat(int n,float f) const { ToQueueFloat(-1-n,f); }
-
- //! Send integer to self (inlet n)
- void ToSelfInt(int n,int f) const { ToQueueInt(-1-n,f); }
-
- //! Send boolean to self (inlet n)
- void ToSelfBool(int n,bool f) const { ToSelfInt(n,f?1:0); }
-
- //! Send symbol to self (inlet n)
- void ToSelfSymbol(int n,const t_symbol *s) const { ToQueueSymbol(-1-n,s); }
- //! Send string aka symbol to self (inlet 0)
- void ToSelfString(int n,const char *s) const { ToSelfSymbol(n,MakeSymbol(s)); }
-
- //! Output atom (index n starts with 0)
- void ToSelfAtom(int n,const t_atom &at) const { ToQueueAtom(-1-n,at); }
-
- //! Send list to self (inlet n)
- void ToSelfList(int n,int argc,const t_atom *argv) const { ToQueueList(-1-n,argc,argv); }
- //! Send list to self (inlet n)
- void ToSelfList(int n,const AtomList &list) const { ToSelfList(n,list.Count(),list.Atoms()); }
-
- //! Send anything to self (inlet n)
- void ToSelfAnything(int n,const t_symbol *s,int argc,const t_atom *argv) const { ToQueueAnything(-1-n,s,argc,argv); }
- //! Send anything to self (inlet n)
- void ToSelfAnything(int n,const AtomAnything &any) const { ToSelfAnything(n,any.Header(),any.Count(),any.Atoms()); }
-
- //! @} FLEXT_C_IO_SELF
-
-
- /*! \defgroup FLEXT_C_IO_MESSAGEBUNDLE Output of data via message bundles
-
- These are used to assure the sending of several messages from a second thread to the same logical time
-
- @{
- */
-
- //! Output bang (index n starts with 0)
- void MsgAddBang(MsgBundle *mb,int n) const;
-
- //! Output float (index n starts with 0)
- void MsgAddFloat(MsgBundle *mb,int n,float f) const;
-
- //! Output integer (index n starts with 0)
- void MsgAddInt(MsgBundle *mb,int n,int f) const;
-
- //! Output boolean (index n starts with 0)
- void MsgAddBool(MsgBundle *mb,int n,bool f) const { MsgAddInt(mb,n,f?1:0); }
-
- //! Output symbol (index n starts with 0)
- void MsgAddSymbol(MsgBundle *mb,int n,const t_symbol *s) const;
- //! Output string aka symbol (to appointed outlet)
- void MsgAddString(MsgBundle *mb,int n,const char *s) const { MsgAddSymbol(mb,n,MakeSymbol(s)); }
-
- //! Output atom (index n starts with 0)
- void MsgAddAtom(MsgBundle *mb,int n,const t_atom &at) const;
-
- //! Output list (index n starts with 0)
- void MsgAddList(MsgBundle *mb,int n,int argc,const t_atom *argv) const;
- //! Output list (index n starts with 0)
- void MsgAddList(MsgBundle *mb,int n,const AtomList &list) const { MsgAddList(mb,n,list.Count(),list.Atoms()); }
-
- //! Output anything (index n starts with 0)
- void MsgAddAnything(MsgBundle *mb,int n,const t_symbol *s,int argc,const t_atom *argv) const;
- //! Output anything (index n starts with 0)
- void MsgAddAnything(MsgBundle *mb,int n,const AtomAnything &any) const { MsgAddAnything(mb,n,any.Header(),any.Count(),any.Atoms()); }
-
- void MsgSelfBang(MsgBundle *mb,int n) const { MsgAddBang(mb,-1-n); }
-
- //! Send float to self (inlet n)
- void MsgSelfFloat(MsgBundle *mb,int n,float f) const { MsgAddFloat(mb,-1-n,f); }
-
- //! Send integer to self (inlet n)
- void MsgSelfInt(MsgBundle *mb,int n,int f) const { MsgAddInt(mb,-1-n,f); }
-
- //! Send boolean to self (inlet n)
- void MsgSelfBool(MsgBundle *mb,int n,bool f) const { MsgSelfInt(mb,n,f?1:0); }
-
- //! Send symbol to self (inlet n)
- void MsgSelfSymbol(MsgBundle *mb,int n,const t_symbol *s) const { MsgAddSymbol(mb,-1-n,s); }
- //! Send string aka symbol to self (inlet 0)
- void MsgSelfString(MsgBundle *mb,int n,const char *s) const { MsgSelfSymbol(mb,n,MakeSymbol(s)); }
-
- //! Output atom (index n starts with 0)
- void MsgSelfAtom(MsgBundle *mb,int n,const t_atom &at) const { MsgAddAtom(mb,-1-n,at); }
-
- //! Send list to self (inlet n)
- void MsgSelfList(MsgBundle *mb,int n,int argc,const t_atom *argv) const { MsgAddList(mb,-1-n,argc,argv); }
- //! Send list to self (inlet n)
- void MsgSelfList(MsgBundle *mb,int n,const AtomList &list) const { MsgSelfList(mb,n,list.Count(),list.Atoms()); }
-
- //! Send anything to self (inlet n)
- void MsgSelfAnything(MsgBundle *mb,int n,const t_symbol *s,int argc,const t_atom *argv) const { MsgAddAnything(mb,-1-n,s,argc,argv); }
- //! Send anything to self (inlet n)
- void MsgSelfAnything(MsgBundle *mb,int n,const AtomAnything &any) const { MsgSelfAnything(mb,n,any.Header(),any.Count(),any.Atoms()); }
-
- //! @} FLEXT_C_IO_MESSAGEBUNDLE
-
-//! @} FLEXT_C_INOUT
-
-
-// --- message handling -------------------------------------------
-
- enum metharg {
- a_null = 0,
- a_float,a_int,a_bool,
- a_symbol,a_pointer,
- a_list,a_any, // (t_symbol *) / int / t_atom *
- a_LIST,a_ANY // AtomList, AtomAnything
- };
-
- typedef bool (*methfun)(flext_base *c);
-
- /*! \defgroup FLEXT_C_ADDMETHOD Method handling (object scope)
- \internal
- @{
- */
-
- void AddMethodDef(int inlet,const t_symbol *tag = NULL) { ThMeths()->Add(new MethItem,tag,inlet); }
- void AddMethodDef(int inlet,const char *tag = NULL) { AddMethodDef(inlet,MakeSymbol(tag)); }
-
- void AddMethod(int inlet,bool (*m)(flext_base *)) { AddMethod(ThMeths(),inlet,sym_bang,(methfun)m,a_null); }
- void AddMethod(int inlet,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(ThMeths(),inlet,sym_list,(methfun)m,a_list,a_null); }
- void AddMethod(int inlet,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(ThMeths(),inlet,sym_list,(methfun)m,a_list,a_null); }
- void AddMethod(int inlet,const t_symbol *tag,bool (*m)(flext_base *)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_null); } // pure method
- void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *)) { AddMethod(inlet,MakeSymbol(tag),m); }
- void AddMethod(int inlet,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(ThMeths(),inlet,sym_anything,(methfun)m,a_any,a_null); } // anything
- void AddMethod(int inlet,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(ThMeths(),inlet,sym_anything,(methfun)m,a_any,a_null); } // anything
- void AddMethod(int inlet,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(ThMeths(),inlet,sym_symbol,(methfun)m,a_symbol,a_null); } // single symbol
- void AddMethod(int inlet,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(ThMeths(),inlet,sym_symbol,(methfun)m,a_symbol,a_null); } // single symbol
- void AddMethod(int inlet,bool (*m)(flext_base *,float &)) { AddMethod(ThMeths(),inlet,sym_float,(methfun)m,a_float,a_null); } // single float
- void AddMethod(int inlet,bool (*m)(flext_base *,float &,float &)) { AddMethod(ThMeths(),inlet,sym_list,(methfun)m,a_float,a_float,a_null); } // list of 2 floats
- void AddMethod(int inlet,bool (*m)(flext_base *,float &,float &,float &)) { AddMethod(ThMeths(),inlet,sym_list,(methfun)m,a_float,a_float,a_float,a_null); } // list of 3 floats
-#if FLEXT_SYS == FLEXT_SYS_PD
- void AddMethod(int inlet,bool (*m)(flext_base *,int &)) { AddMethod(ThMeths(),inlet,sym_float,(methfun)m,a_int,a_null); } // single float
-#else
- void AddMethod(int inlet,bool (*m)(flext_base *,int &)) { AddMethod(ThMeths(),inlet,sym_int,(methfun)m,a_int,a_null); } // single float
-#endif
- void AddMethod(int inlet,bool (*m)(flext_base *,int &,int &)) { AddMethod(ThMeths(),inlet,sym_list,(methfun)m,a_int,a_int,a_null); } // list of 2 floats
- void AddMethod(int inlet,bool (*m)(flext_base *,int &,int &,int &)) { AddMethod(ThMeths(),inlet,sym_list,(methfun)m,a_int,a_int,a_int,a_null); } // list of 3 floats
- void AddMethod(int inlet,const t_symbol *tag,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_list,a_null); } // method+gimme
- void AddMethod(int inlet,const t_symbol *tag,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_list,a_null); } // method+gimme
- void AddMethod(int inlet,const t_symbol *tag,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_any,a_null); } // method+gimme
- void AddMethod(int inlet,const t_symbol *tag,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_any,a_null); } // method+gimme
- void AddMethod(int inlet,const t_symbol *tag,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_symbol,a_null); } // method+symbol
- void AddMethod(int inlet,const t_symbol *tag,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_symbol,a_null); } // method+symbol
- void AddMethod(int inlet,const t_symbol *tag,bool (*m)(flext_base *,float &)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_float,a_null); } // method+float
- void AddMethod(int inlet,const t_symbol *tag,bool (*m)(flext_base *,int &)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_int,a_null); } // method+int
- void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(inlet,MakeSymbol(tag),m); }
- void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(inlet,MakeSymbol(tag),m); }
- void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(inlet,MakeSymbol(tag),m); }
- void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(inlet,MakeSymbol(tag),m); }
- void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(inlet,MakeSymbol(tag),m); }
- void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(inlet,MakeSymbol(tag),m); }
- void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,float &)) { AddMethod(inlet,MakeSymbol(tag),m); }
- void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,int &)) { AddMethod(inlet,MakeSymbol(tag),m); }
-
- //! Set Max/MSP style of distributing list elements over (message) inlets
- static void SetDist(t_classid c,bool d = true);
- //! Query whether lists are distributed
- bool DoDist() const;
-
-
-//! @} FLEXT_C_ADDMETHOD
-
- /*! \defgroup FLEXT_C_CADDMETHOD Method handling (class scope)
- \internal
- @{
- */
-
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *)) { AddMethod(ClMeths(c),inlet,sym_bang,(methfun)m,a_null); }
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(ClMeths(c),inlet,sym_list,(methfun)m,a_list,a_null); }
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(ClMeths(c),inlet,sym_list,(methfun)m,a_list,a_null); }
- static void AddMethod(t_classid c,int inlet,const t_symbol *tag,bool (*m)(flext_base *)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_null); } // pure method
- static void AddMethod(t_classid c,int inlet,const char *tag,bool (*m)(flext_base *)) { AddMethod(c,inlet,MakeSymbol(tag),m); }
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(ClMeths(c),inlet,sym_anything,(methfun)m,a_any,a_null); } // anything
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(ClMeths(c),inlet,sym_anything,(methfun)m,a_any,a_null); } // anything
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(ClMeths(c),inlet,sym_symbol,(methfun)m,a_symbol,a_null); } // single symbol
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(ClMeths(c),inlet,sym_symbol,(methfun)m,a_symbol,a_null); } // single symbol
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,float &)) { AddMethod(ClMeths(c),inlet,sym_float,(methfun)m,a_float,a_null); } // single float
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,float &,float &)) { AddMethod(ClMeths(c),inlet,sym_list,(methfun)m,a_float,a_float,a_null); } // list of 2 floats
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,float &,float &,float &)) { AddMethod(ClMeths(c),inlet,sym_list,(methfun)m,a_float,a_float,a_float,a_null); } // list of 3 floats
-#if FLEXT_SYS == FLEXT_SYS_PD
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,int &)) { AddMethod(ClMeths(c),inlet,sym_float,(methfun)m,a_int,a_null); } // single integer
-#else
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,int &)) { AddMethod(ClMeths(c),inlet,sym_int,(methfun)m,a_int,a_null); } // single integer
-#endif
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,int &,int &)) { AddMethod(ClMeths(c),inlet,sym_list,(methfun)m,a_int,a_int,a_null); } // list of 2 floats
- static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,int &,int &,int &)) { AddMethod(ClMeths(c),inlet,sym_list,(methfun)m,a_int,a_int,a_int,a_null); } // list of 3 floats
- static void AddMethod(t_classid c,int inlet,const t_symbol *tag,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_list,a_null); } // method+gimme
- static void AddMethod(t_classid c,int inlet,const t_symbol *tag,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_list,a_null); } // method+gimme
- static void AddMethod(t_classid c,int inlet,const t_symbol *tag,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_any,a_null); } // method+gimme
- static void AddMethod(t_classid c,int inlet,const t_symbol *tag,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_any,a_null); } // method+gimme
- static void AddMethod(t_classid c,int inlet,const t_symbol *tag,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_symbol,a_null); } // method+symbol
- static void AddMethod(t_classid c,int inlet,const t_symbol *tag,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_symbol,a_null); } // method+symbol
- static void AddMethod(t_classid c,int inlet,const t_symbol *tag,bool (*m)(flext_base *,float &)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_float,a_null); } // method+float
- static void AddMethod(t_classid c,int inlet,const t_symbol *tag,bool (*m)(flext_base *,int &)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_int,a_null); } // method+int
- static void AddMethod(t_classid c,int inlet,const char *tag,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(c,inlet,MakeSymbol(tag),m); }
- static void AddMethod(t_classid c,int inlet,const char *tag,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(c,inlet,MakeSymbol(tag),m); }
- static void AddMethod(t_classid c,int inlet,const char *tag,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(c,inlet,MakeSymbol(tag),m); }
- static void AddMethod(t_classid c,int inlet,const char *tag,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(c,inlet,MakeSymbol(tag),m); }
- static void AddMethod(t_classid c,int inlet,const char *tag,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(c,inlet,MakeSymbol(tag),m); }
- static void AddMethod(t_classid c,int inlet,const char *tag,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(c,inlet,MakeSymbol(tag),m); }
- static void AddMethod(t_classid c,int inlet,const char *tag,bool (*m)(flext_base *,float &)) { AddMethod(c,inlet,MakeSymbol(tag),m); }
- static void AddMethod(t_classid c,int inlet,const char *tag,bool (*m)(flext_base *,int &)) { AddMethod(c,inlet,MakeSymbol(tag),m); }
-
-//! @} FLEXT_C_CADDMETHOD
-
-// --- bind/unbind ---------------------------------------
-
- /*! \defgroup FLEXT_C_BIND Methods for binding a flext class to a symbol
-
- @{
- */
-
- //! Bind object to a symbol
- bool Bind(const t_symbol *sym);
- //! Unbind object from a symbol
- bool Unbind(const t_symbol *sym);
-
- //! Bind object to a symbol (as string)
- bool Bind(const char *sym) { return Bind(MakeSymbol(sym)); }
- //! Unbind object from a symbol (as string)
- bool Unbind(const char *sym) { return Unbind(MakeSymbol(sym)); }
-
- /*! \brief Bind a method to a symbol
- \param sym Symbol to bind to
- \param meth Function to bind
- \param data User data that is passed to the function
- \return true on success
- */
- bool BindMethod(const t_symbol *sym,bool (*meth)(flext_base *obj,t_symbol *sym,int argc,t_atom *argv,void *data),void *data = NULL);
- /*! \brief Unbind a method from a symbol
- \param sym Symbol to unbind from (if NULL... unbind all functions)
- \param meth Method to unbind (if NULL ... unbind all functions bound to symbol)
- \param data returns data pointer specified with BindMethod
- \return true on success
- */
- bool UnbindMethod(const t_symbol *sym,bool (*meth)(flext_base *obj,t_symbol *sym,int argc,t_atom *argv,void *data) = NULL,void **data = NULL);
- /*! \brief Get data of bound method of a symbol
- \param sym Symbol to bind to
- \param meth Function to bind
- \param data Reference to returned user data
- \return true on success (symbol/method combination was found)
- */
- bool GetBoundMethod(const t_symbol *sym,bool (*meth)(flext_base *obj,t_symbol *sym,int argc,t_atom *argv,void *data),void *&data);
-
- //! \brief Bind a method to a symbol (as string)
- bool BindMethod(const char *sym,bool (*meth)(flext_base *obj,t_symbol *sym,int argc,t_atom *argv,void *data),void *data = NULL) { return BindMethod(MakeSymbol(sym),meth,data); }
- //! \brief Unbind a method from a symbol (as string)
- bool UnbindMethod(const char *sym,bool (*meth)(flext_base *obj,t_symbol *sym,int argc,t_atom *argv,void *data) = NULL,void **data = NULL) { return UnbindMethod(MakeSymbol(sym),meth,data); }
- //! \brief Get data of bound method of a symbol (as string)
- bool GetBoundMethod(const char *sym,bool (*meth)(flext_base *obj,t_symbol *sym,int argc,t_atom *argv,void *data),void *&data) { return GetBoundMethod(MakeSymbol(sym),meth,data); }
-
- /*! Unbind all symbol bindings
- \note Memory associated to data pointers passed by BindMethod will not be freed!
- */
- bool UnbindAll();
-
-//! @} FLEXT_C_BIND
-
- // --- thread stuff -----------------------------------------------
-
-#ifdef FLEXT_THREADS
- /*! \defgroup FLEXT_C_THREAD Thread handling
-
- @{
- */
-
- //! Start a thread for this object
- bool StartThread(void (*meth)(thr_params *p),thr_params *p,const char * = NULL) { p->cl = this; return flext::LaunchThread(meth,p); }
-
- //! Terminate all threads of this object
- bool StopThreads();
-#endif // FLEXT_THREADS
-
-//! @} FLEXT_C_THREAD
-
-// xxx internal stuff xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-
-public: // needed by VC++ 6
-
- enum xlettype {
- xlet_none = 0,
- xlet_float,xlet_int,xlet_sym,xlet_list,xlet_any,
- xlet_LIST,xlet_ANY, // use AtomList and AtomAnything
- xlet_sig
- };
-
-protected:
-
- FLEXT_CLASSDEF(flext_base)();
-
- /*! \brief Set up inlets and outlets, method and attribute lists
- */
- virtual bool Init();
-
- /*! \brief Deallocate all kinds of stuff
- */
- virtual void Exit();
-
-
- /*! \defgroup FLEXT_C_ATTR Attribute handling methods (object scope)
- @{
- */
-
- void AddAttrib(const t_symbol *attr,bool (*get)(flext_base *,float &),bool (*set)(flext_base *,float &)) { AddAttrib(attr,a_float,(methfun)get,(methfun)set); }
- void AddAttrib(const t_symbol *attr,bool (*get)(flext_base *,int &),bool (*set)(flext_base *,int &)) { AddAttrib(attr,a_int,(methfun)get,(methfun)set); }
- void AddAttrib(const t_symbol *attr,bool (*get)(flext_base *,bool &),bool (*set)(flext_base *,bool &)) { AddAttrib(attr,a_bool,(methfun)get,(methfun)set); }
- void AddAttrib(const t_symbol *attr,bool (*get)(flext_base *,const t_symbol *&),bool (*set)(flext_base *,const t_symbol *&)) { AddAttrib(attr,a_symbol,(methfun)get,(methfun)set); }
- void AddAttrib(const t_symbol *attr,bool (*get)(flext_base *,t_symptr &),bool (*set)(flext_base *,t_symptr &)) { AddAttrib(attr,a_symbol,(methfun)get,(methfun)set); }
- void AddAttrib(const t_symbol *attr,bool (*get)(flext_base *,AtomList *&),bool (*set)(flext_base *,AtomList *&)) { AddAttrib(attr,a_LIST,(methfun)get,(methfun)set); }
- void AddAttrib(const t_symbol *attr,bool (*get)(flext_base *,AtomAnything *&),bool (*set)(flext_base *,AtomAnything *&)) { AddAttrib(attr,a_ANY,(methfun)get,(methfun)set); }
- void AddAttrib(const char *attr,bool (*get)(flext_base *,float &),bool (*set)(flext_base *,float &)) { AddAttrib(MakeSymbol(attr),get,set); }
- void AddAttrib(const char *attr,bool (*get)(flext_base *,int &),bool (*set)(flext_base *,int &)) { AddAttrib(MakeSymbol(attr),get,set); }
- void AddAttrib(const char *attr,bool (*get)(flext_base *,bool &),bool (*set)(flext_base *,bool &)) { AddAttrib(MakeSymbol(attr),get,set); }
- void AddAttrib(const char *attr,bool (*get)(flext_base *,const t_symbol *&),bool (*set)(flext_base *,const t_symbol *&)) { AddAttrib(MakeSymbol(attr),get,set); }
- void AddAttrib(const char *attr,bool (*get)(flext_base *,t_symptr &),bool (*set)(flext_base *,t_symptr &)) { AddAttrib(MakeSymbol(attr),get,set); }
- void AddAttrib(const char *attr,bool (*get)(flext_base *,AtomList *&),bool (*set)(flext_base *,AtomList *&)) { AddAttrib(MakeSymbol(attr),get,set); }
- void AddAttrib(const char *attr,bool (*get)(flext_base *,AtomAnything *&),bool (*set)(flext_base *,AtomAnything *&)) { AddAttrib(MakeSymbol(attr),get,set); }
-
-//! @} FLEXT_C_ATTR
-
- /*! \defgroup FLEXT_C_CATTR Attribute handling methods (class scope)
- @{
- */
-
- static void AddAttrib(t_classid c,const t_symbol *attr,bool (*get)(flext_base *,float &),bool (*set)(flext_base *,float &)) { AddAttrib(c,attr,a_float,(methfun)get,(methfun)set); }
- static void AddAttrib(t_classid c,const t_symbol *attr,bool (*get)(flext_base *,int &),bool (*set)(flext_base *,int &)) { AddAttrib(c,attr,a_int,(methfun)get,(methfun)set); }
- static void AddAttrib(t_classid c,const t_symbol *attr,bool (*get)(flext_base *,bool &),bool (*set)(flext_base *,bool &)) { AddAttrib(c,attr,a_bool,(methfun)get,(methfun)set); }
- static void AddAttrib(t_classid c,const t_symbol *attr,bool (*get)(flext_base *,const t_symbol *&),bool (*set)(flext_base *,const t_symbol *&)) { AddAttrib(c,attr,a_symbol,(methfun)get,(methfun)set); }
- static void AddAttrib(t_classid c,const t_symbol *attr,bool (*get)(flext_base *,t_symptr &),bool (*set)(flext_base *,t_symptr &)) { AddAttrib(c,attr,a_symbol,(methfun)get,(methfun)set); }
- static void AddAttrib(t_classid c,const t_symbol *attr,bool (*get)(flext_base *,AtomList *&),bool (*set)(flext_base *,AtomList *&)) { AddAttrib(c,attr,a_LIST,(methfun)get,(methfun)set); }
- static void AddAttrib(t_classid c,const t_symbol *attr,bool (*get)(flext_base *,AtomAnything *&),bool (*set)(flext_base *,AtomAnything *&)) { AddAttrib(c,attr,a_ANY,(methfun)get,(methfun)set); }
- static void AddAttrib(t_classid c,const char *attr,bool (*get)(flext_base *,float &),bool (*set)(flext_base *,float &)) { AddAttrib(c,MakeSymbol(attr),get,set); }
- static void AddAttrib(t_classid c,const char *attr,bool (*get)(flext_base *,int &),bool (*set)(flext_base *,int &)) { AddAttrib(c,MakeSymbol(attr),get,set); }
- static void AddAttrib(t_classid c,const char *attr,bool (*get)(flext_base *,bool &),bool (*set)(flext_base *,bool &)) { AddAttrib(c,MakeSymbol(attr),get,set); }
- static void AddAttrib(t_classid c,const char *attr,bool (*get)(flext_base *,const t_symbol *&),bool (*set)(flext_base *,const t_symbol *&)) { AddAttrib(c,MakeSymbol(attr),get,set); }
- static void AddAttrib(t_classid c,const char *attr,bool (*get)(flext_base *,t_symptr &),bool (*set)(flext_base *,t_symptr &)) { AddAttrib(c,MakeSymbol(attr),get,set); }
- static void AddAttrib(t_classid c,const char *attr,bool (*get)(flext_base *,AtomList *&),bool (*set)(flext_base *,AtomList *&)) { AddAttrib(c,MakeSymbol(attr),get,set); }
- static void AddAttrib(t_classid c,const char *attr,bool (*get)(flext_base *,AtomAnything *&),bool (*set)(flext_base *,AtomAnything *&)) { AddAttrib(c,MakeSymbol(attr),get,set); }
-
-//! @} FLEXT_C_CATTR
-
- //! Dump an attribute to the attribute outlet
- bool DumpAttrib(const t_symbol *attr) const;
- //! Dump an attribute to the attribute outlet
- bool DumpAttrib(const char *attr) const { return DumpAttrib(MakeSymbol(attr)); }
-
- // check for attribute symbol @
- static int CheckAttrib(int argc,const t_atom *argv);
- // check for attribute symbol @
- static int CheckAttrib(const AtomList &args,int offset = 0) { return CheckAttrib(args.Count()-offset,args.Atoms()+offset)+offset; }
-
- //! List attributes
- bool ListAttrib() const;
- //! List attributes
- void ListAttrib(AtomList &a) const;
- //! Get an attribute value
- bool GetAttrib(const t_symbol *s,AtomList &a) const;
- //! Set an attribute value
- bool SetAttrib(const t_symbol *s,int argc,const t_atom *argv);
- //! Set an attribute value
- bool SetAttrib(const t_symbol *s,const AtomList &a) { return SetAttrib(s,a.Count(),a.Atoms()); }
-
- // get and set the attribute
- bool BangAttrib(const t_symbol *a);
- // get and set the attribute
- bool BangAttrib(const char *a) { return BangAttrib(MakeSymbol(a)); }
- // get and set all (both get- and settables)
- bool BangAttribAll();
- // show/hide the attribute
- bool ShowAttrib(const t_symbol *a,bool show) const;
- // show/hide the attribute
- bool ShowAttrib(const char *a,bool show) { return ShowAttrib(MakeSymbol(a),show); }
-
- //! List methods
- void ListMethods(AtomList &a,int inlet = 0) const;
-
-/*! \addtogroup FLEXT_C_INOUT
- @{
-*/
-
- //! \brief get a code for a list of inlets or outlets
- unsigned long XletCode(xlettype tp = xlet_none,...); // end list with 0 (= tp_none) !!
-
- /*! \brief Add some inlets by a special code representing the types
- \remark use XletCode function to get code value
- */
- void AddInlets(unsigned long code);
-
- //! \brief Add one or more inlet(s)
- void AddInlet(xlettype tp,int mult = 1,const char *desc = NULL);
-
- /*! \brief Add some inlets by a special code representing the types
- \remark use XletCode function to get code value
- */
- void AddOutlets(unsigned long code);
-
- //! \brief Add one or more outlet(s)
- void AddOutlet(xlettype tp,int mult = 1,const char *desc = NULL);
-
- //! \brief Set the description of an indexed inlet
- void DescInlet(int ix,const char *desc);
-
- //! \brief Set the description of an indexed outlet
- void DescOutlet(int ix,const char *desc);
-
-//! @} FLEXT_C_INOUT
-
-
-// method handling
-
- public:
-
- class AttrItem;
-
- class Item
- {
- public:
- Item(AttrItem *a): attr(a),nxt(NULL) {}
- virtual ~Item();
-
- bool IsAttr() const { return attr != NULL; }
-
- AttrItem *attr;
- Item *nxt;
- };
-
- class ItemSet
- :public TablePtrMap<const t_symbol *,Item *,8>
- {
- public:
- virtual ~ItemSet();
- virtual void clear();
- };
-
- /*! This class holds hashed item entries
- \note not thread-safe!
- */
- class FLEXT_SHARE ItemCont
- {
- public:
- ItemCont();
- ~ItemCont();
-
- int Min() const { return -1; }
- int Max() const { return size-2; }
-
- bool Contained(int i) const { return i+1 < size; }
-
- //! Add an entry
- void Add(Item *it,const t_symbol *tag,int inlet = 0);
- //! Remove an entry
- bool Remove(Item *it,const t_symbol *tag,int inlet,bool free);
- //! Find an entry list in the Item array
- Item *FindList(const t_symbol *tag,int inlet = 0);
-
- //! Get list for an inlet
- ItemSet &GetInlet(int inlet = 0)
- {
- FLEXT_ASSERT(inlet >= Min() && inlet <= Max());
- return *cont[inlet+1];
- }
-
- //! Get counter for total members (for index of new item)
- int Members() const { return members; }
-
- protected:
-
- void Resize(int nsz);
-
- int members;
- int memsize,size;
- ItemSet **cont;
- };
-
- //! \brief This represents an item of the method list
- class MethItem:
- public Item
- {
- public:
- MethItem(AttrItem *conn = NULL);
- virtual ~MethItem();
-
- void SetArgs(methfun fun,int argc,metharg *args);
-
- int index;
- int argc;
- metharg *args;
- methfun fun;
- };
-
- //! \brief This represents an item of the attribute list
- class AttrItem:
- public Item
- {
- public:
- AttrItem(const t_symbol *tag,metharg tp,methfun fun,int flags);
-
- enum {
- afl_get = 0x01, afl_set = 0x02,
- afl_getset = afl_get|afl_set,
- afl_shown = 0x08
- };
-
- bool IsGet() const { return (flags&afl_getset) == afl_get; }
- bool IsSet() const { return (flags&afl_getset) == afl_set; }
- bool IsShown() const { return (flags&afl_shown) != 0; }
- bool BothExist() const { return counter != NULL; }
- AttrItem *Counterpart() { return counter; }
-
- int index;
- int flags;
- metharg argtp;
- methfun fun;
- AttrItem *counter;
- const t_symbol *tag;
- };
-
- //! Represent a data value of an attribute
- class AttrData:
- public flext_root
- {
- public:
- AttrData(): flags(0) {}
-
- enum { afl_save = 0x01,afl_init = 0x02,afl_inited = 0x04 };
-
- void SetSave(bool s) { if(s) flags |= afl_save; else flags &= ~afl_save; }
- bool IsSaved() const { return (flags&afl_save) != 0; }
- void SetInit(bool s) { if(s) flags |= afl_init; else flags &= ~afl_init; }
- bool IsInit() const { return (flags&afl_init) != 0; }
- void SetInitValue(int argc,const t_atom *argv) { init(argc,argv); flags |= afl_inited; }
- void SetInitValue(const AtomList &l) { SetInitValue(l.Count(),l.Atoms()); }
- bool IsInitValue() const { return (flags&afl_inited) != 0; }
- const AtomList &GetInitValue() const { return init; }
-
- AtomList init;
- int flags;
- };
-
- class AttrDataCont
- :public TablePtrMap<const t_symbol *,AttrData *,8>
- {
- public:
- virtual ~AttrDataCont();
- virtual void clear();
- };
-
- // these outlet functions don't check for thread but send directly to the real-time system
- void ToSysBang(int n) const { outlet *o = GetOut(n); if(o) { CRITON(); outlet_bang((t_outlet *)o); CRITOFF(); } }
- void ToSysFloat(int n,float f) const { outlet *o = GetOut(n); if(o) { CRITON(); outlet_float((t_outlet *)o,f); CRITOFF(); } }
- void ToSysInt(int n,int f) const { outlet *o = GetOut(n); if(o) { CRITON(); outlet_flint((t_outlet *)o,f); CRITOFF(); } }
- void ToSysSymbol(int n,const t_symbol *s) const { outlet *o = GetOut(n); if(o) { CRITON(); outlet_symbol((t_outlet *)o,const_cast<t_symbol *>(s)); CRITOFF(); } }
- void ToSysString(int n,const char *s) const { ToSysSymbol(n,MakeSymbol(s)); }
- void ToSysList(int n,int argc,const t_atom *argv) const { outlet *o = GetOut(n); if(o) { CRITON(); outlet_list((t_outlet *)o,const_cast<t_symbol *>(sym_list),argc,(t_atom *)argv); CRITOFF(); } }
- void ToSysList(int n,const AtomList &list) const { ToSysList(n,list.Count(),list.Atoms()); }
- void ToSysAnything(int n,const t_symbol *s,int argc,const t_atom *argv) const { outlet *o = GetOut(n); if(o) { CRITON(); outlet_anything((t_outlet *)o,const_cast<t_symbol *>(s),argc,(t_atom *)argv); CRITOFF(); } }
- void ToSysAnything(int n,const AtomAnything &any) const { ToSysAnything(n,any.Header(),any.Count(),any.Atoms()); }
- void ToSysAnything(int n,const t_symbol *s,const AtomList &list) const { ToSysAnything(n,s,list.Count(),list.Atoms()); }
-
- void ToSysBool(int n,bool f) const { ToSysInt(n,f?1:0); }
- void ToSysAtom(int n,const t_atom &at) const;
-
- static void ToSysMsg(MsgBundle *mb);
-
- // add class method handlers
- static void AddMessageMethods(t_class *c,bool dsp,bool dspin);
-
-private:
- class pxbnd_object;
-public:
-
- //! \brief This represents an item of the symbol-bound method list
- class BindItem:
- public Item
- {
- public:
- BindItem(bool (*f)(flext_base *,t_symbol *s,int,t_atom *,void *),pxbnd_object *px);
- virtual ~BindItem();
-
- void Unbind(const t_symbol *s);
-
- bool (*fun)(flext_base *,t_symbol *s,int,t_atom *,void *);
- pxbnd_object *px;
- };
-
- ItemCont *ThMeths() { if(!methhead) methhead = new ItemCont; return methhead; }
- static ItemCont *ClMeths(t_classid c);
-
- //! \brief This is the central function to add message handlers. It is used by all other AddMethod incarnations.
- static void AddMethod(ItemCont *ma,int inlet,const t_symbol *tag,methfun fun,metharg tp,...);
-
- ItemCont *ThAttrs() { return attrhead; }
- static ItemCont *ClAttrs(t_classid c);
-
- static void AddAttrib(ItemCont *aa,ItemCont *ma,const t_symbol *attr,metharg tp,methfun gfun,methfun sfun);
- void AddAttrib(const t_symbol *attr,metharg tp,methfun gfun,methfun sfun);
- static void AddAttrib(t_classid c,const t_symbol *attr,metharg tp,methfun gfun,methfun sfun);
-
-private:
-
- static inline flext_base *thisObject(flext_hdr *c) { return FLEXT_CAST<flext_base *>(c->data); }
-
- static void Setup(t_classid c);
-
- //! \brief This represents either an inlet or outlet during construction
- class FLEXT_SHARE xlet {
- public:
- xlet();
- ~xlet();
-
- xlettype tp;
- char *desc;
-
- void Desc(const char *c);
- };
-
- static xlet inlist[];
- static xlet outlist[];
-
- //! current message tag
- static const t_symbol *curtag;
- //! number of message and signal inlets/outlets
- unsigned char incnt,outcnt,insigs,outsigs;
-
- outlet **outlets;
-
- union t_any {
- float ft;
- int it;
- bool bt;
- t_symbol *st;
-#if FLEXT_SYS == FLEXT_SYS_PD
- t_gpointer *pt;
-#endif
- void *vt;
- };
-
- typedef bool (*methfun_V)(flext_base *c,int argc,t_atom *argv);
- typedef bool (*methfun_A)(flext_base *c,const t_symbol *s,int argc,t_atom *argv);
- typedef bool (*methfun_0)(flext_base *c);
- typedef bool (*methfun_1)(flext_base *c,t_any &);
- typedef bool (*methfun_2)(flext_base *c,t_any &,t_any &);
- typedef bool (*methfun_3)(flext_base *c,t_any &,t_any &,t_any &);
- typedef bool (*methfun_4)(flext_base *c,t_any &,t_any &,t_any &,t_any &);
- typedef bool (*methfun_5)(flext_base *c,t_any &,t_any &,t_any &,t_any &,t_any &);
-
- mutable ItemCont *methhead;
- mutable ItemCont *bindhead;
-
- bool FindMeth(int inlet,const t_symbol *s,int argc,const t_atom *argv);
- bool FindMethAny(int inlet,const t_symbol *s,int argc,const t_atom *argv);
- bool TryMethTag(Item *lst,const t_symbol *tag,int argc,const t_atom *argv);
- bool TryMethSym(Item *lst,const t_symbol *s);
- bool TryMethAny(Item *lst,const t_symbol *s,int argc,const t_atom *argv);
-
- mutable ItemCont *attrhead;
- mutable AttrDataCont *attrdata;
-
- AttrItem *FindAttrib(const t_symbol *tag,bool get,bool msg = false) const;
-
- bool InitAttrib(int argc,const t_atom *argv);
-
- bool DumpAttrib(const t_symbol *tag,AttrItem *a) const;
- bool GetAttrib(const t_symbol *tag,AttrItem *a,AtomList &l) const;
- bool SetAttrib(const t_symbol *tag,AttrItem *a,int argc,const t_atom *argv);
- bool SetAttrib(const t_symbol *tag,AttrItem *a,const AtomList &l) { return SetAttrib(tag,a,l.Count(),l.Atoms()); }
- // get and set the attribute
- bool BangAttrib(const t_symbol *tag,AttrItem *a);
- // show/hide the attribute
- bool ShowAttrib(AttrItem *a,bool show) const;
-
- static bool cb_ListMethods(flext_base *c,int argc,const t_atom *argv);
- static bool cb_ListAttrib(flext_base *c) { return c->ListAttrib(); }
-
- // queue stuff
-
- //! Start message queue
- static void StartQueue();
-#if FLEXT_QMODE == 2
- //! Queue worker function
- static void QWorker(thr_params *);
-#endif
- //! Flush messages in the queue
- static void QFlush(flext_base *th = NULL);
-
-#if FLEXT_SYS == FLEXT_SYS_PD
-
- static void SetGfx(t_classid c);
-
-#ifndef FLEXT_NOATTREDIT
- // attribute editor
- static bool cb_AttrDialog(flext_base *c,int argc,const t_atom *argv);
- static void cb_GfxProperties(flext_hdr *c, t_glist *);
-#endif
-
-#ifdef FLEXT_ATTRHIDE
- static void cb_GfxVis(flext_hdr *c, t_glist *gl, int vis);
- static void cb_GfxSave(flext_hdr *c, t_binbuf *b);
- static void cb_GfxSelect(flext_hdr *x, struct _glist *glist, int state);
-
- void BinbufArgs(t_binbuf *b,t_binbuf *args,bool withname,bool transdoll);
- void BinbufAttr(t_binbuf *b,bool transdoll);
-#endif
-
- static void cb_bang(flext_hdr *c);
- static void cb_float(flext_hdr *c,t_float f);
- static void cb_symbol(flext_hdr *c,const t_symbol *s);
-// static void cb_pointer(fltext_hdr *c,const t_gpointer *p);
- static void cb_anything(flext_hdr *c,const t_symbol *s,int argc,t_atom *argv);
-
- // proxy object (for additional inlets)
- static t_class *px_class;
-
- struct px_object // no virtual table!
- {
- t_object obj; // MUST reside at memory offset 0
- flext_base *base;
- int index;
-
- void init(flext_base *b,int ix) { base = b; index = ix; }
- static void px_bang(px_object *c);
- static void px_float(px_object *c,t_float f);
- static void px_symbol(px_object *c,const t_symbol *s);
-// static void px_pointer(px_object *c,const t_gpointer *p);
- static void px_anything(px_object *c,const t_symbol *s,int argc,t_atom *argv);
- };
-
- static void cb_px_ft1(flext_hdr *c,t_float f);
- static void cb_px_ft2(flext_hdr *c,t_float f);
- static void cb_px_ft3(flext_hdr *c,t_float f);
- static void cb_px_ft4(flext_hdr *c,t_float f);
- static void cb_px_ft5(flext_hdr *c,t_float f);
- static void cb_px_ft6(flext_hdr *c,t_float f);
- static void cb_px_ft7(flext_hdr *c,t_float f);
- static void cb_px_ft8(flext_hdr *c,t_float f);
- static void cb_px_ft9(flext_hdr *c,t_float f);
-
-#elif FLEXT_SYS == FLEXT_SYS_MAX
- typedef object px_object;
- static void cb_bang(flext_hdr *c);
- static void cb_float(flext_hdr *c,double f);
- static void cb_int(flext_hdr *c,long v);
- static void cb_anything(flext_hdr *c,const t_symbol *s,short argc,t_atom *argv);
-
- static void cb_px_in1(flext_hdr *c,long v);
- static void cb_px_in2(flext_hdr *c,long v);
- static void cb_px_in3(flext_hdr *c,long v);
- static void cb_px_in4(flext_hdr *c,long v);
- static void cb_px_in5(flext_hdr *c,long v);
- static void cb_px_in6(flext_hdr *c,long v);
- static void cb_px_in7(flext_hdr *c,long v);
- static void cb_px_in8(flext_hdr *c,long v);
- static void cb_px_in9(flext_hdr *c,long v);
-
- static void cb_px_ft1(flext_hdr *c,double f);
- static void cb_px_ft2(flext_hdr *c,double f);
- static void cb_px_ft3(flext_hdr *c,double f);
- static void cb_px_ft4(flext_hdr *c,double f);
- static void cb_px_ft5(flext_hdr *c,double f);
- static void cb_px_ft6(flext_hdr *c,double f);
- static void cb_px_ft7(flext_hdr *c,double f);
- static void cb_px_ft8(flext_hdr *c,double f);
- static void cb_px_ft9(flext_hdr *c,double f);
-#endif
-
- px_object **inlets;
-
- // --------- symbol-bound proxy
-
- static t_class *pxbnd_class;
-
- class pxbnd_object:
- public flext_root
- // no virtual table!
- {
- public:
- t_object obj; // MUST reside at memory offset 0
- flext_base *base;
- BindItem *item;
- void *data;
-
- void init(flext_base *b,BindItem *it,void *d) { base = b; item = it; data = d; }
- static void px_method(pxbnd_object *c,const t_symbol *s,int argc,t_atom *argv);
- };
-
- //! create proxy class for symbol binding
- static void SetupBindProxy();
-
- // ---------
-
- //! set up inlet proxies
- static void SetProxies(t_class *c,bool dsp);
-
- //! initialize inlets (according to class or object constructor definitions)
- bool InitInlets();
-
- //! initialize outlets (according to class or object constructor definitions)
- bool InitOutlets();
-
- // callback functions
-
- static void cb_loadbang(flext_hdr *c);
-
-#if FLEXT_SYS == FLEXT_SYS_MAX
- char **indesc,**outdesc;
-
- static void cb_assist(flext_hdr *c,void *b,long msg,long arg,char *s);
- static void cb_click (flext_hdr *c, Point pt, short mods);
-
- static void cb_dsp(flext_hdr *c,t_signal **s,short *count);
-#elif FLEXT_SYS == FLEXT_SYS_PD
- static void cb_click(flext_hdr *z,t_floatarg xpos,t_floatarg ypos,t_floatarg shift,t_floatarg ctrl,t_floatarg alt);
-
- static void cb_dsp(flext_hdr *c,t_signal **s);
-#endif
-};
-
-#endif