00001
00047 #ifndef H_CONNECTOR
00048 #define H_CONNECTOR
00049
00050 #ifndef NO_DEPENDENCY_INCLUDES
00051
00052 #include "ProtocolRole.h"
00053
00054 #endif
00055
00057 namespace Connector
00058 {
00059
00060
00061
00062
00063
00064
00065 template< typename P > class SimplePayload
00066 {
00067 protected:
00068 P payload_;
00069 public:
00070 typedef P PayloadType;
00071 virtual ~SimplePayload< P >( )
00072 { }
00073 };
00074
00075
00076
00077 template< typename P, typename B >
00078 class MakesPayloadAvailableForOutput:
00079 public B, public OutputPort< P >
00080 {
00081 public:
00082
00083 virtual operator P &()
00084 { return payload_; }
00085 };
00086
00087
00090 template< typename P, typename B >
00091 class MakesPayloadAvailableForInput:
00092 public B, public InputPort< P >
00093 {
00094 public:
00095
00096 virtual operator const P &()
00097 { return payload_; }
00098 };
00099
00100
00101
00102
00103
00104
00110 template< class U, class B >
00111 class AdaptsPayloadForOutput:
00112 public B, public OutputPort< typename U::PayloadType >
00113 {
00114 U payloadAsU_;
00115 public:
00116
00117 AdaptsPayloadForOutput<U,B>() : payloadAsU_( payload_ )
00118 { }
00119
00120
00121 virtual operator typename U::PayloadType &()
00122 { return payloadAsU_; }
00123 };
00124
00125
00131 template< class D, class B >
00132 class AdaptsPayloadForInput:
00133 public B, public InputPort< typename D::PayloadType >
00134 {
00135 D payloadAsD_;
00136 public:
00137
00138 AdaptsPayloadForInput<D,B>() : payloadAsD_( payload_ )
00139 { }
00140
00141
00142 virtual operator const typename D::PayloadType &()
00143 { return payloadAsD_; }
00144 };
00145
00150 template< class D, class B >
00151 class CopiesPayloadForInput:
00152 public B, public InputPort< D >
00153 {
00154
00155
00156
00157 D payloadCopiedAsD_;
00158 public:
00159
00160 CopiesPayloadForInput<D,B>() : payloadCopiedAsD_( payload_.size() )
00161 { }
00162
00163 virtual ~CopiesPayloadForInput<D,B>()
00164 { }
00165
00166
00167
00168
00169
00170 virtual operator const D &()
00171 {
00172
00173
00174
00175
00176
00177 std::copy( payload_.begin(), payload_.end(), payloadCopiedAsD_.begin() );
00178 return payloadAsD_;
00179 }
00180 };
00181
00182
00183
00184
00185
00186
00191 template<
00192 typename PayloadType
00193 >
00194 class SimpleConnector:
00195 public MakesPayloadAvailableForInput < PayloadType,
00196 MakesPayloadAvailableForOutput < PayloadType,
00197 SimplePayload< PayloadType > > >
00198 {
00199 };
00200
00207 template<
00208 typename UpstreamType,
00209 typename PayloadType,
00210 typename DownstreamType,
00211 template< class, class > class UpstreamPolicy
00212 = AdaptsPayloadForOutput,
00213 template< class, class > class DownstreamPolicy
00214 = AdaptsPayloadForInput,
00215 template< class > class PayloadPolicy
00216 = SimplePayload
00217 >
00218 class PoliciedConnector:
00219 public UpstreamPolicy< UpstreamType,
00220 DownstreamPolicy< DownstreamType,
00221 PayloadPolicy< PayloadType > > >
00222 {
00223 };
00224
00225
00229 template< class A, class B >
00230 class BlitzArrayFromMemoryBuffer : public A
00231 {
00232 public:
00233
00234 BlitzArrayFromMemoryBuffer<A,B> ( B &it ):
00235 A( &it[0], blitz::shape( it.size() ), blitz::neverDeleteData )
00236 { }
00237
00238 typedef A PayloadType;
00239 };
00240
00241
00242
00245 template< class Payload >
00246 class ConstantInputPort: public InputPort< Payload >
00247 {
00248 Payload payload_;
00249 public:
00250 ConstantInputPort<Payload>( const Payload &payload ):
00251 payload_(payload)
00252 { };
00253 virtual ~ConstantInputPort<Payload>() { };
00254
00255 virtual operator const Payload & ( ) { return payload_; };
00256 };
00257
00258
00259
00260
00263 template< class Key, class Payload >
00264 class ConstantLookupInputPort: public LookupInputPort< Key, Payload >
00265 {
00266 Payload payload_;
00267 public:
00268 ConstantLookupInputPort<Key,Payload>( const Payload &payload ):
00269 payload_(payload)
00270 { }
00271 virtual ~ConstantLookupInputPort<Key,Payload>() { }
00272
00273
00274 virtual const Payload &operator() ( const Key & ) { return payload_; }
00275 };
00276
00277
00278
00279
00280
00281 };
00282
00283 #endif // ifndef H_CONNECTOR
00284
00285
00286
00287
00288
00289
00290
00291