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_LIFOINVOCATIONDISPATCHER_H
00036 #define MOCKPP_LIFOINVOCATIONDISPATCHER_H
00037
00038 #include <mockpp/mockpp.h>
00039
00040 #include <mockpp/chaining/AbstractInvocationDispatcher.h>
00041
00042
00043 MOCKPP_NS_START
00044
00045
00049 template <typename R,
00050 typename I>
00051 class LIFOInvocationDispatcher : public AbstractInvocationDispatcher<R, I>
00052 {
00053 protected:
00054
00055 typedef typename AbstractInvocationDispatcher<R, I>::ReverseIterator Iterator;
00056
00060 virtual R dispatch( const I &invocation )
00061 {
00062 Iterator it = this->invokables.rbegin();
00063 Iterator end = this->invokables.rend();
00064
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 LIFOInvocationDispatcher<void, I> : public AbstractInvocationDispatcher<void, I>
00084 {
00085 protected:
00086
00087 typedef typename AbstractInvocationDispatcher<void, I>::ReverseIterator Iterator;
00088
00092 virtual void dispatch( const I &invocation )
00093 {
00094 Iterator it = this->invokables.rbegin();
00095 Iterator end = this->invokables.rend();
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_LIFOINVOCATIONDISPATCHER_PTI_IMPL(I)
00111 #define MOCKPP_LIFOINVOCATIONDISPATCHER_PTI_DECL(I)
00112
00113
00114 #else // MOCKPP_PTI_WEAKNESS Partial Template Instantiation Weakness
00115
00116
00117 #define MOCKPP_LIFOINVOCATIONDISPATCHER_PTI_DECL(I) \
00118 template<> \
00119 void MOCKPP_NS::LIFOInvocationDispatcher<void, I >::dispatch( const I &invocation );
00120
00121
00122 #define MOCKPP_LIFOINVOCATIONDISPATCHER_PTI_IMPL(I) \
00123 MOCKPP_NS_START \
00124 template<> \
00125 class LIFOInvocationDispatcher<void, I> : public AbstractInvocationDispatcher<void, I> \
00126 { \
00127 protected: \
00128 typedef AbstractInvocationDispatcher<void, I>::ReverseIterator Iterator; \
00129 \
00130 void dispatch( const I &invocation ) \
00131 { \
00132 Iterator it = this->invokables.rbegin(); \
00133 Iterator end = this->invokables.rend(); \
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
00149 #endif
00150
00151
00152 MOCKPP_NS_END
00153
00164 #endif // MOCKPP_LIFOINVOCATIONDISPATCHER_H
00165