00001
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef MOCKPP_FIFOINVOCATIONDISPATCHER_H
00036 #define MOCKPP_FIFOINVOCATIONDISPATCHER_H
00037
00038
00039 #include <mockpp/mockpp.h>
00040
00041 #include <mockpp/chaining/AbstractInvocationDispatcher.h>
00042
00043
00044 MOCKPP_NS_START
00045
00046
00050 template <typename R,
00051 typename I>
00052 class FIFOInvocationDispatcher : public AbstractInvocationDispatcher<R, I>
00053 {
00054 protected:
00055
00056 typedef typename AbstractInvocationDispatcher<R, I>::Iterator Iterator;
00057
00061 virtual R dispatch( const I &invocation )
00062 {
00063 Iterator it = this->invokables.begin();
00064 Iterator end = this->invokables.end();
00065 for ( ; it != end; ++it )
00066 {
00067 if ( ( *it ) ->matches( invocation ) )
00068 return ( *it ) ->invoke( invocation );
00069 }
00070
00071 return this->defaultStub->invoke( invocation );
00072 }
00073 };
00074
00075
00076 #ifndef MOCKPP_PTI_WEAKNESS // Partial Template Instantiation Weakness
00077
00078
00082 template <typename I>
00083 class FIFOInvocationDispatcher<void, I> : public AbstractInvocationDispatcher<void, I>
00084 {
00085 protected:
00086
00087 typedef typename AbstractInvocationDispatcher<void, I>::Iterator Iterator;
00088
00092 virtual void dispatch( const I &invocation )
00093 {
00094 Iterator it = this->invokables.begin();
00095 Iterator end = this->invokables.end();
00096 for ( ; it != end; ++it )
00097 {
00098 if ( ( *it ) ->matches( invocation ) )
00099 {
00100 ( *it ) ->invoke( invocation );
00101 return;
00102 }
00103 }
00104
00105 this->defaultStub->invoke( invocation );
00106 }
00107 };
00108
00109
00110 #define MOCKPP_FIFOINVOCATIONDISPATCHER_PTI_IMPL(I)
00111 #define MOCKPP_FIFOINVOCATIONDISPATCHER_PTI_DECL(I)
00112
00113
00114 #else // MOCKPP_PTI_WEAKNESS Partial Template Instantiation Weakness
00115
00116
00117 #define MOCKPP_FIFOINVOCATIONDISPATCHER_PTI_DECL(I) \
00118 template<> \
00119 void MOCKPP_NS::FIFOInvocationDispatcher<void, I >::dispatch( const I &invocation );
00120
00121
00122 #define MOCKPP_FIFOINVOCATIONDISPATCHER_PTI_IMPL(I) \
00123 MOCKPP_NS_START \
00124 template<> \
00125 class FIFOInvocationDispatcher<void, I> : public AbstractInvocationDispatcher<void, I> \
00126 { \
00127 protected: \
00128 typedef AbstractInvocationDispatcher<void, I>::Iterator Iterator; \
00129 \
00130 void dispatch( const I &invocation ) \
00131 { \
00132 Iterator it = this->invokables.begin(); \
00133 Iterator end = this->invokables.end(); \
00134 for ( ; it != end; ++it ) \
00135 { \
00136 if ( ( *it ) ->matches( invocation ) ) \
00137 { \
00138 ( *it ) ->invoke( invocation ); \
00139 return; \
00140 } \
00141 } \
00142 \
00143 this->defaultStub->invoke( invocation ); \
00144 } \
00145 }; \
00146 MOCKPP_NS_END
00147
00148 #endif
00149
00150
00151 MOCKPP_NS_END
00152
00163 #endif // MOCKPP_FIFOINVOCATIONDISPATCHER_H