9 @) T! X5 }, FQT_MODULE(Core) + F4 P( m) ]1 K/ c' `9 F : |: j8 E5 d' Q$ r. g7 h#ifndef qdoc n( q I g% Q& Y
) O2 H( J' \! n
namespace QtConcurrent {7 H0 ?/ l+ |# z! N
7 O: O& c# a+ V6 p j
template <typename T>; y1 k, E3 g0 ~" P
struct SelectSpecialization ' ^! w- n4 H# u0 {8 s# H# ]{( f" v3 `+ B$ N* W7 Y! ?2 v
template <class Normal, class Void>8 M: B1 K7 e8 V% ^# A
struct Type { typedef Normal type; }; % M1 a5 E: I0 p) R, n}; " O& ]7 x Q4 W, N8 B 5 m% |6 j0 b1 y9 B, v, i( stemplate <> 8 l4 J9 M1 Z6 K1 e6 }3 ?, m2 fstruct SelectSpecialization<void>. X' n- g) n' p9 z" _
{ $ D' J& p% u% M* K template <class Normal, class Void>: l5 x3 {8 m( `2 j8 W
struct Type { typedef Void type; }; " R8 f" i; F# L$ m* [};4 D9 U# V7 F# o ^
j6 [, w0 ?) T7 K& q7 D" }# H
template <typename T>! i1 _& ^* @2 N/ J
class RunFunctionTaskBase : public QFutureInterface<T> , public QRunnable ' p+ @; b- i' q k{' n8 v6 L6 }) R2 ~- n; y- H7 h9 Y* A* `
public:. l6 W& y' P5 }1 k/ m) @7 L
QFuture<T> start()' F& L' @) l. |7 B0 a( y' G, F
{ 6 H) Z; T/ e" z! g! U this->setRunnable(this);# w. T+ T( p" Z( l$ Q
this->reportStarted(); 5 Q7 @" }# o4 I9 i; g5 X% s QFuture<T> future = this->future(); ) P; M: }; a) y ^ QThreadPool::globalInstance()->start(this, /*m_priority*/ 0); $ z8 ~# F" a& V4 t! r return future;% n( ~& f* c1 @. c; L
}, _ P# _1 p! }: e& c2 C* G' p
1 q" A: R* ^! M7 V- F5 ]3 g void run() {}& ^) G& F2 |# t
virtual void runFunctor() = 0;) U) e, c/ ^ B9 m a# Y
}; 7 }) U! K0 R5 s. A' j r4 o i3 S' G3 n [ f
template <typename T>8 I3 E) E, |, M2 o6 L' S
class RunFunctionTask : public RunFunctionTaskBase<T> & M# `0 o$ o0 P/ c4 N5 x1 W{ 5 }: h( _+ t4 g, M: P c; |public:/ f9 u$ e3 a2 E! B, S1 y& c0 r
void run(). d1 `% X4 y2 b1 {0 Q7 n( R
{% F% U, L; [1 H1 G) N- e
if (this->isCanceled()) {3 c5 Q1 a5 E$ E& s, n! S1 w4 L
this->reportFinished();; G" j1 j6 I, E n3 l; G$ g+ g! V
return; : D, q. D* l* g6 j! V7 E7 C }) b+ x8 }4 N" i- f( b( m
this->runFunctor();8 v F: e0 U+ R, _, g
this->reportResult(result);( K X& {% }' X+ c: v" v
this->reportFinished();8 \( s' K6 A1 C w
} ) |: |& [2 V. B# h T result; 9 Y7 E( I3 [6 J. e};& _, m9 r+ L0 k7 e. x. O C
. F7 P( u. d- W" C" utemplate <> " Q. D. I6 v+ Tclass RunFunctionTask<void> : public RunFunctionTaskBase<void>: R ~9 _' m1 n: y+ ?
{ q0 Z$ _. l; ]% v3 T4 S
public:/ w8 ^, j* h0 ~9 b; M: G D O; H+ F' v
void run()% |! t0 q9 h+ u4 ~3 ?8 n7 m3 n
{. M, u8 e% s" J6 y6 X* d$ U& x
if (this->isCanceled()) { . W. t' D9 f t+ [0 L8 w: w! _' x this->reportFinished(); / u( N( U& h$ o( l return;& g- q/ l9 x5 c, r8 e) u& a, | v3 I
}! f' |3 @$ s* y+ Y; s9 c
this->runFunctor(); $ h- [0 N' b5 O9 j7 f3 Z this->reportFinished();* t! ~8 s8 D6 c
} 1 E) j1 h$ |& W' W. N$ G};; B3 O+ C* M [