From: Christian P. <cp...@us...> - 2005-02-01 16:45:30
|
Update of /cvsroot/pclasses/pclasses2/include/pclasses In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15254/include/pclasses Modified Files: Callback.h CallbackN.sh Log Message: Added numArgs() and virtual ctor to CallbackArgs. Index: CallbackN.sh =================================================================== RCS file: /cvsroot/pclasses/pclasses2/include/pclasses/CallbackN.sh,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- CallbackN.sh 28 Jan 2005 17:11:00 -0000 1.1 +++ CallbackN.sh 1 Feb 2005 16:45:17 -0000 1.2 @@ -1,3 +1,4 @@ +#! /bin/bash #/*************************************************************************** # * Copyright (C) 2005 by Christian Prochnow * # * cp...@se... * @@ -19,7 +20,7 @@ # ***************************************************************************/ # -# this shell-script generates code for Signals with n arguments.... +# this shell-script generates code for Callbacks with n arguments.... # generate_callbackN() @@ -47,13 +48,21 @@ callargs="$callargs, a->arg$num" done -cat <<- EOF > "CallbackN$1.h" +cat << EOF > "CallbackN$1.h" namespace P { /* ----------------- Callback1 ------------------ */ template <$templateargs> -struct CallbackArgs$num: CallbackArgs { $structmembers }; +class CallbackArgs$num: public CallbackArgs { + public: + CallbackArgs$num() : CallbackArgs($num) { } + + CallbackArgs* clone() const + { return new CallbackArgs$num(*this); } + + $structmembers +}; template <$templateargs> CallbackArgs$num<$argtypes> make_args($argtypeswname) @@ -76,8 +85,8 @@ Callback::RetType exec(const CallbackArgs& args) const { RetType ret; - const Args* a = static_cast<const Args*>(&args); - if(!a) throw; + const Args* a = dynamic_cast<const Args*>(&args); + if(!a) throw LogicError("Invalid argument", P_SOURCEINFO); ret.retVal = exec($callargs); return ret; } @@ -97,8 +106,8 @@ Callback::RetType exec(const CallbackArgs& args) const { - const Args* a = static_cast<const Args*>(&args); - if(!a) throw; + const Args* a = dynamic_cast<const Args*>(&args); + if(!a) throw LogicError("Invalid arguments", P_SOURCEINFO); exec($callargs); return RetType(); } Index: Callback.h =================================================================== RCS file: /cvsroot/pclasses/pclasses2/include/pclasses/Callback.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- Callback.h 28 Jan 2005 17:11:57 -0000 1.5 +++ Callback.h 1 Feb 2005 16:45:17 -0000 1.6 @@ -21,9 +21,23 @@ #ifndef P_Callback_h #define P_Callback_h +#include <pclasses/Exception.h> + namespace P { -struct CallbackArgs { }; +class CallbackArgs { + public: + CallbackArgs(int numArgs) : _numArgs(numArgs) { } + virtual ~CallbackArgs() { } + + int numArgs() const throw() + { return _numArgs; } + + virtual CallbackArgs* clone() const = 0; + + private: + int _numArgs; +}; //! Callback base class class Callback { @@ -40,7 +54,13 @@ /* ----------------- Callback0 ------------------ */ //! Callback arguments with no arguments -struct CallbackArgs0: CallbackArgs { }; +class CallbackArgs0: public CallbackArgs { + public: + CallbackArgs0() : CallbackArgs(0) { } + + CallbackArgs* clone() const + { return new CallbackArgs0(*this); } +}; //! Callback base class with no arguments template <typename _RetT> @@ -54,6 +74,9 @@ Callback::RetType exec(const CallbackArgs& args) const { + if(dynamic_cast<const Args*>(&args) == 0) + throw LogicError("Invalid arguments", P_SOURCEINFO); + RetType ret; ret.retVal = exec(); return ret; @@ -74,6 +97,9 @@ Callback::RetType exec(const CallbackArgs& args) const { + if(dynamic_cast<const Args*>(&args) == 0) + throw LogicError("Invalid arguments", P_SOURCEINFO); + exec(); return RetType(); } |