X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=libs%2Fsignal%2Fisignal.h;h=a8dcdfc9711bf5bf60b0a63c94a185f7cdd683c3;hb=18d60f90d7603cb420150739251cf98519c57406;hp=b6342190bd2ccb505b34ca0f486c571102c362bf;hpb=b7e36c120eb1546a6c6f97f30e42ab7f9a559c61;p=xonotic%2Fnetradiant.git diff --git a/libs/signal/isignal.h b/libs/signal/isignal.h index b6342190..a8dcdfc9 100644 --- a/libs/signal/isignal.h +++ b/libs/signal/isignal.h @@ -22,72 +22,63 @@ bool operator!=( SignalHandlerResult other ) const { const SignalHandlerResult SIGNAL_CONTINUE_EMISSION = SignalHandlerResult( false ); const SignalHandlerResult SIGNAL_STOP_EMISSION = SignalHandlerResult( true ); -template -class SignalHandlerCaller1 -{ +template +class SignalHandlerCallerN; + +template +class SignalHandlerCallerN { public: -typedef typename Caller::first_argument_type first_argument_type; -typedef SignalHandlerResult result_type; -static result_type call( first_argument_type a1 ){ - Caller::call( a1 ); - return SIGNAL_CONTINUE_EMISSION; -} + using func = SignalHandlerResult(Ts...); + + static SignalHandlerResult call(Ts... args) { + Caller::call(args...); + return SIGNAL_CONTINUE_EMISSION; + } }; +template +using SignalHandlerCaller = SignalHandlerCallerN>; + +template +using SignalHandlerCaller1 = SignalHandlerCaller; + +template +using SignalHandlerCaller2 = SignalHandlerCaller; + template -class SignalHandlerCaller2 -{ -public: -typedef typename Caller::first_argument_type first_argument_type; -typedef typename Caller::second_argument_type second_argument_type; -typedef SignalHandlerResult result_type; -static result_type call( first_argument_type a1, second_argument_type a2 ){ - Caller::call( a1, a2 ); - return SIGNAL_CONTINUE_EMISSION; -} -}; +using SignalHandlerCaller3 = SignalHandlerCaller; template -class SignalHandlerCaller3 -{ +using SignalHandlerCaller4 = SignalHandlerCaller; + +template +class TypeEqual { public: -typedef typename Caller::first_argument_type first_argument_type; -typedef typename Caller::second_argument_type second_argument_type; -typedef typename Caller::third_argument_type third_argument_type; -typedef SignalHandlerResult result_type; -static result_type call( first_argument_type a1, second_argument_type a2, third_argument_type a3 ){ - Caller::call( a1, a2, a3 ); - return SIGNAL_CONTINUE_EMISSION; -} + using type = False; }; -template -class SignalHandlerCaller4 -{ +template +class TypeEqual { public: -typedef typename Caller::first_argument_type first_argument_type; -typedef typename Caller::second_argument_type second_argument_type; -typedef typename Caller::third_argument_type third_argument_type; -typedef typename Caller::fourth_argument_type fourth_argument_type; -typedef SignalHandlerResult result_type; -static result_type call( first_argument_type a1, second_argument_type a2, third_argument_type a3, fourth_argument_type a4 ){ - Caller::call( a1, a2, a3, a4 ); - return SIGNAL_CONTINUE_EMISSION; -} + using type = True; }; -class SignalHandler : public Callback0 -{ +template class Wrapper> +class SignalHandlerN : public CB { public: -template -SignalHandler( const BindFirstOpaque& caller ) - : Callback0( BindFirstOpaque, - typename Caller::result_type - >::type>( caller.getBound() ) ){ -} + template + SignalHandlerN(const BindFirstOpaque &caller) + : CB(BindFirstOpaque, + get_result_type + >::type>(caller.getBound())) { + } +}; + +class SignalHandler : public SignalHandlerN, SignalHandlerCaller1> { + using SignalHandlerN, SignalHandlerCaller1>::SignalHandlerN; }; template @@ -95,111 +86,81 @@ inline SignalHandler makeSignalHandler( const BindFirstOpaque& caller ){ return SignalHandler( caller ); } template -inline SignalHandler makeSignalHandler( const Caller& caller, typename Caller::first_argument_type callee ){ +inline SignalHandler makeSignalHandler(const Caller &caller, get_argument callee) { return SignalHandler( BindFirstOpaque( callee ) ); } - template -class SignalHandler1 : public Callback1 -{ -public: -template -SignalHandler1( const BindFirstOpaque1& caller ) - : Callback1( BindFirstOpaque1, - typename Caller::result_type - >::type>( caller.getBound() ) ){ -} +class SignalHandler1 : public SignalHandlerN, SignalHandlerCaller2> { + using SignalHandlerN, SignalHandlerCaller2>::SignalHandlerN; }; template -inline SignalHandler1 makeSignalHandler1( const BindFirstOpaque1& caller ){ - return SignalHandler1( caller ); +inline SignalHandler1> makeSignalHandler1(const BindFirstOpaque &caller) { + return SignalHandler1>(caller); } template -inline SignalHandler1 makeSignalHandler1( const Caller& caller, typename Caller::first_argument_type callee ){ - return SignalHandler1( BindFirstOpaque1( callee ) ); +inline SignalHandler1> +makeSignalHandler1(const Caller &caller, get_argument callee) { + return SignalHandler1>(BindFirstOpaque(callee)); } - template -class SignalHandler2 : public Callback2 -{ -public: -template -SignalHandler2( const BindFirstOpaque2& caller ) - : Callback2( BindFirstOpaque2, - typename Caller::result_type - >::type>( caller.getBound() ) ){ -} +class SignalHandler2 + : public SignalHandlerN, SignalHandlerCaller3> { + using SignalHandlerN, SignalHandlerCaller3>::SignalHandlerN; }; template inline SignalHandler2< - typename Caller::second_argument_type, - typename Caller::third_argument_type - > makeSignalHandler2( const BindFirstOpaque2& caller ){ + get_argument, + get_argument +> makeSignalHandler2(const BindFirstOpaque &caller) { return SignalHandler2< - typename Caller::second_argument_type, - typename Caller::third_argument_type + get_argument, + get_argument >( caller ); } template inline SignalHandler2< - typename Caller::second_argument_type, - typename Caller::third_argument_type - > makeSignalHandler2( const Caller& caller, typename Caller::first_argument_type callee ){ + get_argument, + get_argument +> makeSignalHandler2(const Caller &caller, get_argument callee) { return SignalHandler2< - typename Caller::second_argument_type, - typename Caller::third_argument_type - >( BindFirstOpaque2( callee ) ); + get_argument, + get_argument + >(BindFirstOpaque(callee)); } - template -class SignalHandler3 : public Callback3 -{ -public: -template -SignalHandler3( const BindFirstOpaque3& caller ) - : Callback3( BindFirstOpaque3, - typename Caller::result_type - >::type>( caller.getBound() ) ){ -} +class SignalHandler3 + : public SignalHandlerN, SignalHandlerCaller4> { + using SignalHandlerN, SignalHandlerCaller4>::SignalHandlerN; }; template inline SignalHandler3< - typename Caller::second_argument_type, - typename Caller::third_argument_type, - typename Caller::fourth_argument_type - > makeSignalHandler3( const BindFirstOpaque3& caller ){ + get_argument, + get_argument, + get_argument +> makeSignalHandler3(const BindFirstOpaque &caller) { return SignalHandler3< - typename Caller::second_argument_type, - typename Caller::third_argument_type, - typename Caller::fourth_argument_type + get_argument, + get_argument, + get_argument >( caller ); } template inline SignalHandler3< - typename Caller::second_argument_type, - typename Caller::third_argument_type, - typename Caller::fourth_argument_type - > makeSignalHandler3( const Caller& caller, typename Caller::first_argument_type callee ){ + get_argument, + get_argument, + get_argument +> makeSignalHandler3(const Caller &caller, get_argument callee) { return SignalHandler3< - typename Caller::second_argument_type, - typename Caller::third_argument_type, - typename Caller::fourth_argument_type - >( BindFirstOpaque3( callee ) ); + get_argument, + get_argument, + get_argument + >(BindFirstOpaque(callee)); } #endif