aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/flext/source/flbase.h
diff options
context:
space:
mode:
authorThomas Grill <xovo@users.sourceforge.net>2002-11-25 22:27:34 +0000
committerThomas Grill <xovo@users.sourceforge.net>2002-11-25 22:27:34 +0000
commita55a5773570e56a1fb59887f1215f3d05a055700 (patch)
tree507e32ac5b202cb99366bc416d74fff105aa6711 /externals/grill/flext/source/flbase.h
parent286c5cf7f627308f56b94289a8a05ed653923c07 (diff)
""
svn path=/trunk/; revision=243
Diffstat (limited to 'externals/grill/flext/source/flbase.h')
-rw-r--r--externals/grill/flext/source/flbase.h190
1 files changed, 127 insertions, 63 deletions
diff --git a/externals/grill/flext/source/flbase.h b/externals/grill/flext/source/flbase.h
index f3f8b647..21f96aaf 100644
--- a/externals/grill/flext/source/flbase.h
+++ b/externals/grill/flext/source/flbase.h
@@ -27,8 +27,7 @@ WARRANTIES, see the file, "license.txt," in this distribution.
class flext_obj;
// ----------------------------------------------------------------------------
-/*! \struct flext_hdr
- \brief The obligatory PD or Max/MSP object header
+/*! \brief The obligatory PD or Max/MSP object header
\internal
This is in a separate struct to assure that obj is the very first thing.
@@ -39,8 +38,13 @@ class flext_obj;
struct FLEXT_EXT flext_hdr
{
+ /*! \defgroup FLEXT_OBJHEADER Actual PD or Max/MSP object
+ \internal
+ @{
+ */
+
/*! \brief The obligatory object header
- MUST reside at memory offset 0 (no virtual table possible)
+ \note MUST reside at memory offset 0 (no virtual table possible)
*/
t_sigobj obj;
@@ -54,17 +58,16 @@ struct FLEXT_EXT flext_hdr
long curinlet;
#endif
- /*! \brief This points to flext object class
- This points to the actual polymorphic C++ class
+ /*! \brief This points to the actual polymorphic C++ class
*/
flext_obj *data;
+
+ //! @} FLEXT_OBJHEADER
};
// ----------------------------------------------------------------------------
-/*! \class flext_obj
- \brief The mother of base classes for all flext externs
- \internal
+/*! \brief The mother of base classes for all flext external objects
Each extern which is written in C++ needs to use the #defines at the
end of this header file.
@@ -77,6 +80,7 @@ struct FLEXT_EXT flext_hdr
One of the defines like
FLEXT_NEW(NEW_CLASS)
+ or
FLEXT_NEW_2(NEW_CLASS, float, float)
should be the first thing in your implementation file.
@@ -85,69 +89,123 @@ struct FLEXT_EXT flext_hdr
*/
// ----------------------------------------------------------------------------
-class FLEXT_EXT flext_obj:
+class flext_obj:
public flext
{
public:
- // --- overloading of new/delete memory allocation methods ----
- // MaxMSP allows only 16K in overdrive mode!
+ /*! \defgroup FLEXT_OBJCLASS Object base class
+ @{
+ */
+// --- creation -------------------------------------------------------
- void *operator new(size_t bytes);
- void operator delete(void *blk);
-
- #ifndef __MRC__ // doesn't allow new[] overloading?!
- void *operator new[](size_t bytes) { return operator new(bytes); }
- void operator delete[](void *blk) { operator delete(blk); }
- #endif
-
- // these are aligned
- static void *NewAligned(size_t bytes,int bitalign = 128);
- static void FreeAligned(void *blk);
-
- // ---------------------
+ /*! \defgroup FLEXT_O_CREATION Creation/Destruction functionality
+ @{
+ */
//! Constructor
flext_obj();
//! Destructor
virtual ~flext_obj() = 0;
-
+
+ /*! \brief Signal a construction problem
+ \note This should only be used in the constructor. Object creation will be aborted.
+ */
+ void InitProblem() { init_ok = false; }
+
+ /*! \brief Enable/disable attribute procession (default = false)
+ \note Use that in the static class setup function (also library setup function)
+ */
+ static void ProcessAttributes(bool attr) { process_attributes = attr; }
+
+ //! Virtual function called at creation time (but after the constructor)
+ // this also guarantees that there are no instances of flext_obj
+ virtual bool Init() = 0;
+
+ //! Virtual function called at destruction (before the destructor)
+ virtual void Exit() {}
+
+ //! @} FLEXT_O_CREATION
+
+// --- info -------------------------------------------------------
+
+ /*! \defgroup FLEXT_O_INFO Get various information
+ @{
+ */
+
//! Get the object's canvas
- t_canvas *thisCanvas() { return(m_canvas); }
+ t_canvas *thisCanvas() { return(m_canvas); }
+ //! Get the PD or Max/MSP object
t_sigobj *thisHdr() { return &x_obj->obj; }
+ //! Get the PD or Max/MSP object
const t_sigobj *thisHdr() const { return &x_obj->obj; }
+ //! Get the class name (as a string)
const char *thisName() const { return GetString(m_name); }
+ //! Get the class name (as a symbol)
const t_symbol *thisNameSym() const { return m_name; }
#ifdef PD
+ //! Get the class pointer
t_class *thisClass() { return (t_class *)((t_object *)(x_obj))->te_g.g_pd; }
#elif defined(MAXMSP)
+ //! Get the class pointer
t_class *thisClass() { return (t_class *)(((t_tinyobject *)x_obj)->t_messlist-1); }
#endif
- void InitProblem() { init_ok = false; }
+ //! @} FLEXT_O_INFO
- static void ProcessAttributes(bool attr) { process_attributes = attr; }
+// --- memory -------------------------------------------------------
- // this also guarantees that there are no instances of flext_obj
- virtual bool Init() = 0;
- virtual void Exit() {}
+ /*! \defgroup FLEXT_O_MEMORY Memory allocation functions
+ @{
+ */
+
+ /*! Overloaded new memory allocation method
+ \warning MaxMSP (or MacOS) allows only 16K in overdrive mode!
+ */
+ void *operator new(size_t bytes);
+ //! Overloaded delete method
+ void operator delete(void *blk);
+ #ifndef __MRC__ // doesn't allow new[] overloading?!
+ void *operator new[](size_t bytes) { return operator new(bytes); }
+ void operator delete[](void *blk) { operator delete(blk); }
+ #endif
+
+ //! Get an aligned memory block
+ static void *NewAligned(size_t bytes,int bitalign = 128);
+ //! Free an aligned memory block
+ static void FreeAligned(void *blk);
+
+ //! @} FLEXT_O_MEMORY
+
// --- help -------------------------------------------------------
- /*! \defgroup FLEXT_C_HELP Flext help/assistance functionality
+ /*! \defgroup FLEXT_O_HELP Help/assistance functionality
+ \remark This is still PD only
+ @{
+ */
- @{
+ /*! Define the help reference symbol for a class
+ \internal
*/
-
static void DefineHelp(t_class *c,const char *ref,const char *dir = NULL,bool addtilde = false);
+
+ //! Define the help reference symbol for a class
void DefineHelp(const char *ref,const char *dir = NULL,bool addtilde = false) { DefineHelp(thisClass(),ref,dir,addtilde); }
- //! @}
+ //! @}
+// --- internal stuff -------------------------------------------------------
+
+ /*! \defgroup FLEXT_O_INTERNAL Internal stuff
+ \internal
+ @{
+ */
+
protected:
//! The object header
@@ -178,7 +236,10 @@ class FLEXT_EXT flext_obj:
//! Hold object's name during construction
static const t_symbol *m_holdname;
+ //! Holders for attribute procession flag
static bool m_holdattr;
+ static int m_holdaargc;
+ static const t_atom *m_holdaargv;
//! The object's name in the patcher
const t_symbol *m_name;
@@ -186,14 +247,15 @@ class FLEXT_EXT flext_obj:
//! Check whether construction was successful
bool InitOk() const { return init_ok; }
- //@{
- //! Definitions for library objects
-
+ // Definitions for library objects
static void lib_init(const char *name,void setupfun(),bool attr);
static void obj_add(bool lib,bool dsp,bool attr,const char *idname,const char *names,void setupfun(t_class *),flext_obj *(*newfun)(int,t_atom *),void (*freefun)(flext_hdr *),int argtp1,...);
static flext_hdr *obj_new(const t_symbol *s,int argc,t_atom *argv);
static void obj_free(flext_hdr *o);
- //@}
+
+ //! @} FLEXT_O_INTERNAL
+
+ //! @} FLEXT_OBJCLASS
};
@@ -211,7 +273,13 @@ class FLEXT_EXT flext_obj:
#ifndef FLEXT_ATTRIBUTES
-#define FLEXT_ATTRIBUTES 0
+/*! \brief Switch for global attribute processing
+ \note Should be set to 1 or 0 (or not be defined)
+ \ingroup FLEXT_DEFS
+*/
+#define FLEXT_ATTRIBUTES \
+\
+0
#endif
// ----------------------------------------
@@ -242,8 +310,8 @@ static void __free__(flext_hdr *hdr) \
static void __setup__(t_class *classPtr) \
{ PARENT_CLASS::__setup__(classPtr); \
NEW_CLASS::SETUPFUN(classPtr); } \
-protected: \
-static inline NEW_CLASS *thisObject(void *c) { return FLEXT_CAST<NEW_CLASS *>(((flext_hdr *)c)->data); }
+protected: \
+static inline NEW_CLASS *thisObject(void *c) { return FLEXT_CAST<NEW_CLASS *>(((flext_hdr *)c)->data); }
// generate name of dsp/non-dsp setup function
@@ -261,24 +329,22 @@ static inline NEW_CLASS *thisObject(void *c) { return FLEXT_CAST<NEW_CLASS *>(((
// these can be used in library setup functions
// to register the individual objects in the library
-#define FLEXT_SETUP(cl) \
+#define REAL_SETUP_0(cl) \
extern void cl##_setup(); \
cl##_setup()
-#define FLEXT_DSP_SETUP(cl) \
+#define REAL_SETUP_1(cl) \
extern void cl##_tilde_setup(); \
cl##_tilde_setup()
-// deprecated
-#define FLEXT_TILDE_SETUP FLEXT_DSP_SETUP
-
+#define REAL_SETUP(cl,DSP) REAL_SETUP_##DSP(cl)
// specify that to define the library itself
#ifdef PD
-#define FLEXT_LIB_SETUP(NAME,SETUPFUN) extern "C" FLEXT_EXT void NAME##_setup() { flext_obj::lib_init(#NAME,SETUPFUN,FLEXT_ATTRIBUTES); }
+#define REAL_LIB_SETUP(NAME,SETUPFUN) extern "C" FLEXT_EXT void NAME##_setup() { flext_obj::lib_init(#NAME,SETUPFUN,FLEXT_ATTRIBUTES); }
#else // MAXMSP
-#define FLEXT_LIB_SETUP(NAME,SETUPFUN) extern "C" FLEXT_EXT int main() { flext_obj::lib_init(#NAME,SETUPFUN,FLEXT_ATTRIBUTES); return 0; }
+#define REAL_LIB_SETUP(NAME,SETUPFUN) extern "C" FLEXT_EXT int main() { flext_obj::lib_init(#NAME,SETUPFUN,FLEXT_ATTRIBUTES); return 0; }
#endif
@@ -312,8 +378,6 @@ cl##_tilde_setup()
#define FLEXTTYPE_t_float A_FLOAT
#define CALLBTYPE_t_float t_float
-//* #define FLEXTTYPE_t_flint A_FLINT
-
#ifdef PD
#define FLEXTTYPE_int A_FLOAT
#define CALLBTYPE_int float
@@ -341,7 +405,6 @@ cl##_tilde_setup()
#define REAL_NEW(NAME,NEW_CLASS,DSP,LIB) \
-FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) \
flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
{ \
return new NEW_CLASS; \
@@ -349,10 +412,10 @@ flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \
{ \
flext_obj::obj_add(LIB,DSP,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,&NEW_CLASS::__free__,A_NULL); \
-}
+} \
+FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
#define REAL_NEW_V(NAME,NEW_CLASS,DSP,LIB) \
-FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) \
flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
{ \
return new NEW_CLASS(argc,argv); \
@@ -360,10 +423,10 @@ flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \
{ \
flext_obj::obj_add(LIB,DSP,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,&NEW_CLASS::__free__,A_GIMME,A_NULL); \
-}
+} \
+FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
#define REAL_NEW_1(NAME,NEW_CLASS,DSP,LIB, TYPE1) \
-FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) \
flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
{ \
return new NEW_CLASS(ARGCAST(argv[0],TYPE1)); \
@@ -371,10 +434,10 @@ flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \
{ \
flext_obj::obj_add(LIB,DSP,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,NEW_CLASS::__free__,FLEXTTP(TYPE1),A_NULL); \
-}
+} \
+FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
#define REAL_NEW_2(NAME,NEW_CLASS,DSP,LIB, TYPE1,TYPE2) \
-FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) \
flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
{ \
return new NEW_CLASS(ARGCAST(argv[0],TYPE1),ARGCAST(argv[1],TYPE2)); \
@@ -382,10 +445,10 @@ flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \
{ \
flext_obj::obj_add(LIB,DSP,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,NEW_CLASS::__free__,FLEXTTP(TYPE1),FLEXTTP(TYPE2),A_NULL); \
-}
+} \
+FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
#define REAL_NEW_3(NAME,NEW_CLASS,DSP,LIB, TYPE1, TYPE2, TYPE3) \
-FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) \
flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
{ \
return new NEW_CLASS(ARGCAST(argv[0],TYPE1),ARGCAST(argv[1],TYPE2),ARGCAST(argv[2],TYPE3)); \
@@ -393,10 +456,10 @@ flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \
{ \
flext_obj::obj_add(LIB,DSP,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,NEW_CLASS::__free__,FLEXTTP(TYPE1),FLEXTTP(TYPE2),FLEXTTP(TYPE3),A_NULL); \
-}
+} \
+FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
#define REAL_NEW_4(NAME,NEW_CLASS,DSP,LIB, TYPE1,TYPE2, TYPE3, TYPE4) \
-FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) \
flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
{ \
return new NEW_CLASS(ARGCAST(argv[0],TYPE1),ARGCAST(argv[1],TYPE2),ARGCAST(argv[2],TYPE3),ARGCAST(argv[3],TYPE4)); \
@@ -404,7 +467,8 @@ flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \
{ \
flext_obj::obj_add(LIB,DSP,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,NEW_CLASS::__free__,FLEXTTP(TYPE1),FLEXTTP(TYPE2),FLEXTTP(TYPE3),FLEXTTP(TYPE4),A_NULL); \
-}
+} \
+FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
// Shortcuts for method arguments: