From f16c5dd212ca03ec5f13759997bf95982e3aee94 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Wed, 22 Jun 2011 15:15:13 +0000 Subject: gensigs actually works, I'm going to try replacing the old signal code with generated signal code. After that, I can actually make changes to the signal code. --- gensigs.bld | 282 +++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 155 insertions(+), 127 deletions(-) diff --git a/gensigs.bld b/gensigs.bld index accf107..0658b88 100644 --- a/gensigs.bld +++ b/gensigs.bld @@ -1,136 +1,164 @@ -for i in range( 0, 5 ) do +function genSigs( maxParams ) { - templparams = ""; - funcparams = ""; - templcallparams = ""; - funccallparams = ""; - if i >= 1 then + fOut = open("testsignal.h", "w"); + fOut.write( + "/*\n" + " * Copyright (C) 2007-2011 Xagasoft, All rights reserved.\n" + " *\n" + " * This file is part of the libbu++ library and is released under the\n" + " * terms of the license contained in the file LICENSE.\n" + " */\n" + "\n" + "#ifndef BU_OBJECT_SIGNALS_H\n" + "#define BU_OBJECT_SIGNALS_H\n" + "\n" + "#include \"bu/util.h\"\n" + "#include \"bu/exceptionbase.h\"\n" + "\n" + "namespace Bu\n" + "{\n" + " subExceptionDecl( SignalException );\n" + "\n" + ); + + for i in range( 0, 5 ) do { - for p in range( 1, i ) do + templParams = "typename ret"; + funcParams = ""; + funcAnonParams = ""; + templCallParams = "ret"; + funcCallParams = ""; + if i >= 1 then { - if p > 1 then + for p in range( 1, i ) do { - templcallparams << ", "; - funccallparams << ", "; - funcparams << ", "; + if p > 1 then + { + funcCallParams << ", "; + funcParams << ", "; + funcAnonParams << ", "; + } + templParams << ", typename p${p}t"; + funcParams << "p${p}t p${p}"; + funcAnonParams << "p${p}t"; + templCallParams << ", p${p}t"; + funcCallParams << "p${p}"; } - templparams << ", typename p${p}t"; - funcparams << "p${p}t p${p}"; - templcallparams << "p${p}t"; - funccallparams << "p${p}"; } + fOut.write( + " //\n" + " // ${i} Parameter(s)\n" + " //\n" + " template<${templParams}>\n" + " class _Slot${i}\n" + " {\n" + " public:\n" + " _Slot${i}() { }\n" + " virtual ~_Slot${i}() { }\n" + " virtual ret operator()( ${funcParams} )=0;\n" + " virtual _Slot${i}<${templCallParams}> *clone() const=0;\n" + " };\n" + " \n" + " template\n" + " class __Slot${i} : public _Slot${i}<${templCallParams}>\n" + " {\n" + " public:\n" + " __Slot${i}( cls *pCls, ret (cls::*pFnc)( ${funcAnonParams} ) ) :\n" + " pCls( pCls ), pFnc( pFnc ) { }\n" + " virtual ~__Slot${i}() { }\n" + " \n" + " virtual ret operator()( ${funcParams} )\n" + " {\n" + " return (pCls->*pFnc)( ${funcCallParams} );\n" + " }\n" + " \n" + " virtual _Slot${i}<${templCallParams}> *clone() const\n" + " {\n" + " return new __Slot${i}( pCls, pFnc );\n" + " }\n" + " \n" + " private:\n" + " cls *pCls;\n" + " ret (cls::*pFnc)( ${funcAnonParams} );\n" + " };\n" + " \n" + " template<${templParams}>\n" + " class __Slot${i}F : public _Slot${i}<${templCallParams}>\n" + " {\n" + " public:\n" + " __Slot${i}F( ret (*pFnc)( ${funcAnonParams} ) ) :\n" + " pFnc( pFnc ) { }\n" + " virtual ~__Slot${i}F() { }\n" + " \n" + " virtual ret operator()( ${funcParams} )\n" + " {\n" + " return (*pFnc)( ${funcCallParams} );\n" + " }\n" + " \n" + " virtual _Slot${i}<${templCallParams}> *clone() const\n" + " {\n" + " return new __Slot${i}F<${templCallParams}>( pFnc );\n" + " }\n" + " \n" + " private:\n" + " ret (*pFnc)( ${funcAnonParams} );\n" + " };\n" + " \n" + " template<${templParams}>\n" + " class Signal${i}\n" + " {\n" + " public:\n" + " Signal${i}() : pCb( NULL ) { }\n" + " Signal${i}( _Slot${i}<${templCallParams}> *pCb ) : pCb( pCb ) { }\n" + " Signal${i}( const Signal${i}<${templCallParams}> &rSrc ) :\n" + " pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }\n" + " virtual ~Signal${i}() { delete pCb; pCb = NULL; }\n" + " \n" + " ret operator()( ${funcParams} )\n" + " {\n" + " if( !pCb ) throw SignalException(\"Uninitialized signal called.\");\n" + " return (*pCb)( ${funcCallParams} );\n" + " }\n" + " \n" + " bool isSet() const { return pCb != NULL; }\n" + " operator bool() const { return isSet(); }\n" + " \n" + " Signal${i}<${templCallParams}> &operator=( const Signal${i}<${templCallParams}> &rhs )\n" + " {\n" + " pCb = rhs.pCb->clone();\n" + " return *this;\n" + " }\n" + " \n" + " private:\n" + " _Slot${i}<${templCallParams}> *pCb;\n" + " };\n" + " \n" + " template\n" + " Signal${i}<${templCallParams}> slot( cls *pCls, ret (cls::*pFnc)( ${funcAnonParams} ) )\n" + " {\n" + " if( !pCls || !pFnc ) throw SignalException(\"NULL pointer in slot().\");\n" + " return Signal${i}<${templCallParams}>(\n" + " new __Slot${i}( pCls, pFnc )\n" + " );\n" + " }\n" + " \n" + " template<${templParams}>\n" + " Signal${i}<${templCallParams}> slot( ret (*pFnc)( ${funcAnonParams} ) )\n" + " {\n" + " if( !pFnc ) throw SignalException(\"NULL pointer in slot().\");\n" + " return Signal${i}<${templCallParams}>(\n" + " new __Slot${i}F<${templCallParams}>( pFnc )\n" + " );\n" + " }\n" + "\n" + ); } - warning "template"; - warning "virtual ret operator()( ${funcparams} )=0;"; -} -/* - - // - // 1 Parameter - // - - template - class _Slot1 - { - public: - _Slot1() { } - virtual ~_Slot1() { } - - virtual ret operator()( p1t p1 )=0; - - virtual _Slot1 *clone() const=0; - }; - - template - class __Slot1 : public _Slot1 - { - public: - __Slot1( cls *pCls, ret (cls::*pFnc)( p1t ) ) : - pCls( pCls ), pFnc( pFnc ) { } - virtual ~__Slot1() { } - - virtual ret operator()( p1t p1 ) - { - return (pCls->*pFnc)( p1 ); - } - - virtual _Slot1 *clone() const - { - return new __Slot1( pCls, pFnc ); - } - - private: - cls *pCls; - ret (cls::*pFnc)( p1t ); - }; - - template - class __Slot1F : public _Slot1 - { - public: - __Slot1F( ret (*pFnc)( p1t ) ) : - pFnc( pFnc ) { } - virtual ~__Slot1F() { } - - virtual ret operator()( p1t p1 ) - { - return (*pFnc)( p1 ); - } - - virtual _Slot1 *clone() const - { - return new __Slot1F( pFnc ); - } - - private: - ret (*pFnc)( p1t p1 ); - }; - - template - class Signal1 - { - public: - Signal1() : pCb( NULL ) { } - Signal1( _Slot1 *pCb ) : pCb( pCb ) { } - Signal1( const Signal1 &rSrc ) : - pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { } - - virtual ~Signal1() { delete pCb; pCb = NULL; } - - ret operator()( p1t p1 ) - { - if( !pCb ) throw SignalException("Uninitialized signal used."); - return (*pCb)( p1 ); - } - bool isSet() const { return pCb != NULL; } - operator bool() const { return isSet(); } - - Signal1 &operator=( const Signal1 &rhs ) - { - pCb = rhs.pCb->clone(); - return *this; - } + fOut.write( + "};\n" + "\n" + "#endif\n" + ); + fOut.close(); +} - private: - _Slot1 *pCb; - }; - - template - Signal1 slot( cls *pCls, ret (cls::*pFnc)( p1t ) ) - { - if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot()."); - return Signal1( - new __Slot1( pCls, pFnc ) - ); - } - - template - Signal1 slot( ret (*pFnc)( p1t ) ) - { - if( !pFnc ) throw SignalException("NULL pointer in slot()."); - return Signal1( - new __Slot1F( pFnc ) - ); - } - */ -- cgit v1.2.3