diff options
| -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 | |||
