55 #ifndef __WORK_PIPELINE_H__
56 #define __WORK_PIPELINE_H__
63 #include <boost/function.hpp>
64 #include <boost/bind/bind.hpp>
65 #include <boost/shared_ptr.hpp>
66 #include <boost/scoped_ptr.hpp>
67 #include <boost/assign/list_of.hpp>
68 #include <boost/type_traits.hpp>
69 #include <boost/mpl/assert.hpp>
70 #include <boost/tuple/tuple.hpp>
73 using namespace boost::placeholders;
78 typedef boost::function<void(
bool)>
FinFn;
95 template<
typename ExternalT>
97 virtual std::string
Key()
const = 0;
98 virtual void Response(std::unique_ptr<ExternalT>) = 0;
108 template<
typename InputT,
typename ResultT,
typename ExternalT,
typename SubResultT = ResultT>
124 typedef boost::function<
128 const std::vector<ExternalT*>
141 typedef boost::function<
143 const std::vector<boost::shared_ptr<SubResultT> >
145 const boost::shared_ptr<InputT> & inp,
153 WorkStage(std::vector<std::pair<int,int> > tinfo,
156 void Start(uint32_t stage,
FinFn finFn,
const boost::shared_ptr<InputT> & inp);
158 boost::shared_ptr<ResultT> Result()
const;
166 boost::shared_ptr<InputT>
inp_;
167 boost::shared_ptr<ResultT>
res_;
168 std::vector<boost::shared_ptr<WorkProcessor<InputT,SubResultT,ExternalT> > >
workers_;
169 std::vector<boost::shared_ptr<SubResultT> >
subRes_;
176 const std::vector<std::pair<int,int> >
tinfo_;
179 void WorkProcCb(uint32_t inst,
bool ret_code);
186 template<
typename T0,
typename T1,
typename T2 = T1,
187 typename T3 = T2,
typename T4 = T3,
188 typename T5 = T4,
typename T6 = T5>
213 void Start(
FinFn finFn,
const boost::shared_ptr<T0> & inp);
219 boost::shared_ptr<ResT> Result()
const;
222 typedef boost::tuple<
223 const boost::shared_ptr<WorkStageIf<T0,T1> >,
224 const boost::shared_ptr<WorkStageIf<T1,T2> >,
225 const boost::shared_ptr<WorkStageIf<T2,T3> >,
226 const boost::shared_ptr<WorkStageIf<T3,T4> >,
227 const boost::shared_ptr<WorkStageIf<T4,T5> >,
228 const boost::shared_ptr<WorkStageIf<T5,T6> > >
sg_type;
243 static void Do(
SelfT * wp) { assert(boost::get<kS+1>(wp->
sg_)); }
246 void WorkStageCb(uint32_t stage,
bool ret_code);
247 template<
int kS,
typename NextT>
void NextStage();
boost::tuple< const boost::shared_ptr< WorkStageIf< T0, T1 > >, const boost::shared_ptr< WorkStageIf< T1, T2 > >, const boost::shared_ptr< WorkStageIf< T2, T3 > >, const boost::shared_ptr< WorkStageIf< T3, T4 > >, const boost::shared_ptr< WorkStageIf< T4, T5 > >, const boost::shared_ptr< WorkStageIf< T5, T6 > > > sg_type
boost::shared_ptr< T0 > inp_
WorkPipeline< T0, T1, T2, T3, T4, T5, T6 > SelfT
boost::shared_ptr< ResT > res_
boost::shared_ptr< InputT > inp_
void StageProceed(boost::true_type)
void StageProceed(boost::false_type)
boost::function< ExternalBase::Efn(uint32_t inst, const std::vector< ExternalT * > &exts, const InputT &inp, SubResultT &subRes)> ExecuteFn
std::atomic< uint32_t > remainingInst_
const std::vector< std::pair< int, int > > tinfo_
std::vector< boost::shared_ptr< SubResultT > > subRes_
std::vector< boost::shared_ptr< WorkProcessor< InputT, SubResultT, ExternalT > > > workers_
boost::function< bool(const std::vector< boost::shared_ptr< SubResultT > > &subs, const boost::shared_ptr< InputT > &inp, ResultT &res)> MergeFn
boost::shared_ptr< ResultT > res_
static bool Incomplete(void *)
boost::function< bool(ExternalBase *)> Efn
virtual ~ExternalProcIf()
virtual void Response(std::unique_ptr< ExternalT >)=0
virtual std::string Key() const =0
static void Do(SelfT *wp)
static void Do(SelfT *wp)
boost::function< void(bool)> FinFn