aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2009-12-16 20:10:58 +0000
committerMike Buland <eichlan@xagasoft.com>2009-12-16 20:10:58 +0000
commitf72c6e4b97afeb69d9ea4d743c0c302d647ea424 (patch)
tree48d9d94db520455324e902759e887c0d98de976a
parent5eba456f0147b12a6247cd7aa41e55d121962358 (diff)
downloadlibbu++-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.conf68
-rw-r--r--src/optparser.cpp39
-rw-r--r--src/optparser.h51
-rw-r--r--src/signals.h592
-rw-r--r--src/tests/optparser.cpp27
-rw-r--r--src/tests/signals.cpp87
-rw-r--r--src/tests/socket.cpp66
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
3set CXXFLAGS += "-ggdb -W -Wall";
4
5action "default"
6{
7 build: [targets("header-links"), "libbu++.a"];
8}
9
10action "pkg"
11{
12 build: targets("pkg");
13}
14
15target 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
26target "libbu++.a"
27{
28 input files("src/*.cpp");
29 rule "lib";
30 set CXXFLAGS += "-I. -fPIC";
31}
32
33target "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
57rule "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
3Bu::OptParser::OptParser()
4{
5}
6
7Bu::OptParser::~OptParser()
8{
9}
10
11void 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
21Bu::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
32Bu::OptParser::Option::Option()
33{
34}
35
36Bu::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
8namespace 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
6namespace 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>
3using namespace Bu;
4
5class Opts : public Bu::OptParser
6{
7public:
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
23int 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
4using namespace Bu;
5
6class Thing
7{
8public:
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
48private:
49 int iState;
50};
51
52void pfnc0()
53{
54 sio << "This doesn't have state, it's pfnc0()!" << sio.nl;
55}
56
57void callit( Signal0<void> sig )
58{
59 sig();
60}
61
62int 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
7using namespace Bu;
8
9bool 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
29int 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