1 #ifndef CARMA_CONTROL_FUNCTOR_WORK_REQUEST_H
2 #define CARMA_CONTROL_FUNCTOR_WORK_REQUEST_H
17 template <
typename F >
19 queueFunctorWorkRequestGroup(
20 const ::std::string & requestIdCallString,
21 const ::std::map< ::std::string, F > & keyToFunctorMap,
22 util::WorkResultSet & wrs,
23 WorkerPool & workerPool );
26 template <
typename F >
28 queueFunctorWorkRequestGroup(
29 const ::std::string & requestIdCallString,
30 const ::std::map< ::std::string, F > & keyToFunctorMap,
31 util::WorkResultSet & wrs,
32 WorkerPool & workerPool,
33 const bool loggingOverride );
36 template <
typename F >
37 class FunctorWorkRequestImpl :
public util::WorkRequest::Impl {
39 static util::WorkRequest make( const ::std::string & requestId,
40 const util::WorkResult & wr,
44 FunctorWorkRequestImpl( const ::std::string & requestId,
45 const util::WorkResult & wr,
48 virtual void serviceImpl( );
54 template <
typename F >
55 FunctorWorkRequestImpl< F >::FunctorWorkRequestImpl(
56 const ::std::string & requestId,
57 const util::WorkResult & wr,
59 util::WorkRequest::Impl( requestId, wr ),
65 template <
typename F >
67 FunctorWorkRequestImpl< F >::make( const ::std::string & requestId,
68 const util::WorkResult & wr,
71 return util::WorkRequest(
new FunctorWorkRequestImpl( requestId,
77 template <
typename F >
79 FunctorWorkRequestImpl< F >::serviceImpl( )
85 template <
typename F >
87 queueFunctorWorkRequestGroupImpl(
88 const ::std::string & requestIdCallString,
89 const ::std::map< ::std::string, F > & keyToFunctorMap,
90 util::WorkResultSet & wrs,
91 WorkerPool & workerPool,
92 const bool *
const pLoggingOverride )
94 ::std::set< ::std::string > keysToRemove;
97 typedef typename ::std::map< ::std::string, F >::const_iterator
100 typedef ::std::map< ::std::string, util::WorkResult > KeyToWrMap;
102 const KeyToFunctorMapIter keyToFunctorMapEnd = keyToFunctorMap.end( );
104 KeyToWrMap keyToWrMap;
106 ::std::set< ::std::string >
keys;
108 KeyToFunctorMapIter i = keyToFunctorMap.begin( );
110 for ( ; i != keyToFunctorMapEnd; ++i )
111 keys.insert( i->first );
114 keyToWrMap = wrs.addKeys( keys );
116 keysToRemove.swap( keys );
119 ::std::set< util::WorkRequest > requestGroup;
121 KeyToWrMap::const_iterator i = keyToWrMap.begin( );
122 const KeyToWrMap::const_iterator iEnd = keyToWrMap.end( );
124 while ( i != iEnd ) {
125 const ::std::string key = i->first;
126 const util::WorkResult wr = i->second;
128 const KeyToFunctorMapIter j = keyToFunctorMap.find( key );
130 if ( j == keyToFunctorMapEnd )
131 throw ::std::logic_error(
"Two maps don't agree" );
133 ::std::string requestId = key;
135 if ( requestIdCallString.empty( ) == false ) {
136 if ( requestIdCallString[ 0 ] !=
' ' )
137 requestId.append( 1,
' ' );
139 requestId.append( requestIdCallString );
142 requestId.append(
" request" );
144 const util::WorkRequest request =
145 FunctorWorkRequestImpl< F >::make( requestId,
149 if ( requestGroup.insert( request ).second == false )
150 throw ::std::logic_error(
"request is not unique" );
156 ::std::set< ::std::string > temp;
158 if ( pLoggingOverride != 0 )
159 workerPool.queueRequestGroup( requestGroup, *pLoggingOverride );
161 workerPool.queueRequestGroup( requestGroup );
163 keysToRemove.swap( temp );
165 wrs.removeKeys( keysToRemove );
172 template <
typename F >
174 queueFunctorWorkRequestGroup(
175 const ::std::string & requestIdCallString,
176 const ::std::map< ::std::string, F > & keyToFunctorMap,
177 util::WorkResultSet & wrs,
178 WorkerPool & workerPool )
180 queueFunctorWorkRequestGroupImpl( requestIdCallString,
188 template <
typename F >
190 queueFunctorWorkRequestGroup(
191 const ::std::string & requestIdCallString,
192 const ::std::map< ::std::string, F > & keyToFunctorMap,
193 util::WorkResultSet & wrs,
194 WorkerPool & workerPool,
195 const bool loggingOverride )
197 queueFunctorWorkRequestGroupImpl( requestIdCallString,
Interface file for the carma::control::WorkerPool class.
Interface file for the carma::util::WorkRequest class.
::std::set< K > keys(const ::std::map< K, V > &in)
Return the keys of a map as a set.