/tests/auto/qtconcurrentfilter/tst_qtconcurrentfilter.cpp

https://bitbucket.org/ultra_iter/qt-vtl · C++ · 1546 lines · 1371 code · 102 blank · 73 comment · 21 complexity · b62fb8afbae2b193c4c7952f4583ce8f MD5 · raw file

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
  4. ** All rights reserved.
  5. ** Contact: Nokia Corporation (qt-info@nokia.com)
  6. **
  7. ** This file is part of the test suite of the Qt Toolkit.
  8. **
  9. ** $QT_BEGIN_LICENSE:LGPL$
  10. ** GNU Lesser General Public License Usage
  11. ** This file may be used under the terms of the GNU Lesser General Public
  12. ** License version 2.1 as published by the Free Software Foundation and
  13. ** appearing in the file LICENSE.LGPL included in the packaging of this
  14. ** file. Please review the following information to ensure the GNU Lesser
  15. ** General Public License version 2.1 requirements will be met:
  16. ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
  17. **
  18. ** In addition, as a special exception, Nokia gives you certain additional
  19. ** rights. These rights are described in the Nokia Qt LGPL Exception
  20. ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
  21. **
  22. ** GNU General Public License Usage
  23. ** Alternatively, this file may be used under the terms of the GNU General
  24. ** Public License version 3.0 as published by the Free Software Foundation
  25. ** and appearing in the file LICENSE.GPL included in the packaging of this
  26. ** file. Please review the following information to ensure the GNU General
  27. ** Public License version 3.0 requirements will be met:
  28. ** http://www.gnu.org/copyleft/gpl.html.
  29. **
  30. ** Other Usage
  31. ** Alternatively, this file may be used in accordance with the terms and
  32. ** conditions contained in a signed written agreement between you and Nokia.
  33. **
  34. **
  35. **
  36. **
  37. **
  38. ** $QT_END_LICENSE$
  39. **
  40. ****************************************************************************/
  41. #include <qtconcurrentfilter.h>
  42. #include <QCoreApplication>
  43. #include <QList>
  44. #include <QLinkedList>
  45. #include <QtTest/QtTest>
  46. #include "../qtconcurrentmap/functions.h"
  47. #include "../qfuture/versioncheck.h"
  48. class tst_QtConcurrentFilter : public QObject
  49. {
  50. Q_OBJECT
  51. private slots:
  52. void filter();
  53. void filtered();
  54. void filteredReduced();
  55. void resultAt();
  56. void incrementalResults();
  57. void noDetatch();
  58. void stlContainers();
  59. };
  60. #if !defined (QT_NO_CONCURRENT_TEST) && !defined(QT_NO_CONCURRENT_FILTER)
  61. void tst_QtConcurrentFilter::filter()
  62. {
  63. // functor
  64. {
  65. QList<int> list;
  66. list << 1 << 2 << 3 << 4;
  67. QtConcurrent::filter(list, KeepEvenIntegers()).waitForFinished();
  68. QCOMPARE(list, QList<int>() << 2 << 4);
  69. }
  70. {
  71. QList<int> list;
  72. list << 1 << 2 << 3 << 4;
  73. QtConcurrent::blockingFilter(list, KeepEvenIntegers());
  74. QCOMPARE(list, QList<int>() << 2 << 4);
  75. }
  76. {
  77. QLinkedList<int> linkedList;
  78. linkedList << 1 << 2 << 3 << 4;
  79. QtConcurrent::filter(linkedList, KeepEvenIntegers()).waitForFinished();
  80. QCOMPARE(linkedList, QLinkedList<int>() << 2 << 4);
  81. }
  82. {
  83. QLinkedList<int> linkedList;
  84. linkedList << 1 << 2 << 3 << 4;
  85. QtConcurrent::blockingFilter(linkedList, KeepEvenIntegers());
  86. QCOMPARE(linkedList, QLinkedList<int>() << 2 << 4);
  87. }
  88. {
  89. QVector<int> vector;
  90. vector << 1 << 2 << 3 << 4;
  91. QtConcurrent::filter(vector, KeepEvenIntegers()).waitForFinished();
  92. QCOMPARE(vector, QVector<int>() << 2 << 4);
  93. }
  94. {
  95. QVector<int> vector;
  96. vector << 1 << 2 << 3 << 4;
  97. QtConcurrent::blockingFilter(vector, KeepEvenIntegers());
  98. QCOMPARE(vector, QVector<int>() << 2 << 4);
  99. }
  100. // function
  101. {
  102. QList<int> list;
  103. list << 1 << 2 << 3 << 4;
  104. QtConcurrent::filter(list, keepEvenIntegers).waitForFinished();
  105. QCOMPARE(list, QList<int>() << 2 << 4);
  106. }
  107. {
  108. QList<int> list;
  109. list << 1 << 2 << 3 << 4;
  110. QtConcurrent::blockingFilter(list, keepEvenIntegers);
  111. QCOMPARE(list, QList<int>() << 2 << 4);
  112. }
  113. {
  114. QLinkedList<int> linkedList;
  115. linkedList << 1 << 2 << 3 << 4;
  116. QtConcurrent::filter(linkedList, keepEvenIntegers).waitForFinished();
  117. QCOMPARE(linkedList, QLinkedList<int>() << 2 << 4);
  118. }
  119. {
  120. QLinkedList<int> linkedList;
  121. linkedList << 1 << 2 << 3 << 4;
  122. QtConcurrent::blockingFilter(linkedList, keepEvenIntegers);
  123. QCOMPARE(linkedList, QLinkedList<int>() << 2 << 4);
  124. }
  125. // bound function
  126. {
  127. QList<int> list;
  128. list << 1 << 2 << 3 << 4;
  129. QtConcurrent::filter(list, keepEvenIntegers).waitForFinished();
  130. QCOMPARE(list, QList<int>() << 2 << 4);
  131. }
  132. {
  133. QList<int> list;
  134. list << 1 << 2 << 3 << 4;
  135. QtConcurrent::blockingFilter(list, keepEvenIntegers);
  136. QCOMPARE(list, QList<int>() << 2 << 4);
  137. }
  138. {
  139. QLinkedList<int> linkedList;
  140. linkedList << 1 << 2 << 3 << 4;
  141. QtConcurrent::filter(linkedList, keepEvenIntegers).waitForFinished();
  142. QCOMPARE(linkedList, QLinkedList<int>() << 2 << 4);
  143. }
  144. {
  145. QLinkedList<int> linkedList;
  146. linkedList << 1 << 2 << 3 << 4;
  147. QtConcurrent::blockingFilter(linkedList, keepEvenIntegers);
  148. QCOMPARE(linkedList, QLinkedList<int>() << 2 << 4);
  149. }
  150. // member
  151. {
  152. QList<Number> list;
  153. list << 1 << 2 << 3 << 4;
  154. QtConcurrent::filter(list, &Number::isEven).waitForFinished();
  155. QCOMPARE(list, QList<Number>() << 2 << 4);
  156. }
  157. {
  158. QList<Number> list;
  159. list << 1 << 2 << 3 << 4;
  160. QtConcurrent::blockingFilter(list, &Number::isEven);
  161. QCOMPARE(list, QList<Number>() << 2 << 4);
  162. }
  163. {
  164. QLinkedList<Number> linkedList;
  165. linkedList << 1 << 2 << 3 << 4;
  166. QtConcurrent::filter(linkedList, &Number::isEven).waitForFinished();
  167. QCOMPARE(linkedList, QLinkedList<Number>() << 2 << 4);
  168. }
  169. {
  170. QLinkedList<Number> linkedList;
  171. linkedList << 1 << 2 << 3 << 4;
  172. QtConcurrent::blockingFilter(linkedList, &Number::isEven);
  173. QCOMPARE(linkedList, QLinkedList<Number>() << 2 << 4);
  174. }
  175. }
  176. void tst_QtConcurrentFilter::filtered()
  177. {
  178. QList<int> list;
  179. list << 1 << 2 << 3 << 4;
  180. // functor
  181. {
  182. QFuture<int> f = QtConcurrent::filtered(list, KeepEvenIntegers());
  183. QList<int> list2 = f.results();
  184. QCOMPARE(list2, QList<int>() << 2 << 4);
  185. }
  186. {
  187. QFuture<int> f = QtConcurrent::filtered(list.begin(), list.end(), KeepEvenIntegers());
  188. QList<int> list2 = f.results();
  189. QCOMPARE(list2, QList<int>() << 2 << 4);
  190. }
  191. {
  192. QFuture<int> f = QtConcurrent::filtered(list.constBegin(),
  193. list.constEnd(),
  194. KeepEvenIntegers());
  195. QList<int> list2 = f.results();
  196. QCOMPARE(list2, QList<int>() << 2 << 4);
  197. }
  198. {
  199. QList<int> list2 = QtConcurrent::blockingFiltered(list, KeepEvenIntegers());
  200. QCOMPARE(list2, QList<int>() << 2 << 4);
  201. }
  202. {
  203. QList<int> list2 = QtConcurrent::blockingFiltered<QList<int> >(list.begin(),
  204. list.end(),
  205. KeepEvenIntegers());
  206. QCOMPARE(list2, QList<int>() << 2 << 4);
  207. }
  208. {
  209. QList<int> list2 = QtConcurrent::blockingFiltered<QList<int> >(list.constBegin(),
  210. list.constEnd(),
  211. KeepEvenIntegers());
  212. QCOMPARE(list2, QList<int>() << 2 << 4);
  213. }
  214. {
  215. QVector<int> vector;
  216. vector << 1 << 2 << 3 << 4;
  217. QVector<int> vector2 = QtConcurrent::blockingFiltered(vector, KeepEvenIntegers());
  218. QCOMPARE(vector2, QVector<int>() << 2 << 4);
  219. }
  220. {
  221. QVector<int> vector;
  222. vector << 1 << 2 << 3 << 4;
  223. QFuture<int> f = QtConcurrent::filtered(vector, KeepEvenIntegers());
  224. QCOMPARE(f.results(), QList<int>() << 2 << 4);
  225. }
  226. {
  227. QLinkedList<int> linkedList;
  228. linkedList << 1 << 2 << 3 << 4;
  229. QLinkedList<int> linkedList2 = QtConcurrent::blockingFiltered(linkedList, KeepEvenIntegers());
  230. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  231. }
  232. {
  233. QLinkedList<int> linkedList;
  234. linkedList << 1 << 2 << 3 << 4;
  235. QFuture<int> f = QtConcurrent::filtered(linkedList, KeepEvenIntegers());
  236. QCOMPARE(f.results(), QList<int>() << 2 << 4);
  237. }
  238. // function
  239. {
  240. QFuture<int> f = QtConcurrent::filtered(list, keepEvenIntegers);
  241. QList<int> list2 = f.results();
  242. QCOMPARE(list2, QList<int>() << 2 << 4);
  243. }
  244. {
  245. QFuture<int> f = QtConcurrent::filtered(list.begin(), list.end(), keepEvenIntegers);
  246. QList<int> list2 = f.results();
  247. QCOMPARE(list2, QList<int>() << 2 << 4);
  248. }
  249. {
  250. QFuture<int> f = QtConcurrent::filtered(list.constBegin(),
  251. list.constEnd(),
  252. keepEvenIntegers);
  253. QList<int> list2 = f.results();
  254. QCOMPARE(list2, QList<int>() << 2 << 4);
  255. }
  256. {
  257. QList<int> list2 = QtConcurrent::blockingFiltered(list, keepEvenIntegers);
  258. QCOMPARE(list2, QList<int>() << 2 << 4);
  259. }
  260. {
  261. QList<int> list2 = QtConcurrent::blockingFiltered<QList<int> >(list.begin(),
  262. list.end(),
  263. keepEvenIntegers);
  264. QCOMPARE(list2, QList<int>() << 2 << 4);
  265. }
  266. {
  267. QList<int> list2 = QtConcurrent::blockingFiltered<QList<int> >(list.constBegin(),
  268. list.constEnd(),
  269. keepEvenIntegers);
  270. QCOMPARE(list2, QList<int>() << 2 << 4);
  271. }
  272. // bound function
  273. {
  274. QFuture<int> f = QtConcurrent::filtered(list, keepEvenIntegers);
  275. QList<int> list2 = f.results();
  276. QCOMPARE(list2, QList<int>() << 2 << 4);
  277. }
  278. {
  279. QFuture<int> f = QtConcurrent::filtered(list.begin(), list.end(), keepEvenIntegers);
  280. QList<int> list2 = f.results();
  281. QCOMPARE(list2, QList<int>() << 2 << 4);
  282. }
  283. {
  284. QFuture<int> f = QtConcurrent::filtered(list.constBegin(),
  285. list.constEnd(),
  286. keepEvenIntegers);
  287. QList<int> list2 = f.results();
  288. QCOMPARE(list2, QList<int>() << 2 << 4);
  289. }
  290. {
  291. QList<int> list2 = QtConcurrent::blockingFiltered(list, keepEvenIntegers);
  292. QCOMPARE(list2, QList<int>() << 2 << 4);
  293. }
  294. {
  295. QList<int> list2 = QtConcurrent::blockingFiltered<QList<int> >(list.begin(),
  296. list.end(),
  297. keepEvenIntegers);
  298. QCOMPARE(list2, QList<int>() << 2 << 4);
  299. }
  300. {
  301. QList<int> list2 = QtConcurrent::blockingFiltered<QList<int> >(list.constBegin(),
  302. list.constEnd(),
  303. keepEvenIntegers);
  304. QCOMPARE(list2, QList<int>() << 2 << 4);
  305. }
  306. // const member function
  307. {
  308. QList<Number> integers;
  309. integers << 1 << 2 << 3 << 4;
  310. QFuture<Number> f = QtConcurrent::filtered(integers, &Number::isEven);
  311. QList<Number> list2 = f.results();
  312. QCOMPARE(list2, QList<Number>() << 2 << 4);
  313. }
  314. {
  315. QList<Number> integers;
  316. integers << 1 << 2 << 3 << 4;
  317. QFuture<Number> f = QtConcurrent::filtered(integers.begin(),
  318. integers.end(),
  319. &Number::isEven);
  320. QList<Number> list2 = f.results();
  321. QCOMPARE(list2, QList<Number>() << 2 << 4);
  322. }
  323. {
  324. QList<Number> integers;
  325. integers << 1 << 2 << 3 << 4;
  326. QFuture<Number> f = QtConcurrent::filtered(integers.constBegin(),
  327. integers.constEnd(),
  328. &Number::isEven);
  329. QList<Number> list2 = f.results();
  330. QCOMPARE(list2, QList<Number>() << 2 << 4);
  331. }
  332. {
  333. QList<Number> integers;
  334. integers << 1 << 2 << 3 << 4;
  335. QList<Number> list2 = QtConcurrent::blockingFiltered(integers, &Number::isEven);
  336. QCOMPARE(list2, QList<Number>() << 2 << 4);
  337. }
  338. {
  339. QList<Number> integers;
  340. integers << 1 << 2 << 3 << 4;
  341. QList<Number> list2 = QtConcurrent::blockingFiltered<QList<Number> >(integers.begin(),
  342. integers.end(),
  343. &Number::isEven);
  344. QCOMPARE(list2, QList<Number>() << 2 << 4);
  345. }
  346. {
  347. QList<Number> integers;
  348. integers << 1 << 2 << 3 << 4;
  349. QList<Number> list2 =
  350. QtConcurrent::blockingFiltered<QList<Number> >(integers.constBegin(),
  351. integers.constEnd(),
  352. &Number::isEven);
  353. QCOMPARE(list2, QList<Number>() << 2 << 4);
  354. }
  355. // same thing on linked lists
  356. QLinkedList<int> linkedList;
  357. linkedList << 1 << 2 << 3 << 4;
  358. // functor
  359. {
  360. QFuture<int> f = QtConcurrent::filtered(linkedList, KeepEvenIntegers());
  361. QList<int> linkedList2 = f.results();
  362. QCOMPARE(linkedList2, QList<int>() << 2 << 4);
  363. }
  364. {
  365. QFuture<int> f = QtConcurrent::filtered(linkedList.begin(),
  366. linkedList.end(),
  367. KeepEvenIntegers());
  368. QList<int> linkedList2 = f.results();
  369. QCOMPARE(linkedList2, QList<int>() << 2 << 4);
  370. }
  371. {
  372. QFuture<int> f = QtConcurrent::filtered(linkedList.constBegin(),
  373. linkedList.constEnd(),
  374. KeepEvenIntegers());
  375. QList<int> linkedList2 = f.results();
  376. QCOMPARE(linkedList2, QList<int>() << 2 << 4);
  377. }
  378. {
  379. QLinkedList<int> linkedList2 = QtConcurrent::blockingFiltered(linkedList, KeepEvenIntegers());
  380. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  381. }
  382. {
  383. QLinkedList<int> linkedList2 = QtConcurrent::blockingFiltered<QLinkedList<int> >(linkedList.begin(),
  384. linkedList.end(),
  385. KeepEvenIntegers());
  386. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  387. }
  388. {
  389. QLinkedList<int> linkedList2 = QtConcurrent::blockingFiltered<QLinkedList<int> >(linkedList.constBegin(),
  390. linkedList.constEnd(),
  391. KeepEvenIntegers());
  392. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  393. }
  394. // function
  395. {
  396. QFuture<int> f = QtConcurrent::filtered(linkedList, keepEvenIntegers);
  397. QList<int> linkedList2 = f.results();
  398. QCOMPARE(linkedList2, QList<int>() << 2 << 4);
  399. }
  400. {
  401. QFuture<int> f = QtConcurrent::filtered(linkedList.begin(),
  402. linkedList.end(),
  403. keepEvenIntegers);
  404. QList<int> linkedList2 = f.results();
  405. QCOMPARE(linkedList2, QList<int>() << 2 << 4);
  406. }
  407. {
  408. QFuture<int> f = QtConcurrent::filtered(linkedList.constBegin(),
  409. linkedList.constEnd(),
  410. keepEvenIntegers);
  411. QList<int> linkedList2 = f.results();
  412. QCOMPARE(linkedList2, QList<int>() << 2 << 4);
  413. }
  414. {
  415. QLinkedList<int> linkedList2 = QtConcurrent::blockingFiltered(linkedList, keepEvenIntegers);
  416. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  417. }
  418. {
  419. QLinkedList<int> linkedList2 = QtConcurrent::blockingFiltered<QLinkedList<int> >(linkedList.begin(),
  420. linkedList.end(),
  421. keepEvenIntegers);
  422. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  423. }
  424. {
  425. QLinkedList<int> linkedList2 = QtConcurrent::blockingFiltered<QLinkedList<int> >(linkedList.constBegin(),
  426. linkedList.constEnd(),
  427. keepEvenIntegers);
  428. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  429. }
  430. // bound function
  431. {
  432. QFuture<int> f = QtConcurrent::filtered(linkedList, keepEvenIntegers);
  433. QList<int> linkedList2 = f.results();
  434. QCOMPARE(linkedList2, QList<int>() << 2 << 4);
  435. }
  436. {
  437. QFuture<int> f = QtConcurrent::filtered(linkedList.begin(),
  438. linkedList.end(),
  439. keepEvenIntegers);
  440. QList<int> linkedList2 = f.results();
  441. QCOMPARE(linkedList2, QList<int>() << 2 << 4);
  442. }
  443. {
  444. QFuture<int> f = QtConcurrent::filtered(linkedList.constBegin(),
  445. linkedList.constEnd(),
  446. keepEvenIntegers);
  447. QList<int> linkedList2 = f.results();
  448. QCOMPARE(linkedList2, QList<int>() << 2 << 4);
  449. }
  450. {
  451. QLinkedList<int> linkedList2 = QtConcurrent::blockingFiltered(linkedList, keepEvenIntegers);
  452. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  453. }
  454. {
  455. QLinkedList<int> linkedList2 = QtConcurrent::blockingFiltered<QLinkedList<int> >(linkedList.begin(),
  456. linkedList.end(),
  457. keepEvenIntegers);
  458. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  459. }
  460. {
  461. QLinkedList<int> linkedList2 = QtConcurrent::blockingFiltered<QLinkedList<int> >(linkedList.constBegin(),
  462. linkedList.constEnd(),
  463. keepEvenIntegers);
  464. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  465. }
  466. // const member function
  467. {
  468. QLinkedList<Number> integers;
  469. integers << 1 << 2 << 3 << 4;
  470. QFuture<Number> f = QtConcurrent::filtered(integers, &Number::isEven);
  471. QList<Number> linkedList2 = f.results();
  472. QCOMPARE(linkedList2, QList<Number>() << 2 << 4);
  473. }
  474. {
  475. QLinkedList<Number> integers;
  476. integers << 1 << 2 << 3 << 4;
  477. QFuture<Number> f = QtConcurrent::filtered(integers.begin(),
  478. integers.end(),
  479. &Number::isEven);
  480. QList<Number> linkedList2 = f.results();
  481. QCOMPARE(linkedList2, QList<Number>() << 2 << 4);
  482. }
  483. {
  484. QLinkedList<Number> integers;
  485. integers << 1 << 2 << 3 << 4;
  486. QFuture<Number> f = QtConcurrent::filtered(integers.constBegin(),
  487. integers.constEnd(),
  488. &Number::isEven);
  489. QList<Number> linkedList2 = f.results();
  490. QCOMPARE(linkedList2, QList<Number>() << 2 << 4);
  491. }
  492. {
  493. QLinkedList<Number> integers;
  494. integers << 1 << 2 << 3 << 4;
  495. QLinkedList<Number> linkedList2 = QtConcurrent::blockingFiltered(integers, &Number::isEven);
  496. QCOMPARE(linkedList2, QLinkedList<Number>() << 2 << 4);
  497. }
  498. {
  499. QLinkedList<Number> integers;
  500. integers << 1 << 2 << 3 << 4;
  501. QLinkedList<Number> linkedList2 = QtConcurrent::blockingFiltered<QLinkedList<Number> >(integers.begin(),
  502. integers.end(),
  503. &Number::isEven);
  504. QCOMPARE(linkedList2, QLinkedList<Number>() << 2 << 4);
  505. }
  506. {
  507. QLinkedList<Number> integers;
  508. integers << 1 << 2 << 3 << 4;
  509. QLinkedList<Number> linkedList2 =
  510. QtConcurrent::blockingFiltered<QLinkedList<Number> >(integers.constBegin(),
  511. integers.constEnd(),
  512. &Number::isEven);
  513. QCOMPARE(linkedList2, QLinkedList<Number>() << 2 << 4);
  514. }
  515. }
  516. void tst_QtConcurrentFilter::filteredReduced()
  517. {
  518. QList<int> list;
  519. list << 1 << 2 << 3 << 4;
  520. QList<Number> numberList;
  521. numberList << 1 << 2 << 3 << 4;
  522. // functor-functor
  523. {
  524. int sum = QtConcurrent::filteredReduced<int>(list, KeepEvenIntegers(), IntSumReduce());
  525. QCOMPARE(sum, 6);
  526. int sum2 = QtConcurrent::filteredReduced<int>(list, keepEvenIntegers, intSumReduce);
  527. QCOMPARE(sum2, 6);
  528. }
  529. {
  530. QVector<int> vector;
  531. vector << 1 << 2 << 3 << 4;
  532. int sum = QtConcurrent::filteredReduced<int>(vector, KeepEvenIntegers(), IntSumReduce());
  533. QCOMPARE(sum, 6);
  534. }
  535. {
  536. int sum = QtConcurrent::filteredReduced<int>(list.begin(),
  537. list.end(),
  538. KeepEvenIntegers(),
  539. IntSumReduce());
  540. QCOMPARE(sum, 6);
  541. int sum2 = QtConcurrent::filteredReduced<int>(list.begin(),
  542. list.end(),
  543. keepEvenIntegers,
  544. intSumReduce);
  545. QCOMPARE(sum2, 6);
  546. }
  547. {
  548. int sum = QtConcurrent::filteredReduced<int>(list.constBegin(),
  549. list.constEnd(),
  550. KeepEvenIntegers(),
  551. IntSumReduce());
  552. QCOMPARE(sum, 6);
  553. int sum2 = QtConcurrent::filteredReduced<int>(list.constBegin(),
  554. list.constEnd(),
  555. keepEvenIntegers,
  556. intSumReduce);
  557. QCOMPARE(sum2, 6);
  558. }
  559. {
  560. int sum = QtConcurrent::blockingFilteredReduced<int>(list, KeepEvenIntegers(), IntSumReduce());
  561. QCOMPARE(sum, 6);
  562. int sum2 = QtConcurrent::blockingFilteredReduced<int>(list, keepEvenIntegers, intSumReduce);
  563. QCOMPARE(sum2, 6);
  564. }
  565. {
  566. int sum = QtConcurrent::blockingFilteredReduced<int>(list.begin(),
  567. list.end(),
  568. KeepEvenIntegers(),
  569. IntSumReduce());
  570. QCOMPARE(sum, 6);
  571. int sum2 = QtConcurrent::blockingFilteredReduced<int>(list.begin(),
  572. list.end(),
  573. keepEvenIntegers,
  574. intSumReduce);
  575. QCOMPARE(sum2, 6);
  576. }
  577. {
  578. int sum = QtConcurrent::blockingFilteredReduced<int>(list.constBegin(),
  579. list.constEnd(),
  580. KeepEvenIntegers(),
  581. IntSumReduce());
  582. QCOMPARE(sum, 6);
  583. int sum2 = QtConcurrent::blockingFilteredReduced<int>(list.constBegin(),
  584. list.constEnd(),
  585. keepEvenIntegers,
  586. intSumReduce);
  587. QCOMPARE(sum2, 6);
  588. }
  589. // function-functor
  590. {
  591. int sum = QtConcurrent::filteredReduced<int>(list, keepEvenIntegers, IntSumReduce());
  592. QCOMPARE(sum, 6);
  593. }
  594. {
  595. int sum = QtConcurrent::filteredReduced<int>(list.begin(),
  596. list.end(),
  597. keepEvenIntegers,
  598. IntSumReduce());
  599. QCOMPARE(sum, 6);
  600. }
  601. {
  602. int sum = QtConcurrent::filteredReduced<int>(list.constBegin(),
  603. list.constEnd(),
  604. keepEvenIntegers,
  605. IntSumReduce());
  606. QCOMPARE(sum, 6);
  607. }
  608. {
  609. int sum = QtConcurrent::blockingFilteredReduced<int>(list, keepEvenIntegers, IntSumReduce());
  610. QCOMPARE(sum, 6);
  611. }
  612. {
  613. int sum = QtConcurrent::blockingFilteredReduced<int>(list.begin(),
  614. list.end(),
  615. keepEvenIntegers,
  616. IntSumReduce());
  617. QCOMPARE(sum, 6);
  618. }
  619. {
  620. int sum = QtConcurrent::blockingFilteredReduced<int>(list.constBegin(),
  621. list.constEnd(),
  622. keepEvenIntegers,
  623. IntSumReduce());
  624. QCOMPARE(sum, 6);
  625. }
  626. // functor-function
  627. {
  628. int sum = QtConcurrent::filteredReduced(list, KeepEvenIntegers(), intSumReduce);
  629. QCOMPARE(sum, 6);
  630. }
  631. {
  632. int sum = QtConcurrent::filteredReduced(list.begin(),
  633. list.end(),
  634. KeepEvenIntegers(),
  635. intSumReduce);
  636. QCOMPARE(sum, 6);
  637. }
  638. {
  639. int sum = QtConcurrent::filteredReduced(list.constBegin(),
  640. list.constEnd(),
  641. KeepEvenIntegers(),
  642. intSumReduce);
  643. QCOMPARE(sum, 6);
  644. }
  645. {
  646. int sum = QtConcurrent::blockingFilteredReduced(list, KeepEvenIntegers(), intSumReduce);
  647. QCOMPARE(sum, 6);
  648. }
  649. {
  650. int sum = QtConcurrent::blockingFilteredReduced(list.begin(),
  651. list.end(),
  652. KeepEvenIntegers(),
  653. intSumReduce);
  654. QCOMPARE(sum, 6);
  655. }
  656. {
  657. int sum = QtConcurrent::blockingFilteredReduced(list.constBegin(),
  658. list.constEnd(),
  659. KeepEvenIntegers(),
  660. intSumReduce);
  661. QCOMPARE(sum, 6);
  662. }
  663. // function-function
  664. {
  665. int sum = QtConcurrent::filteredReduced(list, keepEvenIntegers, intSumReduce);
  666. QCOMPARE(sum, 6);
  667. }
  668. {
  669. int sum = QtConcurrent::filteredReduced(list.begin(),
  670. list.end(),
  671. keepEvenIntegers,
  672. intSumReduce);
  673. QCOMPARE(sum, 6);
  674. }
  675. {
  676. int sum = QtConcurrent::filteredReduced(list.constBegin(),
  677. list.constEnd(),
  678. keepEvenIntegers,
  679. intSumReduce);
  680. QCOMPARE(sum, 6);
  681. }
  682. {
  683. int sum = QtConcurrent::blockingFilteredReduced(list, keepEvenIntegers, intSumReduce);
  684. QCOMPARE(sum, 6);
  685. }
  686. {
  687. int sum = QtConcurrent::blockingFilteredReduced(list.begin(),
  688. list.end(),
  689. keepEvenIntegers,
  690. intSumReduce);
  691. QCOMPARE(sum, 6);
  692. }
  693. {
  694. int sum = QtConcurrent::blockingFilteredReduced(list.constBegin(),
  695. list.constEnd(),
  696. keepEvenIntegers,
  697. intSumReduce);
  698. QCOMPARE(sum, 6);
  699. }
  700. // functor-member
  701. {
  702. QList<int> list2 = QtConcurrent::filteredReduced(list, KeepEvenIntegers(), &QList<int>::push_back, QtConcurrent::OrderedReduce);
  703. QCOMPARE(list2, QList<int>() << 2 << 4);
  704. }
  705. {
  706. QList<int> list2 = QtConcurrent::filteredReduced(list.begin(),
  707. list.end(),
  708. KeepEvenIntegers(),
  709. &QList<int>::push_back,
  710. QtConcurrent::OrderedReduce);
  711. QCOMPARE(list2, QList<int>() << 2 << 4);
  712. }
  713. {
  714. QList<int> list2 = QtConcurrent::filteredReduced(list.constBegin(),
  715. list.constEnd(),
  716. KeepEvenIntegers(),
  717. &QList<int>::push_back,
  718. QtConcurrent::OrderedReduce);
  719. QCOMPARE(list2, QList<int>() << 2 << 4);
  720. }
  721. {
  722. QList<int> list2 = QtConcurrent::blockingFilteredReduced(list, KeepEvenIntegers(), &QList<int>::push_back, QtConcurrent::OrderedReduce);
  723. QCOMPARE(list2, QList<int>() << 2 << 4);
  724. }
  725. {
  726. QList<int> list2 = QtConcurrent::blockingFilteredReduced(list.begin(),
  727. list.end(),
  728. KeepEvenIntegers(),
  729. &QList<int>::push_back,
  730. QtConcurrent::OrderedReduce);
  731. QCOMPARE(list2, QList<int>() << 2 << 4);
  732. }
  733. {
  734. QList<int> list2 = QtConcurrent::blockingFilteredReduced(list.constBegin(),
  735. list.constEnd(),
  736. KeepEvenIntegers(),
  737. &QList<int>::push_back,
  738. QtConcurrent::OrderedReduce);
  739. QCOMPARE(list2, QList<int>() << 2 << 4);
  740. }
  741. // member-functor
  742. {
  743. int sum = QtConcurrent::filteredReduced<int>(numberList, &Number::isEven, NumberSumReduce());
  744. QCOMPARE(sum, 6);
  745. int sum2 = QtConcurrent::filteredReduced<int>(QList<Number>(numberList),
  746. &Number::isEven,
  747. NumberSumReduce());
  748. QCOMPARE(sum2, 6);
  749. }
  750. {
  751. int sum = QtConcurrent::filteredReduced<int>(numberList.begin(),
  752. numberList.end(),
  753. &Number::isEven,
  754. NumberSumReduce());
  755. QCOMPARE(sum, 6);
  756. }
  757. {
  758. int sum = QtConcurrent::filteredReduced<int>(numberList.constBegin(),
  759. numberList.constEnd(),
  760. &Number::isEven,
  761. NumberSumReduce());
  762. QCOMPARE(sum, 6);
  763. }
  764. {
  765. int sum = QtConcurrent::blockingFilteredReduced<int>(numberList, &Number::isEven, NumberSumReduce());
  766. QCOMPARE(sum, 6);
  767. int sum2 = QtConcurrent::blockingFilteredReduced<int>(QList<Number>(numberList),
  768. &Number::isEven,
  769. NumberSumReduce());
  770. QCOMPARE(sum2, 6);
  771. }
  772. {
  773. int sum = QtConcurrent::blockingFilteredReduced<int>(numberList.begin(),
  774. numberList.end(),
  775. &Number::isEven,
  776. NumberSumReduce());
  777. QCOMPARE(sum, 6);
  778. }
  779. {
  780. int sum = QtConcurrent::blockingFilteredReduced<int>(numberList.constBegin(),
  781. numberList.constEnd(),
  782. &Number::isEven,
  783. NumberSumReduce());
  784. QCOMPARE(sum, 6);
  785. }
  786. // member-member
  787. {
  788. QList<Number> numbers;
  789. numbers << 1 << 2 << 3 << 4;
  790. QList<Number> list2 = QtConcurrent::filteredReduced(numbers,
  791. &Number::isEven,
  792. &QList<Number>::push_back, QtConcurrent::OrderedReduce);
  793. QCOMPARE(list2, QList<Number>() << 2 << 4);
  794. }
  795. {
  796. QList<Number> numbers;
  797. numbers << 1 << 2 << 3 << 4;
  798. QList<Number> list2 = QtConcurrent::filteredReduced(numbers.begin(),
  799. numbers.end(),
  800. &Number::isEven,
  801. &QList<Number>::push_back,
  802. QtConcurrent::OrderedReduce);
  803. QCOMPARE(list2, QList<Number>() << 2 << 4);
  804. }
  805. {
  806. QList<Number> numbers;
  807. numbers << 1 << 2 << 3 << 4;
  808. QList<Number> list2 = QtConcurrent::filteredReduced(numbers.constBegin(),
  809. numbers.constEnd(),
  810. &Number::isEven,
  811. &QList<Number>::push_back,
  812. QtConcurrent::OrderedReduce);
  813. QCOMPARE(list2, QList<Number>() << 2 << 4);
  814. }
  815. {
  816. QList<Number> numbers;
  817. numbers << 1 << 2 << 3 << 4;
  818. QList<Number> list2 = QtConcurrent::blockingFilteredReduced(numbers,
  819. &Number::isEven,
  820. &QList<Number>::push_back, QtConcurrent::OrderedReduce);
  821. QCOMPARE(list2, QList<Number>() << 2 << 4);
  822. }
  823. {
  824. QList<Number> numbers;
  825. numbers << 1 << 2 << 3 << 4;
  826. QList<Number> list2 = QtConcurrent::blockingFilteredReduced(numbers.begin(),
  827. numbers.end(),
  828. &Number::isEven,
  829. &QList<Number>::push_back,
  830. QtConcurrent::OrderedReduce);
  831. QCOMPARE(list2, QList<Number>() << 2 << 4);
  832. }
  833. {
  834. QList<Number> numbers;
  835. numbers << 1 << 2 << 3 << 4;
  836. QList<Number> list2 = QtConcurrent::blockingFilteredReduced(numbers.constBegin(),
  837. numbers.constEnd(),
  838. &Number::isEven,
  839. &QList<Number>::push_back,
  840. QtConcurrent::OrderedReduce);
  841. QCOMPARE(list2, QList<Number>() << 2 << 4);
  842. }
  843. // function-member
  844. {
  845. QList<int> list2 = QtConcurrent::filteredReduced(list, keepEvenIntegers, &QList<int>::push_back, QtConcurrent::OrderedReduce);
  846. QCOMPARE(list2, QList<int>() << 2 << 4);
  847. }
  848. {
  849. QList<int> list2 = QtConcurrent::filteredReduced(list.begin(),
  850. list.end(),
  851. keepEvenIntegers,
  852. &QList<int>::push_back,
  853. QtConcurrent::OrderedReduce);
  854. QCOMPARE(list2, QList<int>() << 2 << 4);
  855. }
  856. {
  857. QList<int> list2 = QtConcurrent::filteredReduced(list.constBegin(),
  858. list.constEnd(),
  859. keepEvenIntegers,
  860. &QList<int>::push_back,
  861. QtConcurrent::OrderedReduce);
  862. QCOMPARE(list2, QList<int>() << 2 << 4);
  863. }
  864. {
  865. QList<int> list2 = QtConcurrent::blockingFilteredReduced(list, keepEvenIntegers, &QList<int>::push_back, QtConcurrent::OrderedReduce);
  866. QCOMPARE(list2, QList<int>() << 2 << 4);
  867. }
  868. {
  869. QList<int> list2 = QtConcurrent::blockingFilteredReduced(list.begin(),
  870. list.end(),
  871. keepEvenIntegers,
  872. &QList<int>::push_back,
  873. QtConcurrent::OrderedReduce);
  874. QCOMPARE(list2, QList<int>() << 2 << 4);
  875. }
  876. {
  877. QList<int> list2 = QtConcurrent::blockingFilteredReduced(list.constBegin(),
  878. list.constEnd(),
  879. keepEvenIntegers,
  880. &QList<int>::push_back,
  881. QtConcurrent::OrderedReduce);
  882. QCOMPARE(list2, QList<int>() << 2 << 4);
  883. }
  884. // member-function
  885. {
  886. int sum = QtConcurrent::filteredReduced(numberList, &Number::isEven, numberSumReduce);
  887. QCOMPARE(sum, 6);
  888. int sum2 = QtConcurrent::filteredReduced(QList<Number>(numberList),
  889. &Number::isEven,
  890. numberSumReduce);
  891. QCOMPARE(sum2, 6);
  892. }
  893. {
  894. int sum = QtConcurrent::filteredReduced(numberList.begin(),
  895. numberList.end(),
  896. &Number::isEven,
  897. numberSumReduce);
  898. QCOMPARE(sum, 6);
  899. }
  900. {
  901. int sum = QtConcurrent::filteredReduced(numberList.constBegin(),
  902. numberList.constEnd(),
  903. &Number::isEven,
  904. numberSumReduce);
  905. QCOMPARE(sum, 6);
  906. }
  907. {
  908. int sum = QtConcurrent::blockingFilteredReduced(numberList, &Number::isEven, numberSumReduce);
  909. QCOMPARE(sum, 6);
  910. int sum2 = QtConcurrent::blockingFilteredReduced(QList<Number>(numberList),
  911. &Number::isEven,
  912. numberSumReduce);
  913. QCOMPARE(sum2, 6);
  914. }
  915. {
  916. int sum = QtConcurrent::blockingFilteredReduced(numberList.begin(),
  917. numberList.end(),
  918. &Number::isEven,
  919. numberSumReduce);
  920. QCOMPARE(sum, 6);
  921. }
  922. {
  923. int sum = QtConcurrent::blockingFilteredReduced(numberList.constBegin(),
  924. numberList.constEnd(),
  925. &Number::isEven,
  926. numberSumReduce);
  927. QCOMPARE(sum, 6);
  928. }
  929. // same as above on linked lists
  930. QLinkedList<int> linkedList;
  931. linkedList << 1 << 2 << 3 << 4;
  932. QLinkedList<Number> numberLinkedList;
  933. numberLinkedList << 1 << 2 << 3 << 4;
  934. // functor-functor
  935. {
  936. int sum = QtConcurrent::filteredReduced<int>(linkedList, KeepEvenIntegers(), IntSumReduce());
  937. QCOMPARE(sum, 6);
  938. int sum2 = QtConcurrent::filteredReduced<int>(linkedList, keepEvenIntegers, intSumReduce);
  939. QCOMPARE(sum2, 6);
  940. }
  941. {
  942. int sum = QtConcurrent::filteredReduced<int>(linkedList.begin(),
  943. linkedList.end(),
  944. KeepEvenIntegers(),
  945. IntSumReduce());
  946. QCOMPARE(sum, 6);
  947. int sum2 = QtConcurrent::filteredReduced<int>(linkedList.begin(),
  948. linkedList.end(),
  949. keepEvenIntegers,
  950. intSumReduce);
  951. QCOMPARE(sum2, 6);
  952. }
  953. {
  954. int sum = QtConcurrent::filteredReduced<int>(linkedList.constBegin(),
  955. linkedList.constEnd(),
  956. KeepEvenIntegers(),
  957. IntSumReduce());
  958. QCOMPARE(sum, 6);
  959. int sum2 = QtConcurrent::filteredReduced<int>(linkedList.constBegin(),
  960. linkedList.constEnd(),
  961. keepEvenIntegers,
  962. intSumReduce);
  963. QCOMPARE(sum2, 6);
  964. }
  965. {
  966. int sum = QtConcurrent::blockingFilteredReduced<int>(linkedList, KeepEvenIntegers(), IntSumReduce());
  967. QCOMPARE(sum, 6);
  968. int sum2 = QtConcurrent::blockingFilteredReduced<int>(linkedList, keepEvenIntegers, intSumReduce);
  969. QCOMPARE(sum2, 6);
  970. }
  971. {
  972. int sum = QtConcurrent::blockingFilteredReduced<int>(linkedList.begin(),
  973. linkedList.end(),
  974. KeepEvenIntegers(),
  975. IntSumReduce());
  976. QCOMPARE(sum, 6);
  977. int sum2 = QtConcurrent::blockingFilteredReduced<int>(linkedList.begin(),
  978. linkedList.end(),
  979. keepEvenIntegers,
  980. intSumReduce);
  981. QCOMPARE(sum2, 6);
  982. }
  983. {
  984. int sum = QtConcurrent::blockingFilteredReduced<int>(linkedList.constBegin(),
  985. linkedList.constEnd(),
  986. KeepEvenIntegers(),
  987. IntSumReduce());
  988. QCOMPARE(sum, 6);
  989. int sum2 = QtConcurrent::blockingFilteredReduced<int>(linkedList.constBegin(),
  990. linkedList.constEnd(),
  991. keepEvenIntegers,
  992. intSumReduce);
  993. QCOMPARE(sum2, 6);
  994. }
  995. // function-functor
  996. {
  997. int sum = QtConcurrent::filteredReduced<int>(linkedList, keepEvenIntegers, IntSumReduce());
  998. QCOMPARE(sum, 6);
  999. }
  1000. {
  1001. int sum = QtConcurrent::filteredReduced<int>(linkedList.begin(),
  1002. linkedList.end(),
  1003. keepEvenIntegers,
  1004. IntSumReduce());
  1005. QCOMPARE(sum, 6);
  1006. }
  1007. {
  1008. int sum = QtConcurrent::filteredReduced<int>(linkedList.constBegin(),
  1009. linkedList.constEnd(),
  1010. keepEvenIntegers,
  1011. IntSumReduce());
  1012. QCOMPARE(sum, 6);
  1013. }
  1014. {
  1015. int sum = QtConcurrent::blockingFilteredReduced<int>(linkedList, keepEvenIntegers, IntSumReduce());
  1016. QCOMPARE(sum, 6);
  1017. }
  1018. {
  1019. int sum = QtConcurrent::blockingFilteredReduced<int>(linkedList.begin(),
  1020. linkedList.end(),
  1021. keepEvenIntegers,
  1022. IntSumReduce());
  1023. QCOMPARE(sum, 6);
  1024. }
  1025. {
  1026. int sum = QtConcurrent::blockingFilteredReduced<int>(linkedList.constBegin(),
  1027. linkedList.constEnd(),
  1028. keepEvenIntegers,
  1029. IntSumReduce());
  1030. QCOMPARE(sum, 6);
  1031. }
  1032. // functor-function
  1033. {
  1034. int sum = QtConcurrent::filteredReduced(linkedList, KeepEvenIntegers(), intSumReduce);
  1035. QCOMPARE(sum, 6);
  1036. }
  1037. {
  1038. int sum = QtConcurrent::filteredReduced(linkedList.begin(),
  1039. linkedList.end(),
  1040. KeepEvenIntegers(),
  1041. intSumReduce);
  1042. QCOMPARE(sum, 6);
  1043. }
  1044. {
  1045. int sum = QtConcurrent::filteredReduced(linkedList.constBegin(),
  1046. linkedList.constEnd(),
  1047. KeepEvenIntegers(),
  1048. intSumReduce);
  1049. QCOMPARE(sum, 6);
  1050. }
  1051. {
  1052. int sum = QtConcurrent::blockingFilteredReduced(linkedList, KeepEvenIntegers(), intSumReduce);
  1053. QCOMPARE(sum, 6);
  1054. }
  1055. {
  1056. int sum = QtConcurrent::blockingFilteredReduced(linkedList.begin(),
  1057. linkedList.end(),
  1058. KeepEvenIntegers(),
  1059. intSumReduce);
  1060. QCOMPARE(sum, 6);
  1061. }
  1062. {
  1063. int sum = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(),
  1064. linkedList.constEnd(),
  1065. KeepEvenIntegers(),
  1066. intSumReduce);
  1067. QCOMPARE(sum, 6);
  1068. }
  1069. // function-function
  1070. {
  1071. int sum = QtConcurrent::filteredReduced(linkedList, keepEvenIntegers, intSumReduce);
  1072. QCOMPARE(sum, 6);
  1073. }
  1074. {
  1075. int sum = QtConcurrent::filteredReduced(linkedList.begin(),
  1076. linkedList.end(),
  1077. keepEvenIntegers,
  1078. intSumReduce);
  1079. QCOMPARE(sum, 6);
  1080. }
  1081. {
  1082. int sum = QtConcurrent::filteredReduced(linkedList.constBegin(),
  1083. linkedList.constEnd(),
  1084. keepEvenIntegers,
  1085. intSumReduce);
  1086. QCOMPARE(sum, 6);
  1087. }
  1088. {
  1089. int sum = QtConcurrent::blockingFilteredReduced(linkedList, keepEvenIntegers, intSumReduce);
  1090. QCOMPARE(sum, 6);
  1091. }
  1092. {
  1093. int sum = QtConcurrent::blockingFilteredReduced(linkedList.begin(),
  1094. linkedList.end(),
  1095. keepEvenIntegers,
  1096. intSumReduce);
  1097. QCOMPARE(sum, 6);
  1098. }
  1099. {
  1100. int sum = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(),
  1101. linkedList.constEnd(),
  1102. keepEvenIntegers,
  1103. intSumReduce);
  1104. QCOMPARE(sum, 6);
  1105. }
  1106. // functor-member
  1107. {
  1108. QLinkedList<int> linkedList2 = QtConcurrent::filteredReduced(linkedList, KeepEvenIntegers(), &QLinkedList<int>::append, QtConcurrent::OrderedReduce);
  1109. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1110. }
  1111. {
  1112. QLinkedList<int> linkedList2 = QtConcurrent::filteredReduced(linkedList.begin(),
  1113. linkedList.end(),
  1114. KeepEvenIntegers(),
  1115. &QLinkedList<int>::append,
  1116. QtConcurrent::OrderedReduce);
  1117. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1118. }
  1119. {
  1120. QLinkedList<int> linkedList2 = QtConcurrent::filteredReduced(linkedList.constBegin(),
  1121. linkedList.constEnd(),
  1122. KeepEvenIntegers(),
  1123. &QLinkedList<int>::append,
  1124. QtConcurrent::OrderedReduce);
  1125. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1126. }
  1127. {
  1128. QLinkedList<int> linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList, KeepEvenIntegers(), &QLinkedList<int>::append, QtConcurrent::OrderedReduce);
  1129. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1130. }
  1131. {
  1132. QLinkedList<int> linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList.begin(),
  1133. linkedList.end(),
  1134. KeepEvenIntegers(),
  1135. &QLinkedList<int>::append,
  1136. QtConcurrent::OrderedReduce);
  1137. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1138. }
  1139. {
  1140. QLinkedList<int> linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(),
  1141. linkedList.constEnd(),
  1142. KeepEvenIntegers(),
  1143. &QLinkedList<int>::append,
  1144. QtConcurrent::OrderedReduce);
  1145. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1146. }
  1147. // member-functor
  1148. {
  1149. int sum = QtConcurrent::filteredReduced<int>(numberLinkedList, &Number::isEven, NumberSumReduce());
  1150. QCOMPARE(sum, 6);
  1151. int sum2 = QtConcurrent::filteredReduced<int>(QLinkedList<Number>(numberLinkedList),
  1152. &Number::isEven,
  1153. NumberSumReduce());
  1154. QCOMPARE(sum2, 6);
  1155. }
  1156. {
  1157. int sum = QtConcurrent::filteredReduced<int>(numberLinkedList.begin(),
  1158. numberLinkedList.end(),
  1159. &Number::isEven,
  1160. NumberSumReduce());
  1161. QCOMPARE(sum, 6);
  1162. }
  1163. {
  1164. int sum = QtConcurrent::filteredReduced<int>(numberLinkedList.constBegin(),
  1165. numberLinkedList.constEnd(),
  1166. &Number::isEven,
  1167. NumberSumReduce());
  1168. QCOMPARE(sum, 6);
  1169. }
  1170. {
  1171. int sum = QtConcurrent::blockingFilteredReduced<int>(numberLinkedList, &Number::isEven, NumberSumReduce());
  1172. QCOMPARE(sum, 6);
  1173. int sum2 = QtConcurrent::blockingFilteredReduced<int>(QLinkedList<Number>(numberLinkedList),
  1174. &Number::isEven,
  1175. NumberSumReduce());
  1176. QCOMPARE(sum2, 6);
  1177. }
  1178. {
  1179. int sum = QtConcurrent::blockingFilteredReduced<int>(numberLinkedList.begin(),
  1180. numberLinkedList.end(),
  1181. &Number::isEven,
  1182. NumberSumReduce());
  1183. QCOMPARE(sum, 6);
  1184. }
  1185. {
  1186. int sum = QtConcurrent::blockingFilteredReduced<int>(numberLinkedList.constBegin(),
  1187. numberLinkedList.constEnd(),
  1188. &Number::isEven,
  1189. NumberSumReduce());
  1190. QCOMPARE(sum, 6);
  1191. }
  1192. // member-member
  1193. {
  1194. QLinkedList<Number> numbers;
  1195. numbers << 1 << 2 << 3 << 4;
  1196. QLinkedList<Number> linkedList2 = QtConcurrent::filteredReduced(numbers,
  1197. &Number::isEven,
  1198. &QLinkedList<Number>::append, QtConcurrent::OrderedReduce);
  1199. QCOMPARE(linkedList2, QLinkedList<Number>() << 2 << 4);
  1200. }
  1201. {
  1202. QLinkedList<Number> numbers;
  1203. numbers << 1 << 2 << 3 << 4;
  1204. QLinkedList<Number> linkedList2 = QtConcurrent::filteredReduced(numbers.begin(),
  1205. numbers.end(),
  1206. &Number::isEven,
  1207. &QLinkedList<Number>::append,
  1208. QtConcurrent::OrderedReduce);
  1209. QCOMPARE(linkedList2, QLinkedList<Number>() << 2 << 4);
  1210. }
  1211. {
  1212. QLinkedList<Number> numbers;
  1213. numbers << 1 << 2 << 3 << 4;
  1214. QLinkedList<Number> linkedList2 = QtConcurrent::filteredReduced(numbers.constBegin(),
  1215. numbers.constEnd(),
  1216. &Number::isEven,
  1217. &QLinkedList<Number>::append,
  1218. QtConcurrent::OrderedReduce);
  1219. QCOMPARE(linkedList2, QLinkedList<Number>() << 2 << 4);
  1220. }
  1221. {
  1222. QLinkedList<Number> numbers;
  1223. numbers << 1 << 2 << 3 << 4;
  1224. QLinkedList<Number> linkedList2 = QtConcurrent::blockingFilteredReduced(numbers,
  1225. &Number::isEven,
  1226. &QLinkedList<Number>::append, QtConcurrent::OrderedReduce);
  1227. QCOMPARE(linkedList2, QLinkedList<Number>() << 2 << 4);
  1228. }
  1229. {
  1230. QLinkedList<Number> numbers;
  1231. numbers << 1 << 2 << 3 << 4;
  1232. QLinkedList<Number> linkedList2 = QtConcurrent::blockingFilteredReduced(numbers.begin(),
  1233. numbers.end(),
  1234. &Number::isEven,
  1235. &QLinkedList<Number>::append,
  1236. QtConcurrent::OrderedReduce);
  1237. QCOMPARE(linkedList2, QLinkedList<Number>() << 2 << 4);
  1238. }
  1239. {
  1240. QLinkedList<Number> numbers;
  1241. numbers << 1 << 2 << 3 << 4;
  1242. QLinkedList<Number> linkedList2 = QtConcurrent::blockingFilteredReduced(numbers.constBegin(),
  1243. numbers.constEnd(),
  1244. &Number::isEven,
  1245. &QLinkedList<Number>::append,
  1246. QtConcurrent::OrderedReduce);
  1247. QCOMPARE(linkedList2, QLinkedList<Number>() << 2 << 4);
  1248. }
  1249. // function-member
  1250. {
  1251. QLinkedList<int> linkedList2 = QtConcurrent::filteredReduced(linkedList, keepEvenIntegers, &QLinkedList<int>::append, QtConcurrent::OrderedReduce);
  1252. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1253. }
  1254. {
  1255. QLinkedList<int> linkedList2 = QtConcurrent::filteredReduced(linkedList.begin(),
  1256. linkedList.end(),
  1257. keepEvenIntegers,
  1258. &QLinkedList<int>::append,
  1259. QtConcurrent::OrderedReduce);
  1260. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1261. }
  1262. {
  1263. QLinkedList<int> linkedList2 = QtConcurrent::filteredReduced(linkedList.constBegin(),
  1264. linkedList.constEnd(),
  1265. keepEvenIntegers,
  1266. &QLinkedList<int>::append,
  1267. QtConcurrent::OrderedReduce);
  1268. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1269. }
  1270. {
  1271. QLinkedList<int> linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList, keepEvenIntegers, &QLinkedList<int>::append, QtConcurrent::OrderedReduce);
  1272. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1273. }
  1274. {
  1275. QLinkedList<int> linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList.begin(),
  1276. linkedList.end(),
  1277. keepEvenIntegers,
  1278. &QLinkedList<int>::append,
  1279. QtConcurrent::OrderedReduce);
  1280. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1281. }
  1282. {
  1283. QLinkedList<int> linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(),
  1284. linkedList.constEnd(),
  1285. keepEvenIntegers,
  1286. &QLinkedList<int>::append,
  1287. QtConcurrent::OrderedReduce);
  1288. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4);
  1289. }
  1290. // member-function
  1291. {
  1292. int sum = QtConcurrent::filteredReduced(numberLinkedList, &Number::isEven, numberSumReduce);
  1293. QCOMPARE(sum, 6);
  1294. int sum2 = QtConcurrent::filteredReduced(QLinkedList<Number>(numberLinkedList),
  1295. &Number::isEven,
  1296. numberSumReduce);
  1297. QCOMPARE(sum2, 6);
  1298. }
  1299. {
  1300. int sum = QtConcurrent::filteredReduced(numberLinkedList.begin(),
  1301. numberLinkedList.end(),
  1302. &Number::isEven,
  1303. numberSumReduce);
  1304. QCOMPARE(sum, 6);
  1305. }
  1306. {
  1307. int sum = QtConcurrent::filteredReduced(numberLinkedList.constBegin(),
  1308. numberLinkedList.constEnd(),
  1309. &Number::isEven,
  1310. numberSumReduce);
  1311. QCOMPARE(sum, 6);
  1312. }
  1313. {
  1314. int sum = QtConcurrent::blockingFilteredReduced(numberLinkedList, &Number::isEven, numberSumReduce);
  1315. QCOMPARE(sum, 6);
  1316. int sum2 = QtConcurrent::blockingFilteredReduced(QLinkedList<Number>(numberLinkedList),
  1317. &Number::isEven,
  1318. numberSumReduce);
  1319. QCOMPARE(sum2, 6);
  1320. }
  1321. {
  1322. int sum = QtConcurrent::blockingFilteredReduced(numberLinkedList.begin(),
  1323. numberLinkedList.end(),
  1324. &Number::isEven,
  1325. numberSumReduce);
  1326. QCOMPARE(sum, 6);
  1327. }
  1328. {
  1329. int sum = QtConcurrent::blockingFilteredReduced(numberLinkedList.constBegin(),
  1330. numberLinkedList.constEnd(),
  1331. &Number::isEven,
  1332. numberSumReduce);
  1333. QCOMPARE(sum, 6);
  1334. }
  1335. // ### the same as above, with an initial result value
  1336. }
  1337. bool filterfn(int i)
  1338. {
  1339. return (i % 2);
  1340. }
  1341. void tst_QtConcurrentFilter::resultAt()
  1342. {
  1343. QList<int> ints;
  1344. for (int i=0; i < 1000; ++i)
  1345. ints << i;
  1346. QFuture<int> future = QtConcurrent::filtered(ints, filterfn);
  1347. future.waitForFinished();
  1348. for (int i = 0; i < future.resultCount(); ++i) {
  1349. QCOMPARE(future.resultAt(i), ints.at(i * 2 + 1));
  1350. }
  1351. }
  1352. bool waitFilterfn(const int &i)
  1353. {
  1354. QTest::qWait(1);
  1355. return (i % 2);
  1356. }
  1357. void tst_QtConcurrentFilter::incrementalResults()
  1358. {
  1359. const int count = 200;
  1360. QList<int> ints;
  1361. for (int i=0; i < count; ++i)
  1362. ints << i;
  1363. QFuture<int> future = QtConcurrent::filtered(ints, waitFilterfn);
  1364. QList<int> results;
  1365. while (future.isFinished() == false) {
  1366. for (int i = 0; i < future.resultCount(); ++i) {
  1367. results += future.resultAt(i);
  1368. }
  1369. QTest::qWait(1);
  1370. }
  1371. QCOMPARE(future.isFinished(), true);
  1372. QCOMPARE(future.resultCount(), count / 2);
  1373. QCOMPARE(future.results().count(), count / 2);
  1374. }
  1375. void tst_QtConcurrentFilter::noDetatch()
  1376. {
  1377. {
  1378. QList<int> l = QList<int>() << 1;
  1379. QVERIFY(l.isDetached());
  1380. QList<int> ll = l;
  1381. QVERIFY(l.isDetached() == false);
  1382. QtConcurrent::filtered(l, waitFilterfn).waitForFinished();
  1383. QVERIFY(l.isDetached() == false);
  1384. QVERIFY(ll.isDetached() == false);
  1385. QtConcurrent::blockingFiltered(l, waitFilterfn);
  1386. QVERIFY(l.isDetached() == false);
  1387. QVERIFY(ll.isDetached() == false);
  1388. QtConcurrent::filteredReduced(l, waitFilterfn, intSumReduce).waitForFinished();
  1389. QVERIFY(l.isDetached() == false);
  1390. QVERIFY(ll.isDetached() == false);
  1391. QtConcurrent::filter(l, waitFilterfn).waitForFinished();
  1392. QVERIFY(l.isDetached() == true);
  1393. QVERIFY(ll.isDetached() == true);
  1394. }
  1395. {
  1396. const QList<int> l = QList<int>() << 1;
  1397. QVERIFY(l.isDetached());
  1398. const QList<int> ll = l;
  1399. QVERIFY(l.isDetached() == false);
  1400. QtConcurrent::filtered(l, waitFilterfn).waitForFinished();
  1401. QVERIFY(l.isDetached() == false);
  1402. QVERIFY(ll.isDetached() == false);
  1403. QtConcurrent::filteredReduced(l, waitFilterfn, intSumReduce).waitForFinished();
  1404. QVERIFY(l.isDetached() == false);
  1405. QVERIFY(ll.isDetached() == false);
  1406. }
  1407. }
  1408. void tst_QtConcurrentFilter::stlContainers()
  1409. {
  1410. #ifdef QT_NO_STL
  1411. QSKIP("Qt compiled without STL support", SkipAll);
  1412. #else
  1413. std::vector<int> vector;
  1414. vector.push_back(1);
  1415. vector.push_back(2);
  1416. std::vector<int> vector2 = QtConcurrent::blockingFiltered(vector, waitFilterfn);
  1417. QCOMPARE(vector2.size(), (std::vector<int>::size_type)(1));
  1418. QCOMPARE(vector2[0], 1);
  1419. std::list<int> list;
  1420. list.push_back(1);
  1421. list.push_back(2);
  1422. std::list<int> list2 = QtConcurrent::blockingFiltered(list, waitFilterfn);
  1423. QCOMPARE(list2.size(), (std::list<int>::size_type)(1));
  1424. QCOMPARE(*list2.begin(), 1);
  1425. QtConcurrent::filtered(list, waitFilterfn).waitForFinished();
  1426. QtConcurrent::filtered(vector, waitFilterfn).waitForFinished();
  1427. QtConcurrent::filtered(vector.begin(), vector.end(), waitFilterfn).waitForFinished();
  1428. QtConcurrent::blockingFilter(list, waitFilterfn);
  1429. QCOMPARE(list2.size(), (std::list<int>::size_type)(1));
  1430. QCOMPARE(*list2.begin(), 1);
  1431. #endif
  1432. }
  1433. QTEST_MAIN(tst_QtConcurrentFilter)
  1434. #else
  1435. void tst_QtConcurrentFilter::filter() {}
  1436. void tst_QtConcurrentFilter::filtered() {}
  1437. void tst_QtConcurrentFilter::filteredReduced() {}
  1438. void tst_QtConcurrentFilter::resultAt() {}
  1439. void tst_QtConcurrentFilter::incrementalResults() {}
  1440. void tst_QtConcurrentFilter::stlContainers() {}
  1441. void tst_QtConcurrentFilter::noDetatch() {}
  1442. QTEST_NOOP_MAIN
  1443. #endif
  1444. #include "tst_qtconcurrentfilter.moc"