diff options
author | Mike Buland <eichlan@xagasoft.com> | 2009-12-16 20:10:58 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2009-12-16 20:10:58 +0000 |
commit | f72c6e4b97afeb69d9ea4d743c0c302d647ea424 (patch) | |
tree | 48d9d94db520455324e902759e887c0d98de976a | |
parent | 5eba456f0147b12a6247cd7aa41e55d121962358 (diff) | |
download | libbu++-f72c6e4b97afeb69d9ea4d743c0c302d647ea424.tar.gz libbu++-f72c6e4b97afeb69d9ea4d743c0c302d647ea424.tar.bz2 libbu++-f72c6e4b97afeb69d9ea4d743c0c302d647ea424.tar.xz libbu++-f72c6e4b97afeb69d9ea4d743c0c302d647ea424.zip |
The new signal/slots system is in place, and works from 0-5 parameters right
now, I'll probably add more later on...
I've also started on the replacement for ParamProc, OptParser. It should do
everything that ParamProc did, only with less code, and much better.
-rw-r--r-- | buildm3.conf | 68 | ||||
-rw-r--r-- | src/optparser.cpp | 39 | ||||
-rw-r--r-- | src/optparser.h | 51 | ||||
-rw-r--r-- | src/signals.h | 592 | ||||
-rw-r--r-- | src/tests/optparser.cpp | 27 | ||||
-rw-r--r-- | src/tests/signals.cpp | 87 | ||||
-rw-r--r-- | src/tests/socket.cpp | 66 |
7 files changed, 930 insertions, 0 deletions
diff --git a/buildm3.conf b/buildm3.conf new file mode 100644 index 0000000..ccc7131 --- /dev/null +++ b/buildm3.conf | |||
@@ -0,0 +1,68 @@ | |||
1 | # vim: syntax=build | ||
2 | |||
3 | set CXXFLAGS += "-ggdb -W -Wall"; | ||
4 | |||
5 | action "default" | ||
6 | { | ||
7 | build: [targets("header-links"), "libbu++.a"]; | ||
8 | } | ||
9 | |||
10 | action "pkg" | ||
11 | { | ||
12 | build: targets("pkg"); | ||
13 | } | ||
14 | |||
15 | target files("src/*.h").replace("src/", "bu/") | ||
16 | { | ||
17 | tag "header-links"; | ||
18 | display "symlink"; | ||
19 | input OUTPUT.replace("bu/","src/"); | ||
20 | profile "build" | ||
21 | { | ||
22 | execute("ln -s ../${INPUT} ${OUTPUT}"); | ||
23 | } | ||
24 | } | ||
25 | |||
26 | target "libbu++.a" | ||
27 | { | ||
28 | input files("src/*.cpp"); | ||
29 | rule "lib"; | ||
30 | set CXXFLAGS += "-I. -fPIC"; | ||
31 | } | ||
32 | |||
33 | target "libbu++-r$(svnversion "-n").tar.bz2" | ||
34 | { | ||
35 | input [ | ||
36 | "LICENSE", | ||
37 | "build.conf", | ||
38 | "Doxyfile", | ||
39 | "buildm3.conf", | ||
40 | "support/vim/syntax/taf.vim", | ||
41 | "support/vim/ftdetect/taf.vim", | ||
42 | "support/vim/ftplugin/taf.vim", | ||
43 | files("*.sh"), | ||
44 | files("src/*.cpp"), | ||
45 | files("src/*.h"), | ||
46 | files("src/tests/*.cpp"), | ||
47 | files("src/tests*.h"), | ||
48 | files("src/tools/*.cpp"), | ||
49 | files("src/tools/*.h"), | ||
50 | files("src/unit/*.unit"), | ||
51 | files("src/doxy/*.dox") | ||
52 | ]; | ||
53 | rule "tarball"; | ||
54 | tag "pkg"; | ||
55 | } | ||
56 | |||
57 | rule "tarball" | ||
58 | { | ||
59 | input matches("LICENSE", "*.cpp", "*.h", "*.conf", "Doxyfile", "*.vim", | ||
60 | "*.sh"); | ||
61 | profile "build" | ||
62 | { | ||
63 | set OUTDIR = OUTPUT.replace(".tar.bz2",""); | ||
64 | execute("tar --transform=\"s@^@${OUTDIR}/@\" -c ${INPUT} |" | ||
65 | " bzip2 -9 > ${OUTPUT}"); | ||
66 | } | ||
67 | } | ||
68 | |||
diff --git a/src/optparser.cpp b/src/optparser.cpp new file mode 100644 index 0000000..2046792 --- /dev/null +++ b/src/optparser.cpp | |||
@@ -0,0 +1,39 @@ | |||
1 | #include "bu/optparser.h" | ||
2 | |||
3 | Bu::OptParser::OptParser() | ||
4 | { | ||
5 | } | ||
6 | |||
7 | Bu::OptParser::~OptParser() | ||
8 | { | ||
9 | } | ||
10 | |||
11 | void Bu::OptParser::addOption( const Option &opt ) | ||
12 | { | ||
13 | lOption.append( opt ); | ||
14 | if( opt.cOpt != '\0' ) | ||
15 | hsOption.insert( opt.cOpt, &lOption.last() ); | ||
16 | if( opt.sOpt ) | ||
17 | hlOption.insert( opt.sOpt, &lOption.last() ); | ||
18 | |||
19 | } | ||
20 | |||
21 | Bu::FString Bu::OptParser::format( const Bu::FString &sIn, int iWidth, | ||
22 | int iIndent ) | ||
23 | { | ||
24 | |||
25 | } | ||
26 | |||
27 | |||
28 | // | ||
29 | // Code for Bu::OptParser::Option | ||
30 | // | ||
31 | |||
32 | Bu::OptParser::Option::Option() | ||
33 | { | ||
34 | } | ||
35 | |||
36 | Bu::OptParser::Option::~Option() | ||
37 | { | ||
38 | } | ||
39 | |||
diff --git a/src/optparser.h b/src/optparser.h new file mode 100644 index 0000000..39f048d --- /dev/null +++ b/src/optparser.h | |||
@@ -0,0 +1,51 @@ | |||
1 | #ifndef BU_OPT_PARSER_H | ||
2 | #define BU_OPT_PARSER_H | ||
3 | |||
4 | #include "bu/fstring.h" | ||
5 | #include "bu/list.h" | ||
6 | #include "bu/hash.h" | ||
7 | |||
8 | namespace Bu | ||
9 | { | ||
10 | class OptParser | ||
11 | { | ||
12 | public: | ||
13 | class Option | ||
14 | { | ||
15 | public: | ||
16 | Option(); | ||
17 | virtual ~Option(); | ||
18 | |||
19 | char cOpt; | ||
20 | Bu::FString sOpt; | ||
21 | Bu::FString sDesc; | ||
22 | }; | ||
23 | |||
24 | public: | ||
25 | OptParser(); | ||
26 | virtual ~OptParser(); | ||
27 | |||
28 | void parse( int argc, char *argv[] ); | ||
29 | |||
30 | void addOption( const Option &opt ); | ||
31 | |||
32 | template<typename c> | ||
33 | void callback( c *pObj, int (c::*fnc)( int, char *[] ) ) | ||
34 | { | ||
35 | (pObj->*fnc)( 0, NULL ); | ||
36 | } | ||
37 | |||
38 | private: | ||
39 | Bu::FString format( const Bu::FString &sIn, int iWidth, int iIndent ); | ||
40 | |||
41 | typedef Bu::List<Option> OptionList; | ||
42 | typedef Bu::Hash<char, Option *> ShortOptionHash; | ||
43 | typedef Bu::Hash<Bu::FString, Option *> LongOptionHash; | ||
44 | |||
45 | OptionList lOption; | ||
46 | ShortOptionHash hsOption; | ||
47 | LongOptionHash hlOption; | ||
48 | }; | ||
49 | }; | ||
50 | |||
51 | #endif | ||
diff --git a/src/signals.h b/src/signals.h new file mode 100644 index 0000000..722f928 --- /dev/null +++ b/src/signals.h | |||
@@ -0,0 +1,592 @@ | |||
1 | #ifndef BU_OBJECT_SIGNALS_H | ||
2 | #define BU_OBJECT_SIGNALS_H | ||
3 | |||
4 | #include "bu/util.h" | ||
5 | |||
6 | namespace Bu | ||
7 | { | ||
8 | // | ||
9 | // 0 Parameters | ||
10 | // | ||
11 | |||
12 | template<typename ret> | ||
13 | class _Slot0 | ||
14 | { | ||
15 | public: | ||
16 | _Slot0() { } | ||
17 | virtual ~_Slot0() { } | ||
18 | |||
19 | virtual ret operator()()=0; | ||
20 | |||
21 | virtual _Slot0<ret> *clone() const=0; | ||
22 | }; | ||
23 | |||
24 | template<typename cls, typename ret> | ||
25 | class __Slot0 : public _Slot0<ret> | ||
26 | { | ||
27 | public: | ||
28 | __Slot0( cls *pCls, ret (cls::*pFnc)() ) : | ||
29 | pCls( pCls ), pFnc( pFnc ) { } | ||
30 | virtual ~__Slot0() { } | ||
31 | |||
32 | virtual ret operator()() | ||
33 | { | ||
34 | return (pCls->*pFnc)(); | ||
35 | } | ||
36 | |||
37 | virtual _Slot0<ret> *clone() const | ||
38 | { | ||
39 | return new __Slot0<cls, ret>( pCls, pFnc ); | ||
40 | } | ||
41 | |||
42 | private: | ||
43 | cls *pCls; | ||
44 | ret (cls::*pFnc)(); | ||
45 | }; | ||
46 | |||
47 | template<typename ret> | ||
48 | class __Slot0F : public _Slot0<ret> | ||
49 | { | ||
50 | public: | ||
51 | __Slot0F( ret (*pFnc)() ) : | ||
52 | pFnc( pFnc ) { } | ||
53 | virtual ~__Slot0F() { } | ||
54 | |||
55 | virtual ret operator()() | ||
56 | { | ||
57 | return (*pFnc)(); | ||
58 | } | ||
59 | |||
60 | virtual _Slot0<ret> *clone() const | ||
61 | { | ||
62 | return new __Slot0F<ret>( pFnc ); | ||
63 | } | ||
64 | |||
65 | private: | ||
66 | ret (*pFnc)(); | ||
67 | }; | ||
68 | |||
69 | template<typename ret> | ||
70 | class Signal0 | ||
71 | { | ||
72 | public: | ||
73 | Signal0() : pCb( NULL ) { } | ||
74 | Signal0( _Slot0<ret> *pCb ) : pCb( pCb ) { } | ||
75 | Signal0( const Signal0<ret> &rSrc ) : | ||
76 | pCb( rSrc.pCb->clone() ) { } | ||
77 | |||
78 | virtual ~Signal0() { delete pCb; pCb = NULL; } | ||
79 | |||
80 | ret operator()() | ||
81 | { | ||
82 | return (*pCb)(); | ||
83 | } | ||
84 | |||
85 | private: | ||
86 | _Slot0<ret> *pCb; | ||
87 | }; | ||
88 | |||
89 | template<typename cls, typename ret> | ||
90 | Signal0<ret> slot( cls *pCls, ret (cls::*pFnc)() ) | ||
91 | { | ||
92 | return Signal0<ret>( | ||
93 | new __Slot0<cls, ret>( pCls, pFnc ) | ||
94 | ); | ||
95 | } | ||
96 | |||
97 | template<typename ret> | ||
98 | Signal0<ret> slot( ret (*pFnc)() ) | ||
99 | { | ||
100 | return Signal0<ret>( | ||
101 | new __Slot0F<ret>( pFnc ) | ||
102 | ); | ||
103 | } | ||
104 | |||
105 | // | ||
106 | // 1 Parameter | ||
107 | // | ||
108 | |||
109 | template<typename ret, typename p1t> | ||
110 | class _Slot1 | ||
111 | { | ||
112 | public: | ||
113 | _Slot1() { } | ||
114 | virtual ~_Slot1() { } | ||
115 | |||
116 | virtual ret operator()( p1t p1 )=0; | ||
117 | |||
118 | virtual _Slot1<ret, p1t> *clone() const=0; | ||
119 | }; | ||
120 | |||
121 | template<typename cls, typename ret, typename p1t> | ||
122 | class __Slot1 : public _Slot1<ret, p1t> | ||
123 | { | ||
124 | public: | ||
125 | __Slot1( cls *pCls, ret (cls::*pFnc)( p1t ) ) : | ||
126 | pCls( pCls ), pFnc( pFnc ) { } | ||
127 | virtual ~__Slot1() { } | ||
128 | |||
129 | virtual ret operator()( p1t p1 ) | ||
130 | { | ||
131 | return (pCls->*pFnc)( p1 ); | ||
132 | } | ||
133 | |||
134 | virtual _Slot1<ret, p1t> *clone() const | ||
135 | { | ||
136 | return new __Slot1<cls, ret, p1t>( pCls, pFnc ); | ||
137 | } | ||
138 | |||
139 | private: | ||
140 | cls *pCls; | ||
141 | ret (cls::*pFnc)( p1t ); | ||
142 | }; | ||
143 | |||
144 | template<typename ret, typename p1t> | ||
145 | class __Slot1F : public _Slot1<ret, p1t> | ||
146 | { | ||
147 | public: | ||
148 | __Slot1F( ret (*pFnc)( p1t ) ) : | ||
149 | pFnc( pFnc ) { } | ||
150 | virtual ~__Slot1F() { } | ||
151 | |||
152 | virtual ret operator()( p1t p1 ) | ||
153 | { | ||
154 | return (*pFnc)( p1 ); | ||
155 | } | ||
156 | |||
157 | virtual _Slot1<ret, p1t> *clone() const | ||
158 | { | ||
159 | return new __Slot1F<ret, p1t>( pFnc ); | ||
160 | } | ||
161 | |||
162 | private: | ||
163 | ret (*pFnc)( p1t p1 ); | ||
164 | }; | ||
165 | |||
166 | template<typename ret, typename p1t> | ||
167 | class Signal1 | ||
168 | { | ||
169 | public: | ||
170 | Signal1() : pCb( NULL ) { } | ||
171 | Signal1( _Slot1<ret, p1t> *pCb ) : pCb( pCb ) { } | ||
172 | Signal1( const Signal1<ret, p1t> &rSrc ) : | ||
173 | pCb( rSrc.pCb->clone() ) { } | ||
174 | |||
175 | virtual ~Signal1() { delete pCb; pCb = NULL; } | ||
176 | |||
177 | ret operator()( p1t p1 ) | ||
178 | { | ||
179 | return (*pCb)( p1 ); | ||
180 | } | ||
181 | |||
182 | private: | ||
183 | _Slot1<ret, p1t> *pCb; | ||
184 | }; | ||
185 | |||
186 | template<typename cls, typename ret, typename p1t> | ||
187 | Signal1<ret, p1t> slot( cls *pCls, ret (cls::*pFnc)( p1t ) ) | ||
188 | { | ||
189 | return Signal1<ret, p1t>( | ||
190 | new __Slot1<cls, ret, p1t>( pCls, pFnc ) | ||
191 | ); | ||
192 | } | ||
193 | |||
194 | template<typename ret, typename p1t> | ||
195 | Signal1<ret, p1t> slot( ret (*pFnc)( p1t ) ) | ||
196 | { | ||
197 | return Signal1<ret, p1t>( | ||
198 | new __Slot1F<ret, p1t>( pFnc ) | ||
199 | ); | ||
200 | } | ||
201 | |||
202 | // | ||
203 | // 2 Parameters | ||
204 | // | ||
205 | |||
206 | template<typename ret, typename p1t, typename p2t> | ||
207 | class _Slot2 | ||
208 | { | ||
209 | public: | ||
210 | _Slot2() { } | ||
211 | virtual ~_Slot2() { } | ||
212 | |||
213 | virtual ret operator()( p1t p1, p2t p2 )=0; | ||
214 | |||
215 | virtual _Slot2<ret, p1t, p2t> *clone() const=0; | ||
216 | }; | ||
217 | |||
218 | template<typename cls, typename ret, typename p1t, typename p2t> | ||
219 | class __Slot2 : public _Slot2<ret, p1t, p2t> | ||
220 | { | ||
221 | public: | ||
222 | __Slot2( cls *pCls, ret (cls::*pFnc)( p1t, p2t ) ) : | ||
223 | pCls( pCls ), pFnc( pFnc ) { } | ||
224 | virtual ~__Slot2() { } | ||
225 | |||
226 | virtual ret operator()( p1t p1, p2t p2 ) | ||
227 | { | ||
228 | return (pCls->*pFnc)( p1, p2 ); | ||
229 | } | ||
230 | |||
231 | virtual _Slot2<ret, p1t, p2t> *clone() const | ||
232 | { | ||
233 | return new __Slot2<cls, ret, p1t, p2t>( pCls, pFnc ); | ||
234 | } | ||
235 | |||
236 | private: | ||
237 | cls *pCls; | ||
238 | ret (cls::*pFnc)( p1t, p2t ); | ||
239 | }; | ||
240 | |||
241 | template<typename ret, typename p1t, typename p2t> | ||
242 | class __Slot2F : public _Slot2<ret, p1t, p2t> | ||
243 | { | ||
244 | public: | ||
245 | __Slot2F( ret (*pFnc)( p1t, p2t ) ) : | ||
246 | pFnc( pFnc ) { } | ||
247 | virtual ~__Slot2F() { } | ||
248 | |||
249 | virtual ret operator()( p1t p1, p2t p2 ) | ||
250 | { | ||
251 | return (*pFnc)( p1, p2 ); | ||
252 | } | ||
253 | |||
254 | virtual _Slot2<ret, p1t, p2t> *clone() const | ||
255 | { | ||
256 | return new __Slot2F<ret, p1t, p2t>( pFnc ); | ||
257 | } | ||
258 | |||
259 | private: | ||
260 | ret (*pFnc)( p1t, p2t ); | ||
261 | }; | ||
262 | |||
263 | template<typename ret, typename p1t, typename p2t> | ||
264 | class Signal2 | ||
265 | { | ||
266 | public: | ||
267 | Signal2() : pCb( NULL ) { } | ||
268 | Signal2( _Slot2<ret, p1t, p2t> *pCb ) : pCb( pCb ) { } | ||
269 | Signal2( const Signal2<ret, p1t, p2t> &rSrc ) : | ||
270 | pCb( rSrc.pCb->clone() ) { } | ||
271 | |||
272 | virtual ~Signal2() { delete pCb; pCb = NULL; } | ||
273 | |||
274 | ret operator()( p1t p1, p2t p2 ) | ||
275 | { | ||
276 | return (*pCb)( p1, p2 ); | ||
277 | } | ||
278 | |||
279 | private: | ||
280 | _Slot2<ret, p1t, p2t> *pCb; | ||
281 | }; | ||
282 | |||
283 | template<typename cls, typename ret, typename p1t, typename p2t> | ||
284 | Signal2<ret, p1t, p2t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t ) ) | ||
285 | { | ||
286 | return Signal2<ret, p1t, p2t>( | ||
287 | new __Slot2<cls, ret, p1t, p2t>( pCls, pFnc ) | ||
288 | ); | ||
289 | } | ||
290 | |||
291 | template<typename ret, typename p1t, typename p2t> | ||
292 | Signal2<ret, p1t, p2t> slot( ret (*pFnc)( p1t, p2t ) ) | ||
293 | { | ||
294 | return Signal2<ret, p1t, p2t>( | ||
295 | new __Slot2F<ret, p1t, p2t>( pFnc ) | ||
296 | ); | ||
297 | } | ||
298 | |||
299 | // | ||
300 | // 3 Parameters | ||
301 | // | ||
302 | |||
303 | template<typename ret, typename p1t, typename p2t, typename p3t> | ||
304 | class _Slot3 | ||
305 | { | ||
306 | public: | ||
307 | _Slot3() { } | ||
308 | virtual ~_Slot3() { } | ||
309 | |||
310 | virtual ret operator()( p1t p1, p2t p2, p3t p3 )=0; | ||
311 | |||
312 | virtual _Slot3<ret, p1t, p2t, p3t> *clone() const=0; | ||
313 | }; | ||
314 | |||
315 | template<typename cls, typename ret, typename p1t, typename p2t, typename p3t> | ||
316 | class __Slot3 : public _Slot3<ret, p1t, p2t, p3t> | ||
317 | { | ||
318 | public: | ||
319 | __Slot3( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t ) ) : | ||
320 | pCls( pCls ), pFnc( pFnc ) { } | ||
321 | virtual ~__Slot3() { } | ||
322 | |||
323 | virtual ret operator()( p1t p1, p2t p2, p3t p3 ) | ||
324 | { | ||
325 | return (pCls->*pFnc)( p1, p2, p3 ); | ||
326 | } | ||
327 | |||
328 | virtual _Slot3<ret, p1t, p2t, p3t> *clone() const | ||
329 | { | ||
330 | return new __Slot3<cls, ret, p1t, p2t, p3t>( pCls, pFnc ); | ||
331 | } | ||
332 | |||
333 | private: | ||
334 | cls *pCls; | ||
335 | ret (cls::*pFnc)( p1t, p2t, p3t ); | ||
336 | }; | ||
337 | |||
338 | template<typename ret, typename p1t, typename p2t, typename p3t> | ||
339 | class __Slot3F : public _Slot3<ret, p1t, p2t, p3t> | ||
340 | { | ||
341 | public: | ||
342 | __Slot3F( ret (*pFnc)( p1t, p2t, p3t ) ) : | ||
343 | pFnc( pFnc ) { } | ||
344 | virtual ~__Slot3F() { } | ||
345 | |||
346 | virtual ret operator()( p1t p1, p2t p2, p3t p3 ) | ||
347 | { | ||
348 | return (*pFnc)( p1, p2, p3 ); | ||
349 | } | ||
350 | |||
351 | virtual _Slot3<ret, p1t, p2t, p3t> *clone() const | ||
352 | { | ||
353 | return new __Slot3F<ret, p1t, p2t, p3t>( pFnc ); | ||
354 | } | ||
355 | |||
356 | private: | ||
357 | ret (*pFnc)( p1t, p2t, p3t ); | ||
358 | }; | ||
359 | |||
360 | template<typename ret, typename p1t, typename p2t, typename p3t> | ||
361 | class Signal3 | ||
362 | { | ||
363 | public: | ||
364 | Signal3() : pCb( NULL ) { } | ||
365 | Signal3( _Slot3<ret, p1t, p2t, p3t> *pCb ) : pCb( pCb ) { } | ||
366 | Signal3( const Signal3<ret, p1t, p2t, p3t> &rSrc ) : | ||
367 | pCb( rSrc.pCb->clone() ) { } | ||
368 | |||
369 | virtual ~Signal3() { delete pCb; pCb = NULL; } | ||
370 | |||
371 | ret operator()( p1t p1, p2t p2, p3t p3 ) | ||
372 | { | ||
373 | return (*pCb)( p1, p2, p3 ); | ||
374 | } | ||
375 | |||
376 | private: | ||
377 | _Slot3<ret, p1t, p2t, p3t> *pCb; | ||
378 | }; | ||
379 | |||
380 | template<typename cls, typename ret, typename p1t, typename p2t, typename p3t> | ||
381 | Signal3<ret, p1t, p2t, p3t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t ) ) | ||
382 | { | ||
383 | return Signal3<ret, p1t, p2t, p3t>( | ||
384 | new __Slot3<cls, ret, p1t, p2t, p3t>( pCls, pFnc ) | ||
385 | ); | ||
386 | } | ||
387 | |||
388 | template<typename ret, typename p1t, typename p2t, typename p3t> | ||
389 | Signal3<ret, p1t, p2t, p3t> slot( ret (*pFnc)( p1t, p2t, p3t ) ) | ||
390 | { | ||
391 | return Signal3<ret, p1t, p2t, p3t>( | ||
392 | new __Slot3F<ret, p1t, p2t, p3t>( pFnc ) | ||
393 | ); | ||
394 | } | ||
395 | |||
396 | // | ||
397 | // 4 Parameters | ||
398 | // | ||
399 | |||
400 | template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t> | ||
401 | class _Slot4 | ||
402 | { | ||
403 | public: | ||
404 | _Slot4() { } | ||
405 | virtual ~_Slot4() { } | ||
406 | |||
407 | virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4 )=0; | ||
408 | |||
409 | virtual _Slot4<ret, p1t, p2t, p3t, p4t> *clone() const=0; | ||
410 | }; | ||
411 | |||
412 | template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t> | ||
413 | class __Slot4 : public _Slot4<ret, p1t, p2t, p3t, p4t> | ||
414 | { | ||
415 | public: | ||
416 | __Slot4( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t ) ) : | ||
417 | pCls( pCls ), pFnc( pFnc ) { } | ||
418 | virtual ~__Slot4() { } | ||
419 | |||
420 | virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4 ) | ||
421 | { | ||
422 | return (pCls->*pFnc)( p1, p2, p3, p4 ); | ||
423 | } | ||
424 | |||
425 | virtual _Slot4<ret, p1t, p2t, p3t, p4t> *clone() const | ||
426 | { | ||
427 | return new __Slot4<cls, ret, p1t, p2t, p3t, p4t>( pCls, pFnc ); | ||
428 | } | ||
429 | |||
430 | private: | ||
431 | cls *pCls; | ||
432 | ret (cls::*pFnc)( p1t, p2t, p3t, p4t ); | ||
433 | }; | ||
434 | |||
435 | template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t> | ||
436 | class __Slot4F : public _Slot4<ret, p1t, p2t, p3t, p4t> | ||
437 | { | ||
438 | public: | ||
439 | __Slot4F( ret (*pFnc)( p1t, p2t, p3t, p4t ) ) : | ||
440 | pFnc( pFnc ) { } | ||
441 | virtual ~__Slot4F() { } | ||
442 | |||
443 | virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4 ) | ||
444 | { | ||
445 | return (*pFnc)( p1, p2, p3, p4 ); | ||
446 | } | ||
447 | |||
448 | virtual _Slot4<ret, p1t, p2t, p3t, p4t> *clone() const | ||
449 | { | ||
450 | return new __Slot4F<ret, p1t, p2t, p3t, p4t>( pFnc ); | ||
451 | } | ||
452 | |||
453 | private: | ||
454 | ret (*pFnc)( p1t, p2t, p3t, p4t ); | ||
455 | }; | ||
456 | |||
457 | template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t> | ||
458 | class Signal4 | ||
459 | { | ||
460 | public: | ||
461 | Signal4() : pCb( NULL ) { } | ||
462 | Signal4( _Slot4<ret, p1t, p2t, p3t, p4t> *pCb ) : pCb( pCb ) { } | ||
463 | Signal4( const Signal4<ret, p1t, p2t, p3t, p4t> &rSrc ) : | ||
464 | pCb( rSrc.pCb->clone() ) { } | ||
465 | |||
466 | virtual ~Signal4() { delete pCb; pCb = NULL; } | ||
467 | |||
468 | ret operator()( p1t p1, p2t p2, p3t p3, p4t p4 ) | ||
469 | { | ||
470 | return (*pCb)( p1, p2, p3, p4 ); | ||
471 | } | ||
472 | |||
473 | private: | ||
474 | _Slot4<ret, p1t, p2t, p3t, p4t> *pCb; | ||
475 | }; | ||
476 | |||
477 | template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t> | ||
478 | Signal4<ret, p1t, p2t, p3t, p4t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t ) ) | ||
479 | { | ||
480 | return Signal4<ret, p1t, p2t, p3t, p4t>( | ||
481 | new __Slot4<cls, ret, p1t, p2t, p3t, p4t>( pCls, pFnc ) | ||
482 | ); | ||
483 | } | ||
484 | |||
485 | template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t> | ||
486 | Signal4<ret, p1t, p2t, p3t, p4t> slot( ret (*pFnc)( p1t, p2t, p3t, p4t ) ) | ||
487 | { | ||
488 | return Signal4<ret, p1t, p2t, p3t, p4t>( | ||
489 | new __Slot4F<ret, p1t, p2t, p3t, p4t>( pFnc ) | ||
490 | ); | ||
491 | } | ||
492 | |||
493 | // | ||
494 | // 5 Parameters | ||
495 | // | ||
496 | |||
497 | template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t> | ||
498 | class _Slot5 | ||
499 | { | ||
500 | public: | ||
501 | _Slot5() { } | ||
502 | virtual ~_Slot5() { } | ||
503 | |||
504 | virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5 )=0; | ||
505 | |||
506 | virtual _Slot5<ret, p1t, p2t, p3t, p4t, p5t> *clone() const=0; | ||
507 | }; | ||
508 | |||
509 | template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t> | ||
510 | class __Slot5 : public _Slot5<ret, p1t, p2t, p3t, p4t, p5t> | ||
511 | { | ||
512 | public: | ||
513 | __Slot5( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t ) ) : | ||
514 | pCls( pCls ), pFnc( pFnc ) { } | ||
515 | virtual ~__Slot5() { } | ||
516 | |||
517 | virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5 ) | ||
518 | { | ||
519 | return (pCls->*pFnc)( p1, p2, p3, p4, p5 ); | ||
520 | } | ||
521 | |||
522 | virtual _Slot5<ret, p1t, p2t, p3t, p4t, p5t> *clone() const | ||
523 | { | ||
524 | return new __Slot5<cls, ret, p1t, p2t, p3t, p4t, p5t>( pCls, pFnc ); | ||
525 | } | ||
526 | |||
527 | private: | ||
528 | cls *pCls; | ||
529 | ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t ); | ||
530 | }; | ||
531 | |||
532 | template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t> | ||
533 | class __Slot5F : public _Slot5<ret, p1t, p2t, p3t, p4t, p5t> | ||
534 | { | ||
535 | public: | ||
536 | __Slot5F( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t ) ) : | ||
537 | pFnc( pFnc ) { } | ||
538 | virtual ~__Slot5F() { } | ||
539 | |||
540 | virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5 ) | ||
541 | { | ||
542 | return (*pFnc)( p1, p2, p3, p4, p5 ); | ||
543 | } | ||
544 | |||
545 | virtual _Slot5<ret, p1t, p2t, p3t, p4t, p5t> *clone() const | ||
546 | { | ||
547 | return new __Slot5F<ret, p1t, p2t, p3t, p4t, p5t>( pFnc ); | ||
548 | } | ||
549 | |||
550 | private: | ||
551 | ret (*pFnc)( p1t, p2t, p3t, p4t, p5t ); | ||
552 | }; | ||
553 | |||
554 | template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t> | ||
555 | class Signal5 | ||
556 | { | ||
557 | public: | ||
558 | Signal5() : pCb( NULL ) { } | ||
559 | Signal5( _Slot5<ret, p1t, p2t, p3t, p4t, p5t> *pCb ) : pCb( pCb ) { } | ||
560 | Signal5( const Signal5<ret, p1t, p2t, p3t, p4t, p5t> &rSrc ) : | ||
561 | pCb( rSrc.pCb->clone() ) { } | ||
562 | |||
563 | virtual ~Signal5() { delete pCb; pCb = NULL; } | ||
564 | |||
565 | ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5 ) | ||
566 | { | ||
567 | return (*pCb)( p1, p2, p3, p4, p5 ); | ||
568 | } | ||
569 | |||
570 | private: | ||
571 | _Slot5<ret, p1t, p2t, p3t, p4t, p5t> *pCb; | ||
572 | }; | ||
573 | |||
574 | template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t> | ||
575 | Signal5<ret, p1t, p2t, p3t, p4t, p5t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t ) ) | ||
576 | { | ||
577 | return Signal5<ret, p1t, p2t, p3t, p4t, p5t>( | ||
578 | new __Slot5<cls, ret, p1t, p2t, p3t, p4t, p5t>( pCls, pFnc ) | ||
579 | ); | ||
580 | } | ||
581 | |||
582 | template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t> | ||
583 | Signal5<ret, p1t, p2t, p3t, p4t, p5t> slot( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t ) ) | ||
584 | { | ||
585 | return Signal5<ret, p1t, p2t, p3t, p4t, p5t>( | ||
586 | new __Slot5F<ret, p1t, p2t, p3t, p4t, p5t>( pFnc ) | ||
587 | ); | ||
588 | } | ||
589 | |||
590 | }; | ||
591 | |||
592 | #endif | ||
diff --git a/src/tests/optparser.cpp b/src/tests/optparser.cpp new file mode 100644 index 0000000..9168af8 --- /dev/null +++ b/src/tests/optparser.cpp | |||
@@ -0,0 +1,27 @@ | |||
1 | #include <bu/optparser.h> | ||
2 | #include <bu/sio.h> | ||
3 | using namespace Bu; | ||
4 | |||
5 | class Opts : public Bu::OptParser | ||
6 | { | ||
7 | public: | ||
8 | Opts() : | ||
9 | iBob( 542 ) | ||
10 | { | ||
11 | callback( this, &Opts::cb ); | ||
12 | } | ||
13 | |||
14 | int cb( int argc, char *argv[] ) | ||
15 | { | ||
16 | sio << "Hey, cb was called, here's a class var: " << iBob << sio.nl; | ||
17 | return 5; | ||
18 | } | ||
19 | |||
20 | int iBob; | ||
21 | }; | ||
22 | |||
23 | int main( int argc, char *argv[] ) | ||
24 | { | ||
25 | Opts o; | ||
26 | } | ||
27 | |||
diff --git a/src/tests/signals.cpp b/src/tests/signals.cpp new file mode 100644 index 0000000..b4b1363 --- /dev/null +++ b/src/tests/signals.cpp | |||
@@ -0,0 +1,87 @@ | |||
1 | #include <bu/signals.h> | ||
2 | #include <bu/sio.h> | ||
3 | |||
4 | using namespace Bu; | ||
5 | |||
6 | class Thing | ||
7 | { | ||
8 | public: | ||
9 | Thing() : | ||
10 | iState( 82731 ) | ||
11 | { | ||
12 | } | ||
13 | |||
14 | virtual ~Thing() | ||
15 | { | ||
16 | } | ||
17 | |||
18 | void fnc0() | ||
19 | { | ||
20 | sio << iState << ": void fnc0()" << sio.nl; | ||
21 | } | ||
22 | |||
23 | void fnc1( int a ) | ||
24 | { | ||
25 | sio << iState << ": void fnc1( " << a << " )" << sio.nl; | ||
26 | } | ||
27 | |||
28 | void fnc2( int a, Bu::FString b ) | ||
29 | { | ||
30 | sio << iState << ": void fnc2( " << a << ", \"" << b << "\" )" << sio.nl; | ||
31 | } | ||
32 | |||
33 | void fnc3( int a, Bu::FString b, double c ) | ||
34 | { | ||
35 | sio << iState << ": void fnc3( " << a << ", \"" << b << "\", " << c << " )" << sio.nl; | ||
36 | } | ||
37 | |||
38 | void fnc4( int a, Bu::FString b, double c, char d ) | ||
39 | { | ||
40 | sio << iState << ": void fnc4( " << a << ", \"" << b << "\", " << c << ", '" << d << "' )" << sio.nl; | ||
41 | } | ||
42 | |||
43 | void fnc5( int a, Bu::FString b, double c, char d, long e ) | ||
44 | { | ||
45 | sio << iState << ": void fnc5( " << a << ", \"" << b << "\", " << c << ", '" << d << "', " << e << " )" << sio.nl; | ||
46 | } | ||
47 | |||
48 | private: | ||
49 | int iState; | ||
50 | }; | ||
51 | |||
52 | void pfnc0() | ||
53 | { | ||
54 | sio << "This doesn't have state, it's pfnc0()!" << sio.nl; | ||
55 | } | ||
56 | |||
57 | void callit( Signal0<void> sig ) | ||
58 | { | ||
59 | sig(); | ||
60 | } | ||
61 | |||
62 | int main() | ||
63 | { | ||
64 | Thing t; | ||
65 | |||
66 | Signal0<void> cb0( slot( &t, &Thing::fnc0 ) ); | ||
67 | cb0(); | ||
68 | |||
69 | Signal1<void, int> cb1( slot( &t, &Thing::fnc1 ) ); | ||
70 | cb1( 5 ); | ||
71 | |||
72 | Signal2<void, int, Bu::FString> cb2( slot( &t, &Thing::fnc2 ) ); | ||
73 | cb2( 5, "Hi there" ); | ||
74 | |||
75 | Signal3<void, int, Bu::FString, double> cb3( slot( &t, &Thing::fnc3 ) ); | ||
76 | cb3( 5, "Hi there", 12.85 ); | ||
77 | |||
78 | Signal4<void, int, Bu::FString, double, char> cb4( slot( &t, &Thing::fnc4 ) ); | ||
79 | cb4( 5, "Hi there", 12.85, 'z' ); | ||
80 | |||
81 | Signal5<void, int, Bu::FString, double, char, long> cb5( slot( &t, &Thing::fnc5 ) ); | ||
82 | cb5( 5, "Hi there", 12.85, 'z', 849 ); | ||
83 | |||
84 | // Signal1<int, int> cb1( slot( &t, &Thing::fnc1 ) ); | ||
85 | // sio << "Result: " << cb1( 5 ) << sio.nl; | ||
86 | } | ||
87 | |||
diff --git a/src/tests/socket.cpp b/src/tests/socket.cpp new file mode 100644 index 0000000..1cf63e4 --- /dev/null +++ b/src/tests/socket.cpp | |||
@@ -0,0 +1,66 @@ | |||
1 | #include <bu/socket.h> | ||
2 | #include <bu/sio.h> | ||
3 | |||
4 | #include <sys/time.h> | ||
5 | #include <time.h> | ||
6 | |||
7 | using namespace Bu; | ||
8 | |||
9 | bool isUp() | ||
10 | { | ||
11 | try | ||
12 | { | ||
13 | Socket s("xagasoft.com", 9898, 1 ); | ||
14 | |||
15 | char buf[5]; | ||
16 | buf[s.read(buf, 2, 1, 0)] = '\0'; | ||
17 | |||
18 | if( !strcmp( buf, "hi" ) ) | ||
19 | return true; | ||
20 | else | ||
21 | return false; | ||
22 | } | ||
23 | catch(...) | ||
24 | { | ||
25 | return false; | ||
26 | } | ||
27 | } | ||
28 | |||
29 | int main() | ||
30 | { | ||
31 | uint32_t uUp = 0; | ||
32 | uint32_t uDown = 0; | ||
33 | uint32_t uTotal = 0; | ||
34 | struct timeval tv; | ||
35 | |||
36 | for(;;) | ||
37 | { | ||
38 | gettimeofday( &tv, NULL ); | ||
39 | time_t goal = ((tv.tv_sec/5)+1)*5; | ||
40 | tv.tv_sec = goal-tv.tv_sec; | ||
41 | tv.tv_usec = 0-tv.tv_usec; | ||
42 | if( tv.tv_usec < 0 ) | ||
43 | { | ||
44 | tv.tv_sec--; | ||
45 | tv.tv_usec = 1000000+tv.tv_usec; | ||
46 | } | ||
47 | select( 0, NULL, NULL, NULL, &tv ); | ||
48 | gettimeofday( &tv, NULL ); | ||
49 | if( isUp() ) | ||
50 | { | ||
51 | uUp++; | ||
52 | sio << "status: up "; | ||
53 | } | ||
54 | else | ||
55 | { | ||
56 | uDown++; | ||
57 | sio << "status: down "; | ||
58 | } | ||
59 | uTotal++; | ||
60 | |||
61 | sio << "(up=" << (uUp*5) << "s, down=" << (uDown*5) << ") up for " | ||
62 | << uUp*100/uTotal << "% of " << uTotal*5 << "s" << sio.nl | ||
63 | << sio.flush; | ||
64 | } | ||
65 | } | ||
66 | |||