1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
/*
flext tutorial - attributes 3
Copyright (c) 2002,2003 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.
-------------------------------------------------------------------------
This is tutorial example "advanced 3" with the usage of attributes.
*/
// IMPORTANT: enable attribute processing (specify before inclusion of flext headers!)
// For clarity, this is done here, but you'd better specify it as a compiler definition
// FLEXT_ATTRIBUTES must be 0 or 1,
#define FLEXT_ATTRIBUTES 1
// include flext header
#include <flext.h>
// check for appropriate flext version
#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 401)
#error You need at least flext version 0.4.1
#endif
class attr3:
public flext_base
{
FLEXT_HEADER_S(attr3,flext_base,setup)
public:
// constructor with no arguments
// initial values are set by attributes at creation time (see help file)
attr3():
// initialize data members
i_down(0),i_up(0),i_count(0),i_step(1)
{
// --- define inlets and outlets ---
AddInAnything(); // default inlet
AddInList(); // inlet for bounds
AddInInt(); // inlet for step size
AddOutInt(); // outlet for integer count
AddOutBang(); // outlet for bang
}
protected:
void m_reset() { i_count = i_down; }
void m_set(int argc,t_atom *argv)
{
i_count = argc?GetAInt(argv[0]):0;
}
void m_bang()
{
int f = i_count;
i_count += i_step;
if(i_down != i_up) {
if((i_step > 0) && (i_count > i_up)) {
i_count = i_down;
ToOutBang(1);
}
else if(i_count < i_down) {
i_count = i_up;
ToOutBang(1);
}
}
ToOutInt(0,f);
}
void m_bounds(int f1,int f2)
{
i_down = f1 < f2?f1:f2;
i_up = f1 > f2?f1:f2;
}
void m_step(int s) { i_step = s; }
// setter method of bounds variables
void ms_bounds(const AtomList &l)
{
if(l.Count() == 2 && CanbeInt(l[0]) && CanbeInt(l[1]))
// if it is a two element integer list use m_bounds method
m_bounds(GetAInt(l[0]),GetAInt(l[1]));
else
// else post a warning
post("%s - 'bounds' needs two integer parameters",thisName());
}
// getter method of bounds variables
void mg_bounds(AtomList &l) const
{
l(2); // initialize two element list
SetInt(l[0],i_down); // set first element
SetInt(l[1],i_up); // set second element
}
int i_count,i_down,i_up,i_step;
private:
static void setup(t_classid c)
{
// --- set up methods (class scope) ---
// register a bang method to the default inlet (0)
FLEXT_CADDBANG(c,0,m_bang);
// set up tagged methods for the default inlet (0)
FLEXT_CADDMETHOD_(c,0,"reset",m_reset);
FLEXT_CADDMETHOD_(c,0,"set",m_set);
// set up methods for inlets 1 and 2
// no message tag used
FLEXT_CADDMETHOD(c,1,m_bounds); // variable arg type recognized automatically
FLEXT_CADDMETHOD(c,2,m_step); // single int arg also recognized automatically
// --- set up attributes (class scope) ---
// these have equally named getters and setters
// see the wrappers below
FLEXT_CADDATTR_VAR1(c,"count",i_count);
FLEXT_CADDATTR_VAR1(c,"step",i_step);
// bounds has differently named getter and setter functions
// see the wrappers below
FLEXT_CADDATTR_VAR(c,"bounds",mg_bounds,ms_bounds);
}
// normal method callbacks for bang and reset
FLEXT_CALLBACK(m_bang)
FLEXT_CALLBACK(m_reset)
FLEXT_CALLBACK_V(m_set) // normal method wrapper for m_set
FLEXT_ATTRVAR_I(i_count) // wrapper functions (get and set) for integer variable i_count
FLEXT_CALLBACK_II(m_bounds) // normal method wrapper for m_bounds
FLEXT_CALLVAR_V(mg_bounds,ms_bounds) // getter and setter method of bounds
FLEXT_CALLBACK_I(m_step) // normal method wrapper for m_step
FLEXT_ATTRVAR_I(i_step) // wrapper functions (get and set) for integer variable i_step
};
// instantiate the class (constructor takes no arguments)
FLEXT_NEW("attr3",attr3)
|