/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp

https://bitbucket.org/ultra_iter/qt-vtl · C++ · 2445 lines · 1935 code · 370 blank · 140 comment · 29 complexity · e9a655d6e5d260378eae82bdec3fabe1 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 <qtconcurrentmap.h>
  42. #include <qtconcurrentexception.h>
  43. #include <qdebug.h>
  44. #include <QThread>
  45. #include <QtTest/QtTest>
  46. #include "functions.h"
  47. #include "../qfuture/versioncheck.h"
  48. Q_DECLARE_METATYPE(QVector<int>);
  49. Q_DECLARE_METATYPE(QVector<double>);
  50. Q_DECLARE_METATYPE(QVector<QString>);
  51. Q_DECLARE_METATYPE(QList<int>);
  52. Q_DECLARE_METATYPE(QList<double>);
  53. Q_DECLARE_METATYPE(QList<QString>);
  54. class tst_QtConcurrentMap: public QObject
  55. {
  56. Q_OBJECT
  57. private slots:
  58. void map();
  59. void blocking_map();
  60. void mapped();
  61. void blocking_mapped();
  62. void mappedReduced();
  63. void blocking_mappedReduced();
  64. void assignResult();
  65. void functionOverloads();
  66. #ifndef QT_NO_EXCEPTIONS
  67. void exceptions();
  68. #endif
  69. void incrementalResults();
  70. void noDetatch();
  71. void stlContainers();
  72. void qFutureAssignmentLeak();
  73. void stressTest();
  74. public slots:
  75. void throttling();
  76. };
  77. #if !defined (QT_NO_CONCURRENT_TEST) && !defined(QT_NO_CONCURRENT_MAP)
  78. using namespace QtConcurrent;
  79. void multiplyBy2Immutable(int x)
  80. {
  81. x *= 2;
  82. }
  83. class MultiplyBy2Immutable
  84. {
  85. public:
  86. void operator()(int x)
  87. {
  88. x *= 2;
  89. }
  90. };
  91. void multiplyBy2InPlace(int &x)
  92. {
  93. x *= 2;
  94. }
  95. class MultiplyBy2InPlace
  96. {
  97. public:
  98. void operator()(int &x)
  99. {
  100. x *= 2;
  101. }
  102. };
  103. Q_DECLARE_METATYPE(QList<Number>);
  104. void tst_QtConcurrentMap::map()
  105. {
  106. // functors take arguments by reference, modifying the sequence in place
  107. {
  108. QList<int> list;
  109. list << 1 << 2 << 3;
  110. // functor
  111. QtConcurrent::map(list, MultiplyBy2InPlace()).waitForFinished();
  112. QCOMPARE(list, QList<int>() << 2 << 4 << 6);
  113. QtConcurrent::map(list.begin(), list.end(), MultiplyBy2InPlace()).waitForFinished();
  114. QCOMPARE(list, QList<int>() << 4 << 8 << 12);
  115. // function
  116. QtConcurrent::map(list, multiplyBy2InPlace).waitForFinished();
  117. QCOMPARE(list, QList<int>() << 8 << 16 << 24);
  118. QtConcurrent::map(list.begin(), list.end(), multiplyBy2InPlace).waitForFinished();
  119. QCOMPARE(list, QList<int>() << 16 << 32 << 48);
  120. // bound function
  121. QtConcurrent::map(list, multiplyBy2InPlace).waitForFinished();
  122. QCOMPARE(list, QList<int>() << 32 << 64 << 96);
  123. QtConcurrent::map(list.begin(), list.end(), multiplyBy2InPlace).waitForFinished();
  124. QCOMPARE(list, QList<int>() << 64 << 128 << 192);
  125. // member function
  126. QList<Number> numberList;
  127. numberList << 1 << 2 << 3;
  128. QtConcurrent::map(numberList, &Number::multiplyBy2).waitForFinished();
  129. QCOMPARE(numberList, QList<Number>() << 2 << 4 << 6);
  130. QtConcurrent::map(numberList.begin(), numberList.end(), &Number::multiplyBy2).waitForFinished();
  131. QCOMPARE(numberList, QList<Number>() << 4 << 8 << 12);
  132. #ifdef Q_COMPILER_LAMBDA
  133. // lambda
  134. QtConcurrent::map(list, [](int &x){x *= 2;}).waitForFinished();
  135. QCOMPARE(list, QList<int>() << 128 << 256 << 384);
  136. QtConcurrent::map(list.begin(), list.end(), [](int &x){x *= 2;}).waitForFinished();
  137. QCOMPARE(list, QList<int>() << 256 << 512 << 768);
  138. #endif
  139. }
  140. // functors don't take arguments by reference, making these no-ops
  141. {
  142. QList<int> list;
  143. list << 1 << 2 << 3;
  144. // functor
  145. QtConcurrent::map(list, MultiplyBy2Immutable()).waitForFinished();
  146. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  147. QtConcurrent::map(list.begin(), list.end(), MultiplyBy2Immutable()).waitForFinished();
  148. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  149. // function
  150. QtConcurrent::map(list, multiplyBy2Immutable).waitForFinished();
  151. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  152. QtConcurrent::map(list.begin(), list.end(), multiplyBy2Immutable).waitForFinished();
  153. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  154. // bound function
  155. QtConcurrent::map(list, multiplyBy2Immutable).waitForFinished();
  156. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  157. QtConcurrent::map(list.begin(), list.end(), multiplyBy2Immutable).waitForFinished();
  158. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  159. #ifdef Q_COMPILER_LAMBDA
  160. // lambda
  161. QtConcurrent::map(list, [](int x){x *= 2;}).waitForFinished();
  162. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  163. QtConcurrent::map(list.begin(), list.end(), [](int x){x *= 2;}).waitForFinished();
  164. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  165. #endif
  166. }
  167. // Linked lists and forward iterators
  168. {
  169. QLinkedList<int> list;
  170. list << 1 << 2 << 3;
  171. // functor
  172. QtConcurrent::map(list, MultiplyBy2InPlace()).waitForFinished();
  173. QCOMPARE(list, QLinkedList<int>() << 2 << 4 << 6);
  174. QtConcurrent::map(list.begin(), list.end(), MultiplyBy2InPlace()).waitForFinished();
  175. QCOMPARE(list, QLinkedList<int>() << 4 << 8 << 12);
  176. // function
  177. QtConcurrent::map(list, multiplyBy2InPlace).waitForFinished();
  178. QCOMPARE(list, QLinkedList<int>() << 8 << 16 << 24);
  179. QtConcurrent::map(list.begin(), list.end(), multiplyBy2InPlace).waitForFinished();
  180. QCOMPARE(list, QLinkedList<int>() << 16 << 32 << 48);
  181. // bound function
  182. QtConcurrent::map(list, multiplyBy2InPlace).waitForFinished();
  183. QCOMPARE(list, QLinkedList<int>() << 32 << 64 << 96);
  184. QtConcurrent::map(list.begin(), list.end(), multiplyBy2InPlace).waitForFinished();
  185. QCOMPARE(list, QLinkedList<int>() << 64 << 128 << 192);
  186. // member function
  187. QLinkedList<Number> numberList;
  188. numberList << 1 << 2 << 3;
  189. QtConcurrent::map(numberList, &Number::multiplyBy2).waitForFinished();
  190. QCOMPARE(numberList, QLinkedList<Number>() << 2 << 4 << 6);
  191. QtConcurrent::map(numberList.begin(), numberList.end(), &Number::multiplyBy2).waitForFinished();
  192. QCOMPARE(numberList, QLinkedList<Number>() << 4 << 8 << 12);
  193. }
  194. #if 0
  195. // not allowed: map() with immutable sequences makes no sense
  196. {
  197. const QList<int> list = QList<int>() << 1 << 2 << 3;
  198. QtConcurrent::map(list, MultiplyBy2Immutable());
  199. QtConcurrent::map(list, multiplyBy2Immutable);
  200. QtConcurrent::map(list, multiplyBy2Immutable);
  201. }
  202. #endif
  203. #if 0
  204. // not allowed: in place modification of a temp copy (since temp copy goes out of scope)
  205. {
  206. QList<int> list;
  207. list << 1 << 2 << 3;
  208. QtConcurrent::map(QList<int>(list), MultiplyBy2InPlace());
  209. QtConcurrent::map(QList<int>(list), multiplyBy2);
  210. QtConcurrent::map(QList<int>(list), multiplyBy2InPlace);
  211. QList<Number> numberList;
  212. numberList << 1 << 2 << 3;
  213. QtConcurrent::map(QList<Number>(numberList), &Number::multiplyBy2);
  214. }
  215. #endif
  216. #if 0
  217. // not allowed: map() on a const list, where functors try to modify the items in the list
  218. {
  219. const QList<int> list = QList<int>() << 1 << 2 << 3;;
  220. QtConcurrent::map(list, MultiplyBy2InPlace());
  221. QtConcurrent::map(list, multiplyBy2InPlace);
  222. QtConcurrent::map(list, multiplyBy2InPlace);
  223. const QList<Number> numberList = QList<Number>() << 1 << 2 << 3;
  224. QtConcurrent::map(numberList, &Number::multiplyBy2);
  225. }
  226. #endif
  227. }
  228. void tst_QtConcurrentMap::blocking_map()
  229. {
  230. // functors take arguments by reference, modifying the sequence in place
  231. {
  232. QList<int> list;
  233. list << 1 << 2 << 3;
  234. // functor
  235. QtConcurrent::blockingMap(list, MultiplyBy2InPlace());
  236. QCOMPARE(list, QList<int>() << 2 << 4 << 6);
  237. QtConcurrent::blockingMap(list.begin(), list.end(), MultiplyBy2InPlace());
  238. QCOMPARE(list, QList<int>() << 4 << 8 << 12);
  239. // function
  240. QtConcurrent::blockingMap(list, multiplyBy2InPlace);
  241. QCOMPARE(list, QList<int>() << 8 << 16 << 24);
  242. QtConcurrent::blockingMap(list.begin(), list.end(), multiplyBy2InPlace);
  243. QCOMPARE(list, QList<int>() << 16 << 32 << 48);
  244. // bound function
  245. QtConcurrent::blockingMap(list, multiplyBy2InPlace);
  246. QCOMPARE(list, QList<int>() << 32 << 64 << 96);
  247. QtConcurrent::blockingMap(list.begin(), list.end(), multiplyBy2InPlace);
  248. QCOMPARE(list, QList<int>() << 64 << 128 << 192);
  249. // member function
  250. QList<Number> numberList;
  251. numberList << 1 << 2 << 3;
  252. QtConcurrent::blockingMap(numberList, &Number::multiplyBy2);
  253. QCOMPARE(numberList, QList<Number>() << 2 << 4 << 6);
  254. QtConcurrent::blockingMap(numberList.begin(), numberList.end(), &Number::multiplyBy2);
  255. QCOMPARE(numberList, QList<Number>() << 4 << 8 << 12);
  256. }
  257. // functors don't take arguments by reference, making these no-ops
  258. {
  259. QList<int> list;
  260. list << 1 << 2 << 3;
  261. // functor
  262. QtConcurrent::blockingMap(list, MultiplyBy2Immutable());
  263. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  264. QtConcurrent::blockingMap(list.begin(), list.end(), MultiplyBy2Immutable());
  265. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  266. // function
  267. QtConcurrent::blockingMap(list, multiplyBy2Immutable);
  268. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  269. QtConcurrent::blockingMap(list.begin(), list.end(), multiplyBy2Immutable);
  270. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  271. // bound function
  272. QtConcurrent::blockingMap(list, multiplyBy2Immutable);
  273. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  274. QtConcurrent::blockingMap(list.begin(), list.end(), multiplyBy2Immutable);
  275. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  276. }
  277. // Linked lists and forward iterators
  278. {
  279. QLinkedList<int> list;
  280. list << 1 << 2 << 3;
  281. // functor
  282. QtConcurrent::blockingMap(list, MultiplyBy2InPlace());
  283. QCOMPARE(list, QLinkedList<int>() << 2 << 4 << 6);
  284. QtConcurrent::blockingMap(list.begin(), list.end(), MultiplyBy2InPlace());
  285. QCOMPARE(list, QLinkedList<int>() << 4 << 8 << 12);
  286. // function
  287. QtConcurrent::blockingMap(list, multiplyBy2InPlace);
  288. QCOMPARE(list, QLinkedList<int>() << 8 << 16 << 24);
  289. QtConcurrent::blockingMap(list.begin(), list.end(), multiplyBy2InPlace);
  290. QCOMPARE(list, QLinkedList<int>() << 16 << 32 << 48);
  291. // bound function
  292. QtConcurrent::blockingMap(list, multiplyBy2InPlace);
  293. QCOMPARE(list, QLinkedList<int>() << 32 << 64 << 96);
  294. QtConcurrent::blockingMap(list.begin(), list.end(), multiplyBy2InPlace);
  295. QCOMPARE(list, QLinkedList<int>() << 64 << 128 << 192);
  296. // member function
  297. QLinkedList<Number> numberList;
  298. numberList << 1 << 2 << 3;
  299. QtConcurrent::blockingMap(numberList, &Number::multiplyBy2);
  300. QCOMPARE(numberList, QLinkedList<Number>() << 2 << 4 << 6);
  301. QtConcurrent::blockingMap(numberList.begin(), numberList.end(), &Number::multiplyBy2);
  302. QCOMPARE(numberList, QLinkedList<Number>() << 4 << 8 << 12);
  303. }
  304. #if 0
  305. // not allowed: map() with immutable sequences makes no sense
  306. {
  307. const QList<int> list = QList<int>() << 1 << 2 << 3;
  308. QtConcurrent::blockingMap(list, MultiplyBy2Immutable());
  309. QtConcurrent::blockkng::map(list, multiplyBy2Immutable);
  310. QtConcurrent::blockingMap(list, multiplyBy2Immutable);
  311. }
  312. #endif
  313. #if 0
  314. // not allowed: in place modification of a temp copy (since temp copy goes out of scope)
  315. {
  316. QList<int> list;
  317. list << 1 << 2 << 3;
  318. QtConcurrent::blockingMap(QList<int>(list), MultiplyBy2InPlace());
  319. QtConcurrent::blockingMap(QList<int>(list), multiplyBy2);
  320. QtConcurrent::blockingMap(QList<int>(list), multiplyBy2InPlace);
  321. QList<Number> numberList;
  322. numberList << 1 << 2 << 3;
  323. QtConcurrent::blockingMap(QList<Number>(numberList), &Number::multiplyBy2);
  324. }
  325. #endif
  326. #if 0
  327. // not allowed: map() on a const list, where functors try to modify the items in the list
  328. {
  329. const QList<int> list = QList<int>() << 1 << 2 << 3;;
  330. QtConcurrent::blockingMap(list, MultiplyBy2InPlace());
  331. QtConcurrent::blockingMap(list, multiplyBy2InPlace);
  332. QtConcurrent::blockingMap(list, multiplyBy2InPlace);
  333. const QList<Number> numberList = QList<Number>() << 1 << 2 << 3;
  334. QtConcurrent::blockingMap(numberList, &Number::multiplyBy2);
  335. }
  336. #endif
  337. }
  338. int multiplyBy2(int x)
  339. {
  340. int y = x * 2;
  341. return y;
  342. }
  343. class MultiplyBy2
  344. {
  345. public:
  346. typedef int result_type;
  347. int operator()(int x) const
  348. {
  349. int y = x * 2;
  350. return y;
  351. }
  352. };
  353. double intToDouble(int x)
  354. {
  355. return double(x);
  356. }
  357. class IntToDouble
  358. {
  359. public:
  360. typedef double result_type;
  361. double operator()(int x) const
  362. {
  363. return double(x);
  364. }
  365. };
  366. int stringToInt(const QString &string)
  367. {
  368. return string.toInt();
  369. }
  370. class StringToInt
  371. {
  372. public:
  373. typedef int result_type;
  374. int operator()(const QString &string) const
  375. {
  376. return string.toInt();
  377. }
  378. };
  379. void tst_QtConcurrentMap::mapped()
  380. {
  381. QList<int> list;
  382. list << 1 << 2 << 3;
  383. QLinkedList<int> linkedList;
  384. linkedList << 1 << 2 << 3;
  385. QList<Number> numberList;
  386. numberList << 1 << 2 << 3;
  387. QLinkedList<Number> numberLinkedList;
  388. numberLinkedList << 1 << 2 << 3;
  389. // functor
  390. {
  391. QList<int> list2 = QtConcurrent::mapped(list, MultiplyBy2()).results();
  392. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  393. QCOMPARE(list2, QList<int>() << 2 << 4 << 6);
  394. QList<int> list3 = QtConcurrent::mapped(list.constBegin(),
  395. list.constEnd(),
  396. MultiplyBy2()).results();
  397. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  398. QCOMPARE(list3, QList<int>() << 2 << 4 << 6);
  399. QList<int> list4 = QtConcurrent::mapped(QList<int>(list), MultiplyBy2()).results();
  400. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  401. QCOMPARE(list4, QList<int>() << 2 << 4 << 6);
  402. }
  403. {
  404. QList<int> list2 = QtConcurrent::mapped(linkedList, MultiplyBy2()).results();
  405. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  406. QCOMPARE(list2, QList<int>() << 2 << 4 << 6);
  407. QList<int> list3 = QtConcurrent::mapped(linkedList.constBegin(),
  408. linkedList.constEnd(),
  409. MultiplyBy2()).results();
  410. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  411. QCOMPARE(list3, QList<int>() << 2 << 4 << 6);
  412. QList<int> list4 =
  413. QtConcurrent::mapped(QLinkedList<int>(linkedList), MultiplyBy2()).results();
  414. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  415. QCOMPARE(list4, QList<int>() << 2 << 4 << 6);
  416. }
  417. // function
  418. {
  419. QList<int> list2 = QtConcurrent::mapped(list, multiplyBy2).results();
  420. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  421. QCOMPARE(list2, QList<int>() << 2 << 4 << 6);
  422. QList<int> list3 = QtConcurrent::mapped(list.constBegin(),
  423. list.constEnd(),
  424. multiplyBy2).results();
  425. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  426. QCOMPARE(list3, QList<int>() << 2 << 4 << 6);
  427. QList<int> list4 = QtConcurrent::mapped(QList<int>(list), multiplyBy2).results();
  428. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  429. QCOMPARE(list4, QList<int>() << 2 << 4 << 6);
  430. }
  431. {
  432. QList<int> list2 = QtConcurrent::mapped(linkedList, multiplyBy2).results();
  433. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  434. QCOMPARE(list2, QList<int>() << 2 << 4 << 6);
  435. QList<int> list3 = QtConcurrent::mapped(linkedList.constBegin(),
  436. linkedList.constEnd(),
  437. multiplyBy2).results();
  438. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  439. QCOMPARE(list3, QList<int>() << 2 << 4 << 6);
  440. QList<int> list4 =
  441. QtConcurrent::mapped(QLinkedList<int>(linkedList), multiplyBy2).results();
  442. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  443. QCOMPARE(list4, QList<int>() << 2 << 4 << 6);
  444. }
  445. // bound function
  446. {
  447. QList<int> list2 = QtConcurrent::mapped(list, multiplyBy2).results();
  448. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  449. QCOMPARE(list2, QList<int>() << 2 << 4 << 6);
  450. QList<int> list3 = QtConcurrent::mapped(list.constBegin(),
  451. list.constEnd(),
  452. multiplyBy2).results();
  453. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  454. QCOMPARE(list3, QList<int>() << 2 << 4 << 6);
  455. QList<int> list4 = QtConcurrent::mapped(QList<int>(list), multiplyBy2).results();
  456. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  457. QCOMPARE(list4, QList<int>() << 2 << 4 << 6);
  458. }
  459. {
  460. QList<int> list2 = QtConcurrent::mapped(linkedList, multiplyBy2).results();
  461. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  462. QCOMPARE(list2, QList<int>() << 2 << 4 << 6);
  463. QList<int> list3 = QtConcurrent::mapped(linkedList.constBegin(),
  464. linkedList.constEnd(),
  465. multiplyBy2)
  466. .results();
  467. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  468. QCOMPARE(list3, QList<int>() << 2 << 4 << 6);
  469. QList<int> list4 = QtConcurrent::mapped(QLinkedList<int>(linkedList), multiplyBy2)
  470. .results();
  471. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  472. QCOMPARE(list4, QList<int>() << 2 << 4 << 6);
  473. }
  474. // const member function
  475. {
  476. QList<Number> numberList2 = QtConcurrent::mapped(numberList, &Number::multipliedBy2)
  477. .results();
  478. QCOMPARE(numberList, QList<Number>() << 1 << 2 << 3);
  479. QCOMPARE(numberList2, QList<Number>() << 2 << 4 << 6);
  480. QList<Number> numberList3 = QtConcurrent::mapped(numberList.constBegin(),
  481. numberList.constEnd(),
  482. &Number::multipliedBy2)
  483. .results();
  484. QCOMPARE(numberList, QList<Number>() << 1 << 2 << 3);
  485. QCOMPARE(numberList3, QList<Number>() << 2 << 4 << 6);
  486. QList<Number> numberList4 = QtConcurrent::mapped(QList<Number>(numberList),
  487. &Number::multipliedBy2)
  488. .results();
  489. QCOMPARE(numberList, QList<Number>() << 1 << 2 << 3);
  490. QCOMPARE(numberList4, QList<Number>() << 2 << 4 << 6);
  491. }
  492. {
  493. QList<Number> numberList2 = QtConcurrent::mapped(numberLinkedList, &Number::multipliedBy2)
  494. .results();
  495. QCOMPARE(numberLinkedList, QLinkedList<Number>() << 1 << 2 << 3);
  496. QCOMPARE(numberList2, QList<Number>() << 2 << 4 << 6);
  497. QList<Number> numberList3 = QtConcurrent::mapped(numberLinkedList.constBegin(),
  498. numberLinkedList.constEnd(),
  499. &Number::multipliedBy2)
  500. .results();
  501. QCOMPARE(numberLinkedList, QLinkedList<Number>() << 1 << 2 << 3);
  502. QCOMPARE(numberList3, QList<Number>() << 2 << 4 << 6);
  503. QList<Number> numberList4 = QtConcurrent::mapped(QLinkedList<Number>(numberLinkedList),
  504. &Number::multipliedBy2)
  505. .results();
  506. QCOMPARE(numberLinkedList, QLinkedList<Number>() << 1 << 2 << 3);
  507. QCOMPARE(numberList4, QList<Number>() << 2 << 4 << 6);
  508. }
  509. // change the value_type, same container
  510. // functor
  511. {
  512. QList<double> list2 = QtConcurrent::mapped(list, IntToDouble()).results();
  513. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  514. QCOMPARE(list2, QList<double>() << 1.0 << 2.0 << 3.0);
  515. QList<double> list3 = QtConcurrent::mapped(list.constBegin(),
  516. list.constEnd(),
  517. IntToDouble())
  518. .results();
  519. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  520. QCOMPARE(list3, QList<double>() << 1.0 << 2.0 << 3.0);
  521. QList<double> list4 = QtConcurrent::mapped(QList<int>(list),
  522. IntToDouble())
  523. .results();
  524. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  525. QCOMPARE(list4, QList<double>() << 1.0 << 2.0 << 3.0);
  526. }
  527. {
  528. QList<double> list2 = QtConcurrent::mapped(linkedList, IntToDouble()).results();
  529. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  530. QCOMPARE(list2, QList<double>() << 1.0 << 2.0 << 3.0);
  531. QList<double> list3 = QtConcurrent::mapped(linkedList.constBegin(),
  532. linkedList.constEnd(),
  533. IntToDouble())
  534. .results();
  535. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  536. QCOMPARE(list3, QList<double>() << 1.0 << 2.0 << 3.0);
  537. QList<double> list4 = QtConcurrent::mapped(QLinkedList<int>(linkedList),
  538. IntToDouble())
  539. .results();
  540. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  541. QCOMPARE(list4, QList<double>() << 1.0 << 2.0 << 3.0);
  542. }
  543. // function
  544. {
  545. QList<double> list2 = QtConcurrent::mapped(list, intToDouble).results();
  546. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  547. QCOMPARE(list2, QList<double>() << 1.0 << 2.0 << 3.0);
  548. QList<double> list3 = QtConcurrent::mapped(list.constBegin(),
  549. list.constEnd(),
  550. intToDouble)
  551. .results();
  552. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  553. QCOMPARE(list3, QList<double>() << 1.0 << 2.0 << 3.0);
  554. QList<double> list4 = QtConcurrent::mapped(QList<int>(list), intToDouble).results();
  555. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  556. QCOMPARE(list4, QList<double>() << 1.0 << 2.0 << 3.0);
  557. }
  558. {
  559. QList<double> list2 = QtConcurrent::mapped(linkedList, intToDouble).results();
  560. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  561. QCOMPARE(list2, QList<double>() << 1.0 << 2.0 << 3.0);
  562. QList<double> list3 = QtConcurrent::mapped(linkedList.constBegin(),
  563. linkedList.constEnd(),
  564. intToDouble)
  565. .results();
  566. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  567. QCOMPARE(list3, QList<double>() << 1.0 << 2.0 << 3.0);
  568. QList<double> list4 = QtConcurrent::mapped(QLinkedList<int>(linkedList), intToDouble)
  569. .results();
  570. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  571. QCOMPARE(list4, QList<double>() << 1.0 << 2.0 << 3.0);
  572. }
  573. // bound function
  574. {
  575. QList<double> list2 = QtConcurrent::mapped(list, intToDouble).results();
  576. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  577. QCOMPARE(list2, QList<double>() << 1.0 << 2.0 << 3.0);
  578. QList<double> list3 = QtConcurrent::mapped(list.constBegin(),
  579. list.constEnd(),
  580. intToDouble)
  581. .results();
  582. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  583. QCOMPARE(list3, QList<double>() << 1.0 << 2.0 << 3.0);
  584. QList<double> list4 = QtConcurrent::mapped(QList<int>(list),
  585. intToDouble)
  586. .results();
  587. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  588. QCOMPARE(list4, QList<double>() << 1.0 << 2.0 << 3.0);
  589. }
  590. {
  591. QList<double> list2 = QtConcurrent::mapped(linkedList, intToDouble).results();
  592. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  593. QCOMPARE(list2, QList<double>() << 1.0 << 2.0 << 3.0);
  594. QList<double> list3 = QtConcurrent::mapped(linkedList.constBegin(),
  595. linkedList.constEnd(),
  596. intToDouble)
  597. .results();
  598. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  599. QCOMPARE(list3, QList<double>() << 1.0 << 2.0 << 3.0);
  600. QList<double> list4 = QtConcurrent::mapped(QLinkedList<int>(linkedList),
  601. intToDouble)
  602. .results();
  603. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  604. QCOMPARE(list4, QList<double>() << 1.0 << 2.0 << 3.0);
  605. }
  606. // const member function
  607. {
  608. QList<QString> list2 = QtConcurrent::mapped(numberList, &Number::toString).results();
  609. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  610. QCOMPARE(list2, QList<QString>() << "1" << "2" << "3");
  611. QList<QString> list3 = QtConcurrent::mapped(numberList.constBegin(),
  612. numberList.constEnd(),
  613. &Number::toString)
  614. .results();
  615. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  616. QCOMPARE(list3, QList<QString>() << "1" << "2" << "3");
  617. QList<QString> list4 = QtConcurrent::mapped(QList<Number>(numberList), &Number::toString)
  618. .results();
  619. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  620. QCOMPARE(list4, QList<QString>() << "1" << "2" << "3");
  621. }
  622. {
  623. QList<QString> list2 = QtConcurrent::mapped(numberLinkedList, &Number::toString).results();
  624. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  625. QCOMPARE(list2, QList<QString>() << "1" << "2" << "3");
  626. QList<QString> list3 = QtConcurrent::mapped(numberLinkedList.constBegin(),
  627. numberLinkedList.constEnd(),
  628. &Number::toString)
  629. .results();
  630. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  631. QCOMPARE(list3, QList<QString>() << "1" << "2" << "3");
  632. QList<QString> list4 = QtConcurrent::mapped(QLinkedList<Number>(numberLinkedList),
  633. &Number::toString)
  634. .results();
  635. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  636. QCOMPARE(list4, QList<QString>() << "1" << "2" << "3");
  637. }
  638. // change the value_type
  639. {
  640. QList<QString> strings = QStringList() << "1" << "2" << "3";
  641. QList<int> list = QtConcurrent::mapped(strings, StringToInt()).results();
  642. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  643. QList<int> list2 = QtConcurrent::mapped(strings.constBegin(),
  644. strings.constEnd(),
  645. StringToInt())
  646. .results();
  647. QCOMPARE(list2, QList<int>() << 1 << 2 << 3);
  648. }
  649. {
  650. QList<QString> strings = QStringList() << "1" << "2" << "3";
  651. QList<int> list = QtConcurrent::mapped(strings, stringToInt).results();
  652. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  653. QList<int> list2 = QtConcurrent::mapped(strings.constBegin(),
  654. strings.constEnd(),
  655. stringToInt).results();
  656. QCOMPARE(list2, QList<int>() << 1 << 2 << 3);
  657. }
  658. {
  659. QList<int> numberList2 = QtConcurrent::mapped(numberList, &Number::toInt).results();
  660. QCOMPARE(numberList2, QList<int>() << 1 << 2 << 3);
  661. QList<int> numberList3 = QtConcurrent::mapped(numberList.constBegin(),
  662. numberList.constEnd(),
  663. &Number::toInt)
  664. .results();
  665. QCOMPARE(numberList3, QList<int>() << 1 << 2 << 3);
  666. }
  667. // change the value_type from QStringList
  668. {
  669. QStringList strings = QStringList() << "1" << "2" << "3";
  670. QList<int> list = QtConcurrent::mapped(strings, StringToInt()).results();
  671. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  672. QList<int> list2 = QtConcurrent::mapped(strings.constBegin(),
  673. strings.constEnd(),
  674. StringToInt())
  675. .results();
  676. QCOMPARE(list2, QList<int>() << 1 << 2 << 3);
  677. }
  678. {
  679. QStringList strings = QStringList() << "1" << "2" << "3";
  680. QList<int> list = QtConcurrent::mapped(strings, stringToInt).results();
  681. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  682. QList<int> list2 = QtConcurrent::mapped(strings.constBegin(),
  683. strings.constEnd(),
  684. stringToInt)
  685. .results();
  686. QCOMPARE(list2, QList<int>() << 1 << 2 << 3);
  687. }
  688. }
  689. void tst_QtConcurrentMap::blocking_mapped()
  690. {
  691. QList<int> list;
  692. list << 1 << 2 << 3;
  693. QLinkedList<int> linkedList;
  694. linkedList << 1 << 2 << 3;
  695. QList<Number> numberList;
  696. numberList << 1 << 2 << 3;
  697. QLinkedList<Number> numberLinkedList;
  698. numberLinkedList << 1 << 2 << 3;
  699. // functor
  700. {
  701. QList<int> list2 = QtConcurrent::blockingMapped(list, MultiplyBy2());
  702. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  703. QCOMPARE(list2, QList<int>() << 2 << 4 << 6);
  704. QList<int> list3 = QtConcurrent::blockingMapped<QList<int> >(list.constBegin(),
  705. list.constEnd(),
  706. MultiplyBy2());
  707. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  708. QCOMPARE(list3, QList<int>() << 2 << 4 << 6);
  709. QList<int> list4 = QtConcurrent::blockingMapped(QList<int>(list), MultiplyBy2());
  710. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  711. QCOMPARE(list4, QList<int>() << 2 << 4 << 6);
  712. }
  713. {
  714. QLinkedList<int> linkedList2 = QtConcurrent::blockingMapped(linkedList, MultiplyBy2());
  715. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  716. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4 << 6);
  717. QLinkedList<int> linkedList3 = QtConcurrent::blockingMapped<QLinkedList<int> >(linkedList.constBegin(),
  718. linkedList.constEnd(),
  719. MultiplyBy2());
  720. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  721. QCOMPARE(linkedList3, QLinkedList<int>() << 2 << 4 << 6);
  722. QLinkedList<int> linkedList4 = QtConcurrent::blockingMapped(QLinkedList<int>(linkedList), MultiplyBy2());
  723. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  724. QCOMPARE(linkedList4, QLinkedList<int>() << 2 << 4 << 6);
  725. }
  726. // function
  727. {
  728. QList<int> list2 = QtConcurrent::blockingMapped(list, multiplyBy2);
  729. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  730. QCOMPARE(list2, QList<int>() << 2 << 4 << 6);
  731. QList<int> list3 = QtConcurrent::blockingMapped<QList<int> >(list.constBegin(),
  732. list.constEnd(),
  733. multiplyBy2);
  734. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  735. QCOMPARE(list3, QList<int>() << 2 << 4 << 6);
  736. QList<int> list4 = QtConcurrent::blockingMapped(QList<int>(list), multiplyBy2);
  737. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  738. QCOMPARE(list4, QList<int>() << 2 << 4 << 6);
  739. }
  740. {
  741. QLinkedList<int> linkedList2 = QtConcurrent::blockingMapped(linkedList, multiplyBy2);
  742. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  743. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4 << 6);
  744. QLinkedList<int> linkedList3 = QtConcurrent::blockingMapped<QLinkedList<int> >(linkedList.constBegin(),
  745. linkedList.constEnd(),
  746. multiplyBy2);
  747. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  748. QCOMPARE(linkedList3, QLinkedList<int>() << 2 << 4 << 6);
  749. QLinkedList<int> linkedList4 = QtConcurrent::blockingMapped(QLinkedList<int>(linkedList), multiplyBy2);
  750. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  751. QCOMPARE(linkedList4, QLinkedList<int>() << 2 << 4 << 6);
  752. }
  753. // bound function
  754. {
  755. QList<int> list2 = QtConcurrent::blockingMapped(list, multiplyBy2);
  756. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  757. QCOMPARE(list2, QList<int>() << 2 << 4 << 6);
  758. QList<int> list3 = QtConcurrent::blockingMapped<QList<int> >(list.constBegin(),
  759. list.constEnd(),
  760. multiplyBy2);
  761. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  762. QCOMPARE(list3, QList<int>() << 2 << 4 << 6);
  763. QList<int> list4 = QtConcurrent::blockingMapped(QList<int>(list), multiplyBy2);
  764. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  765. QCOMPARE(list4, QList<int>() << 2 << 4 << 6);
  766. }
  767. {
  768. QLinkedList<int> linkedList2 = QtConcurrent::blockingMapped(linkedList, multiplyBy2);
  769. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  770. QCOMPARE(linkedList2, QLinkedList<int>() << 2 << 4 << 6);
  771. QLinkedList<int> linkedList3 = QtConcurrent::blockingMapped<QLinkedList<int> >(linkedList.constBegin(),
  772. linkedList.constEnd(),
  773. multiplyBy2);
  774. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  775. QCOMPARE(linkedList3, QLinkedList<int>() << 2 << 4 << 6);
  776. QLinkedList<int> linkedList4 = QtConcurrent::blockingMapped(QLinkedList<int>(linkedList), multiplyBy2);
  777. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  778. QCOMPARE(linkedList4, QLinkedList<int>() << 2 << 4 << 6);
  779. }
  780. // const member function
  781. {
  782. QList<Number> numberList2 = QtConcurrent::blockingMapped(numberList, &Number::multipliedBy2);
  783. QCOMPARE(numberList, QList<Number>() << 1 << 2 << 3);
  784. QCOMPARE(numberList2, QList<Number>() << 2 << 4 << 6);
  785. QList<Number> numberList3 = QtConcurrent::blockingMapped<QList<Number> >(numberList.constBegin(),
  786. numberList.constEnd(),
  787. &Number::multipliedBy2);
  788. QCOMPARE(numberList, QList<Number>() << 1 << 2 << 3);
  789. QCOMPARE(numberList3, QList<Number>() << 2 << 4 << 6);
  790. QList<Number> numberList4 = QtConcurrent::blockingMapped(QList<Number>(numberList),
  791. &Number::multipliedBy2);
  792. QCOMPARE(numberList, QList<Number>() << 1 << 2 << 3);
  793. QCOMPARE(numberList4, QList<Number>() << 2 << 4 << 6);
  794. }
  795. {
  796. QLinkedList<Number> numberLinkedList2 = QtConcurrent::blockingMapped(numberLinkedList, &Number::multipliedBy2);
  797. QCOMPARE(numberLinkedList, QLinkedList<Number>() << 1 << 2 << 3);
  798. QCOMPARE(numberLinkedList2, QLinkedList<Number>() << 2 << 4 << 6);
  799. QLinkedList<Number> numberLinkedList3 = QtConcurrent::blockingMapped<QLinkedList<Number> >(numberLinkedList.constBegin(),
  800. numberLinkedList.constEnd(),
  801. &Number::multipliedBy2);
  802. QCOMPARE(numberLinkedList, QLinkedList<Number>() << 1 << 2 << 3);
  803. QCOMPARE(numberLinkedList3, QLinkedList<Number>() << 2 << 4 << 6);
  804. QLinkedList<Number> numberLinkedList4 = QtConcurrent::blockingMapped(QLinkedList<Number>(numberLinkedList),
  805. &Number::multipliedBy2);
  806. QCOMPARE(numberLinkedList, QLinkedList<Number>() << 1 << 2 << 3);
  807. QCOMPARE(numberLinkedList4, QLinkedList<Number>() << 2 << 4 << 6);
  808. }
  809. // change the value_type, same container
  810. // functor
  811. {
  812. QList<double> list2 = QtConcurrent::blockingMapped<QList<double> >(list, IntToDouble());
  813. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  814. QCOMPARE(list2, QList<double>() << 1.0 << 2.0 << 3.0);
  815. QList<double> list3 = QtConcurrent::blockingMapped<QList<double> >(list.constBegin(),
  816. list.constEnd(),
  817. IntToDouble());
  818. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  819. QCOMPARE(list3, QList<double>() << 1.0 << 2.0 << 3.0);
  820. QList<double> list4 = QtConcurrent::blockingMapped<QList<double> >(QList<int>(list),
  821. IntToDouble());
  822. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  823. QCOMPARE(list4, QList<double>() << 1.0 << 2.0 << 3.0);
  824. }
  825. {
  826. QLinkedList<double> linkedList2 = QtConcurrent::blockingMapped<QLinkedList<double> >(linkedList, IntToDouble());
  827. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  828. QCOMPARE(linkedList2, QLinkedList<double>() << 1.0 << 2.0 << 3.0);
  829. QLinkedList<double> linkedList3 = QtConcurrent::blockingMapped<QLinkedList<double> >(linkedList.constBegin(),
  830. linkedList.constEnd(),
  831. IntToDouble());
  832. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  833. QCOMPARE(linkedList3, QLinkedList<double>() << 1.0 << 2.0 << 3.0);
  834. QLinkedList<double> linkedList4 = QtConcurrent::blockingMapped<QLinkedList<double> >(QLinkedList<int>(linkedList),
  835. IntToDouble());
  836. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  837. QCOMPARE(linkedList4, QLinkedList<double>() << 1.0 << 2.0 << 3.0);
  838. }
  839. // function
  840. {
  841. QList<double> list2 = QtConcurrent::blockingMapped<QList<double> >(list, intToDouble);
  842. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  843. QCOMPARE(list2, QList<double>() << 1.0 << 2.0 << 3.0);
  844. QList<double> list3 = QtConcurrent::blockingMapped<QList<double> >(list.constBegin(),
  845. list.constEnd(),
  846. intToDouble);
  847. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  848. QCOMPARE(list3, QList<double>() << 1.0 << 2.0 << 3.0);
  849. QList<double> list4 = QtConcurrent::blockingMapped<QList<double> >(QList<int>(list), intToDouble);
  850. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  851. QCOMPARE(list4, QList<double>() << 1.0 << 2.0 << 3.0);
  852. }
  853. {
  854. QLinkedList<double> linkedList2 = QtConcurrent::blockingMapped<QLinkedList<double> >(linkedList, intToDouble);
  855. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  856. QCOMPARE(linkedList2, QLinkedList<double>() << 1.0 << 2.0 << 3.0);
  857. QLinkedList<double> linkedList3 = QtConcurrent::blockingMapped<QLinkedList<double> >(linkedList.constBegin(),
  858. linkedList.constEnd(),
  859. intToDouble);
  860. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  861. QCOMPARE(linkedList3, QLinkedList<double>() << 1.0 << 2.0 << 3.0);
  862. QLinkedList<double> linkedList4 = QtConcurrent::blockingMapped<QLinkedList<double> >(QLinkedList<int>(linkedList), intToDouble);
  863. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  864. QCOMPARE(linkedList4, QLinkedList<double>() << 1.0 << 2.0 << 3.0);
  865. }
  866. // bound function
  867. {
  868. QList<double> list2 = QtConcurrent::blockingMapped<QList<double> >(list, intToDouble);
  869. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  870. QCOMPARE(list2, QList<double>() << 1.0 << 2.0 << 3.0);
  871. QList<double> list3 = QtConcurrent::blockingMapped<QList<double> >(list.constBegin(),
  872. list.constEnd(),
  873. intToDouble);
  874. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  875. QCOMPARE(list3, QList<double>() << 1.0 << 2.0 << 3.0);
  876. QList<double> list4 = QtConcurrent::blockingMapped<QList<double> >(QList<int>(list),
  877. intToDouble);
  878. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  879. QCOMPARE(list4, QList<double>() << 1.0 << 2.0 << 3.0);
  880. }
  881. {
  882. QLinkedList<double> linkedList2 = QtConcurrent::blockingMapped<QLinkedList<double> >(linkedList, intToDouble);
  883. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  884. QCOMPARE(linkedList2, QLinkedList<double>() << 1.0 << 2.0 << 3.0);
  885. QLinkedList<double> linkedList3 = QtConcurrent::blockingMapped<QLinkedList<double> >(linkedList.constBegin(),
  886. linkedList.constEnd(),
  887. intToDouble);
  888. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  889. QCOMPARE(linkedList3, QLinkedList<double>() << 1.0 << 2.0 << 3.0);
  890. QLinkedList<double> linkedList4 = QtConcurrent::blockingMapped<QLinkedList<double> >(QLinkedList<int>(linkedList),
  891. intToDouble);
  892. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  893. QCOMPARE(linkedList4, QLinkedList<double>() << 1.0 << 2.0 << 3.0);
  894. }
  895. // const member function
  896. {
  897. QList<QString> list2 =
  898. QtConcurrent::blockingMapped<QList<QString> >(numberList, &Number::toString);
  899. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  900. QCOMPARE(list2, QList<QString>() << "1" << "2" << "3");
  901. QList<QString> list3 = QtConcurrent::blockingMapped<QList<QString> >(numberList.constBegin(),
  902. numberList.constEnd()
  903. , &Number::toString);
  904. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  905. QCOMPARE(list3, QList<QString>() << "1" << "2" << "3");
  906. QList<QString> list4 =
  907. QtConcurrent::blockingMapped<QList<QString> >(QList<Number>(numberList), &Number::toString);
  908. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  909. QCOMPARE(list4, QList<QString>() << "1" << "2" << "3");
  910. }
  911. {
  912. QLinkedList<QString> linkedList2 =
  913. QtConcurrent::blockingMapped<QLinkedList<QString> >(numberLinkedList, &Number::toString);
  914. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  915. QCOMPARE(linkedList2, QLinkedList<QString>() << "1" << "2" << "3");
  916. QLinkedList<QString> linkedList3 = QtConcurrent::blockingMapped<QLinkedList<QString> >(numberLinkedList.constBegin(),
  917. numberLinkedList.constEnd()
  918. , &Number::toString);
  919. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  920. QCOMPARE(linkedList3, QLinkedList<QString>() << "1" << "2" << "3");
  921. QLinkedList<QString> linkedList4 =
  922. QtConcurrent::blockingMapped<QLinkedList<QString> >(QLinkedList<Number>(numberLinkedList), &Number::toString);
  923. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  924. QCOMPARE(linkedList4, QLinkedList<QString>() << "1" << "2" << "3");
  925. }
  926. // change the value_type
  927. {
  928. QList<QString> strings = QStringList() << "1" << "2" << "3";
  929. QList<int> list = QtConcurrent::blockingMapped(strings, StringToInt());
  930. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  931. QList<int> list2 = QtConcurrent::blockingMapped<QList<int> >(strings.constBegin(),
  932. strings.constEnd(),
  933. StringToInt());
  934. QCOMPARE(list2, QList<int>() << 1 << 2 << 3);
  935. }
  936. {
  937. QList<QString> strings = QStringList() << "1" << "2" << "3";
  938. QList<int> list = QtConcurrent::blockingMapped(strings, stringToInt);
  939. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  940. QList<int> list2 = QtConcurrent::blockingMapped<QList<int> >(strings.constBegin(),
  941. strings.constEnd(),
  942. stringToInt);
  943. QCOMPARE(list2, QList<int>() << 1 << 2 << 3);
  944. }
  945. {
  946. QList<int> numberList2 = QtConcurrent::blockingMapped(numberList, &Number::toInt);
  947. QCOMPARE(numberList2, QList<int>() << 1 << 2 << 3);
  948. QList<int> numberList3 = QtConcurrent::blockingMapped<QList<int> >(numberList.constBegin(),
  949. numberList.constEnd(),
  950. &Number::toInt);
  951. QCOMPARE(numberList3, QList<int>() << 1 << 2 << 3);
  952. }
  953. // change the value_type from QStringList
  954. {
  955. QStringList strings = QStringList() << "1" << "2" << "3";
  956. QList<int> list = QtConcurrent::blockingMapped(strings, StringToInt());
  957. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  958. QList<int> list2 = QtConcurrent::blockingMapped<QList<int> >(strings.constBegin(),
  959. strings.constEnd(),
  960. StringToInt());
  961. QCOMPARE(list2, QList<int>() << 1 << 2 << 3);
  962. }
  963. {
  964. QStringList strings = QStringList() << "1" << "2" << "3";
  965. QList<int> list = QtConcurrent::blockingMapped(strings, stringToInt);
  966. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  967. QList<int> list2 = QtConcurrent::blockingMapped<QList<int> >(strings.constBegin(),
  968. strings.constEnd(),
  969. stringToInt);
  970. QCOMPARE(list2, QList<int>() << 1 << 2 << 3);
  971. }
  972. // functor
  973. {
  974. QVector<double> list2 = QtConcurrent::blockingMapped<QVector<double> >(list, IntToDouble());
  975. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  976. QCOMPARE(list2, QVector<double>() << 1.0 << 2.0 << 3.0);
  977. QVector<double> list3 = QtConcurrent::blockingMapped<QVector<double> >(list.constBegin(),
  978. list.constEnd(),
  979. IntToDouble());
  980. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  981. QCOMPARE(list3, QVector<double>() << 1.0 << 2.0 << 3.0);
  982. QVector<double> list4 = QtConcurrent::blockingMapped<QVector<double> >(QList<int>(list),
  983. IntToDouble());
  984. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  985. QCOMPARE(list4, QVector<double>() << 1.0 << 2.0 << 3.0);
  986. QStringList strings = QStringList() << "1" << "2" << "3";
  987. QVector<int> list5 = QtConcurrent::blockingMapped<QVector<int> >(strings, StringToInt());
  988. QCOMPARE(list5, QVector<int>() << 1 << 2 << 3);
  989. QVector<int> list6 = QtConcurrent::blockingMapped<QVector<int> >(strings.constBegin(),
  990. strings.constEnd(),
  991. StringToInt());
  992. QCOMPARE(list6, QVector<int>() << 1 << 2 << 3);
  993. QVector<int> list7 = QtConcurrent::blockingMapped<QVector<int> >(QStringList(strings),
  994. StringToInt());
  995. QCOMPARE(list7, QVector<int>() << 1 << 2 << 3);
  996. }
  997. // function
  998. {
  999. QVector<double> list2 = QtConcurrent::blockingMapped<QVector<double> >(list, intToDouble);
  1000. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1001. QCOMPARE(list2, QVector<double>() << 1.0 << 2.0 << 3.0);
  1002. QVector<double> list3 = QtConcurrent::blockingMapped<QVector<double> >(list.constBegin(),
  1003. list.constEnd(),
  1004. intToDouble);
  1005. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1006. QCOMPARE(list3, QVector<double>() << 1.0 << 2.0 << 3.0);
  1007. QVector<double> list4 = QtConcurrent::blockingMapped<QVector<double> >(QList<int>(list),
  1008. intToDouble);
  1009. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1010. QCOMPARE(list4, QVector<double>() << 1.0 << 2.0 << 3.0);
  1011. QStringList strings = QStringList() << "1" << "2" << "3";
  1012. QVector<int> list5 = QtConcurrent::blockingMapped<QVector<int> >(strings, stringToInt);
  1013. QCOMPARE(list5, QVector<int>() << 1 << 2 << 3);
  1014. QVector<int> list6 = QtConcurrent::blockingMapped<QVector<int> >(strings.constBegin(),
  1015. strings.constEnd(),
  1016. stringToInt);
  1017. QCOMPARE(list6, QVector<int>() << 1 << 2 << 3);
  1018. QVector<int> list7 = QtConcurrent::blockingMapped<QVector<int> >(QStringList(strings),
  1019. stringToInt);
  1020. QCOMPARE(list7, QVector<int>() << 1 << 2 << 3);
  1021. }
  1022. // bound function
  1023. {
  1024. QVector<double> list2 = QtConcurrent::blockingMapped<QVector<double> >(list, intToDouble);
  1025. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1026. QCOMPARE(list2, QVector<double>() << 1.0 << 2.0 << 3.0);
  1027. QVector<double> list3 = QtConcurrent::blockingMapped<QVector<double> >(QList<int>(list), intToDouble);
  1028. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1029. QCOMPARE(list3, QVector<double>() << 1.0 << 2.0 << 3.0);
  1030. QStringList strings = QStringList() << "1" << "2" << "3";
  1031. QVector<int> list4 = QtConcurrent::blockingMapped<QVector<int> >(strings, stringToInt);
  1032. QCOMPARE(list4, QVector<int>() << 1 << 2 << 3);
  1033. QVector<int> list5 = QtConcurrent::blockingMapped<QVector<int> >(QStringList(strings), stringToInt);
  1034. QCOMPARE(list5, QVector<int>() << 1 << 2 << 3);
  1035. }
  1036. // const member function
  1037. {
  1038. QVector<QString> list2 = QtConcurrent::blockingMapped<QVector<QString> >(numberList, &Number::toString);
  1039. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1040. QCOMPARE(list2, QVector<QString>() << "1" << "2" << "3");
  1041. QVector<QString> list3 =
  1042. QtConcurrent::blockingMapped<QVector<QString> >(QList<Number>(numberList), &Number::toString);
  1043. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1044. QCOMPARE(list3, QVector<QString>() << "1" << "2" << "3");
  1045. // not allowed: const member function where all arguments have default values
  1046. #if 0
  1047. QStringList strings = QStringList() << "1" << "2" << "3";
  1048. QVector<int> list4 = QtConcurrent::blockingMapped<QVector<int> >(strings, &QString::toInt);
  1049. QCOMPARE(list4, QVector<int>() << 1 << 2 << 3);
  1050. QVector<int> list5 = QtConcurrent::blockingMapped<QVector<int> >(QStringList(strings), &QString::toInt);
  1051. QCOMPARE(list5, QVector<int>() << 1 << 2 << 3);
  1052. #endif
  1053. }
  1054. }
  1055. int intSquare(int x)
  1056. {
  1057. return x * x;
  1058. }
  1059. class IntSquare
  1060. {
  1061. public:
  1062. typedef int result_type;
  1063. int operator()(int x)
  1064. {
  1065. return x * x;
  1066. }
  1067. };
  1068. void tst_QtConcurrentMap::mappedReduced()
  1069. {
  1070. QList<int> list;
  1071. list << 1 << 2 << 3;
  1072. QLinkedList<int> linkedList;
  1073. linkedList << 1 << 2 << 3;
  1074. QList<Number> numberList;
  1075. numberList << 1 << 2 << 3;
  1076. QLinkedList<Number> numberLinkedList;
  1077. numberLinkedList << 1 << 2 << 3;
  1078. // test Q_DECLARE_OPERATORS_FOR_FLAGS
  1079. QtConcurrent::ReduceOptions opt = (QtConcurrent::UnorderedReduce | QtConcurrent::SequentialReduce);
  1080. // functor-functor
  1081. {
  1082. int sum = QtConcurrent::mappedReduced<int>(list, IntSquare(), IntSumReduce());
  1083. QCOMPARE(sum, 14);
  1084. int sum2 = QtConcurrent::mappedReduced<int>(list.constBegin(),
  1085. list.constEnd(),
  1086. IntSquare(),
  1087. IntSumReduce());
  1088. QCOMPARE(sum2, 14);
  1089. int sum3 = QtConcurrent::mappedReduced<int>(QList<int>(list), IntSquare(), IntSumReduce());
  1090. QCOMPARE(sum3, 14);
  1091. int sum4 = QtConcurrent::mappedReduced<int>(list, intSquare, intSumReduce);
  1092. QCOMPARE(sum4, 14);
  1093. int sum5 = QtConcurrent::mappedReduced<int>(list.constBegin(),
  1094. list.constEnd(),
  1095. intSquare,
  1096. intSumReduce);
  1097. QCOMPARE(sum5, 14);
  1098. int sum6 = QtConcurrent::mappedReduced<int>(QList<int>(list),
  1099. intSquare,
  1100. intSumReduce);
  1101. QCOMPARE(sum6, 14);
  1102. }
  1103. {
  1104. int sum = QtConcurrent::mappedReduced<int>(linkedList, IntSquare(), IntSumReduce());
  1105. QCOMPARE(sum, 14);
  1106. int sum2 = QtConcurrent::mappedReduced<int>(linkedList.constBegin(),
  1107. linkedList.constEnd(),
  1108. IntSquare(),
  1109. IntSumReduce());
  1110. QCOMPARE(sum2, 14);
  1111. int sum3 = QtConcurrent::mappedReduced<int>(QLinkedList<int>(linkedList), IntSquare(), IntSumReduce());
  1112. QCOMPARE(sum3, 14);
  1113. int sum4 = QtConcurrent::mappedReduced<int>(linkedList, intSquare, intSumReduce);
  1114. QCOMPARE(sum4, 14);
  1115. int sum5 = QtConcurrent::mappedReduced<int>(linkedList.constBegin(),
  1116. linkedList.constEnd(),
  1117. intSquare,
  1118. intSumReduce);
  1119. QCOMPARE(sum5, 14);
  1120. int sum6 = QtConcurrent::mappedReduced<int>(QLinkedList<int>(linkedList),
  1121. intSquare,
  1122. intSumReduce);
  1123. QCOMPARE(sum6, 14);
  1124. }
  1125. // function-functor
  1126. {
  1127. int sum = QtConcurrent::mappedReduced<int>(list, intSquare, IntSumReduce());
  1128. QCOMPARE(sum, 14);
  1129. int sum2 = QtConcurrent::mappedReduced<int>(list.constBegin(),
  1130. list.constEnd(),
  1131. intSquare,
  1132. IntSumReduce());
  1133. QCOMPARE(sum2, 14);
  1134. int sum3 = QtConcurrent::mappedReduced<int>(QList<int>(list), intSquare, IntSumReduce());
  1135. QCOMPARE(sum3, 14);
  1136. }
  1137. {
  1138. int sum = QtConcurrent::mappedReduced<int>(linkedList, intSquare, IntSumReduce());
  1139. QCOMPARE(sum, 14);
  1140. int sum2 = QtConcurrent::mappedReduced<int>(linkedList.constBegin(),
  1141. linkedList.constEnd(),
  1142. intSquare,
  1143. IntSumReduce());
  1144. QCOMPARE(sum2, 14);
  1145. int sum3 = QtConcurrent::mappedReduced<int>(QLinkedList<int>(linkedList), intSquare, IntSumReduce());
  1146. QCOMPARE(sum3, 14);
  1147. }
  1148. // functor-function
  1149. {
  1150. int sum = QtConcurrent::mappedReduced(list, IntSquare(), intSumReduce);
  1151. QCOMPARE(sum, 14);
  1152. int sum2 = QtConcurrent::mappedReduced(list.constBegin(),
  1153. list.constEnd(),
  1154. IntSquare(),
  1155. intSumReduce);
  1156. QCOMPARE(sum2, 14);
  1157. int sum3 = QtConcurrent::mappedReduced(QList<int>(list), IntSquare(), intSumReduce);
  1158. QCOMPARE(sum3, 14);
  1159. }
  1160. {
  1161. int sum = QtConcurrent::mappedReduced(linkedList, IntSquare(), intSumReduce);
  1162. QCOMPARE(sum, 14);
  1163. int sum2 = QtConcurrent::mappedReduced(linkedList.constBegin(),
  1164. linkedList.constEnd(),
  1165. IntSquare(),
  1166. intSumReduce);
  1167. QCOMPARE(sum2, 14);
  1168. int sum3 = QtConcurrent::mappedReduced(QLinkedList<int>(linkedList), IntSquare(), intSumReduce);
  1169. QCOMPARE(sum3, 14);
  1170. }
  1171. // function-function
  1172. {
  1173. int sum = QtConcurrent::mappedReduced(list, intSquare, intSumReduce);
  1174. QCOMPARE(sum, 14);
  1175. int sum2 = QtConcurrent::mappedReduced(list.constBegin(),
  1176. list.constEnd(),
  1177. intSquare,
  1178. intSumReduce);
  1179. QCOMPARE(sum2, 14);
  1180. int sum3 = QtConcurrent::mappedReduced(QList<int>(list), intSquare, intSumReduce);
  1181. QCOMPARE(sum3, 14);
  1182. }
  1183. {
  1184. int sum = QtConcurrent::mappedReduced(linkedList, intSquare, intSumReduce);
  1185. QCOMPARE(sum, 14);
  1186. int sum2 = QtConcurrent::mappedReduced(linkedList.constBegin(),
  1187. linkedList.constEnd(),
  1188. intSquare,
  1189. intSumReduce);
  1190. QCOMPARE(sum2, 14);
  1191. int sum3 = QtConcurrent::mappedReduced(QLinkedList<int>(linkedList), intSquare, intSumReduce);
  1192. QCOMPARE(sum3, 14);
  1193. }
  1194. // functor-member
  1195. {
  1196. QList<int> list2 = QtConcurrent::mappedReduced(list,
  1197. IntSquare(),
  1198. &QList<int>::push_back,
  1199. OrderedReduce);
  1200. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1201. QCOMPARE(list2, QList<int>() << 1 << 4 << 9);
  1202. QList<int> list3 = QtConcurrent::mappedReduced(list.constBegin(),
  1203. list.constEnd(),
  1204. IntSquare(),
  1205. &QList<int>::push_back,
  1206. OrderedReduce);
  1207. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1208. QCOMPARE(list3, QList<int>() << 1 << 4 << 9);
  1209. QList<int> list4 = QtConcurrent::mappedReduced(QList<int>(list),
  1210. IntSquare(),
  1211. &QList<int>::push_back,
  1212. OrderedReduce);
  1213. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1214. QCOMPARE(list4, QList<int>() << 1 << 4 << 9);
  1215. }
  1216. {
  1217. QLinkedList<int> linkedList2 = QtConcurrent::mappedReduced(linkedList,
  1218. IntSquare(),
  1219. &QLinkedList<int>::push_back,
  1220. OrderedReduce);
  1221. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1222. QCOMPARE(linkedList2, QLinkedList<int>() << 1 << 4 << 9);
  1223. QLinkedList<int> linkedList3 = QtConcurrent::mappedReduced(linkedList.constBegin(),
  1224. linkedList.constEnd(),
  1225. IntSquare(),
  1226. &QLinkedList<int>::push_back,
  1227. OrderedReduce);
  1228. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1229. QCOMPARE(linkedList3, QLinkedList<int>() << 1 << 4 << 9);
  1230. QLinkedList<int> linkedList4 = QtConcurrent::mappedReduced(QLinkedList<int>(linkedList),
  1231. IntSquare(),
  1232. &QLinkedList<int>::push_back,
  1233. OrderedReduce);
  1234. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1235. QCOMPARE(linkedList4, QLinkedList<int>() << 1 << 4 << 9);
  1236. }
  1237. // member-functor
  1238. {
  1239. int sum = QtConcurrent::mappedReduced<int>(numberList, &Number::toInt, IntSumReduce());
  1240. QCOMPARE(sum, 6);
  1241. int sum2 = QtConcurrent::mappedReduced<int>(numberList.constBegin(),
  1242. numberList.constEnd(),
  1243. &Number::toInt,
  1244. IntSumReduce());
  1245. QCOMPARE(sum2, 6);
  1246. int sum3 = QtConcurrent::mappedReduced<int>(QList<Number>(numberList),
  1247. &Number::toInt,
  1248. IntSumReduce());
  1249. QCOMPARE(sum3, 6);
  1250. }
  1251. {
  1252. int sum = QtConcurrent::mappedReduced<int>(numberLinkedList, &Number::toInt, IntSumReduce());
  1253. QCOMPARE(sum, 6);
  1254. int sum2 = QtConcurrent::mappedReduced<int>(numberLinkedList.constBegin(),
  1255. numberLinkedList.constEnd(),
  1256. &Number::toInt,
  1257. IntSumReduce());
  1258. QCOMPARE(sum2, 6);
  1259. int sum3 = QtConcurrent::mappedReduced<int>(QLinkedList<Number>(numberLinkedList),
  1260. &Number::toInt,
  1261. IntSumReduce());
  1262. QCOMPARE(sum3, 6);
  1263. }
  1264. // member-member
  1265. {
  1266. QList<int> list2 = QtConcurrent::mappedReduced(numberList,
  1267. &Number::toInt,
  1268. &QList<int>::push_back,
  1269. OrderedReduce);
  1270. QCOMPARE(list2, QList<int>() << 1 << 2 << 3);
  1271. QList<int> list3 = QtConcurrent::mappedReduced(numberList.constBegin(),
  1272. numberList.constEnd(),
  1273. &Number::toInt,
  1274. &QList<int>::push_back,
  1275. OrderedReduce);
  1276. QCOMPARE(list3, QList<int>() << 1 << 2 << 3);
  1277. QList<int> list4 = QtConcurrent::mappedReduced(QList<Number>(numberList),
  1278. &Number::toInt,
  1279. &QList<int>::push_back, OrderedReduce);
  1280. QCOMPARE(list4, QList<int>() << 1 << 2 << 3);
  1281. }
  1282. {
  1283. QLinkedList<int> linkedList2 = QtConcurrent::mappedReduced(numberLinkedList,
  1284. &Number::toInt,
  1285. &QLinkedList<int>::push_back,
  1286. OrderedReduce);
  1287. QCOMPARE(linkedList2, QLinkedList<int>() << 1 << 2 << 3);
  1288. QLinkedList<int> linkedList3 = QtConcurrent::mappedReduced(numberLinkedList.constBegin(),
  1289. numberLinkedList.constEnd(),
  1290. &Number::toInt,
  1291. &QLinkedList<int>::push_back,
  1292. OrderedReduce);
  1293. QCOMPARE(linkedList3, QLinkedList<int>() << 1 << 2 << 3);
  1294. QLinkedList<int> linkedList4 = QtConcurrent::mappedReduced(QLinkedList<Number>(numberLinkedList),
  1295. &Number::toInt,
  1296. &QLinkedList<int>::push_back, OrderedReduce);
  1297. QCOMPARE(linkedList4, QLinkedList<int>() << 1 << 2 << 3);
  1298. }
  1299. // function-member
  1300. {
  1301. QList<int> list2 = QtConcurrent::mappedReduced(list,
  1302. intSquare,
  1303. &QList<int>::push_back,
  1304. OrderedReduce);
  1305. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1306. QCOMPARE(list2, QList<int>() << 1 << 4 << 9);
  1307. QList<int> list3 = QtConcurrent::mappedReduced(list.constBegin(),
  1308. list.constEnd(),
  1309. intSquare,
  1310. &QList<int>::push_back,
  1311. OrderedReduce);
  1312. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1313. QCOMPARE(list3, QList<int>() << 1 << 4 << 9);
  1314. QList<int> list4 = QtConcurrent::mappedReduced(QList<int>(list),
  1315. intSquare,
  1316. &QList<int>::push_back,
  1317. OrderedReduce);
  1318. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1319. QCOMPARE(list4, QList<int>() << 1 << 4 << 9);
  1320. }
  1321. {
  1322. QLinkedList<int> linkedList2 = QtConcurrent::mappedReduced(linkedList,
  1323. intSquare,
  1324. &QLinkedList<int>::append,
  1325. OrderedReduce);
  1326. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1327. QCOMPARE(linkedList2, QLinkedList<int>() << 1 << 4 << 9);
  1328. QLinkedList<int> linkedList3 = QtConcurrent::mappedReduced(linkedList.constBegin(),
  1329. linkedList.constEnd(),
  1330. intSquare,
  1331. &QLinkedList<int>::append,
  1332. OrderedReduce);
  1333. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1334. QCOMPARE(linkedList3, QLinkedList<int>() << 1 << 4 << 9);
  1335. QLinkedList<int> linkedList4 = QtConcurrent::mappedReduced(QLinkedList<int>(linkedList),
  1336. intSquare,
  1337. &QLinkedList<int>::append,
  1338. OrderedReduce);
  1339. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1340. QCOMPARE(linkedList4, QLinkedList<int>() << 1 << 4 << 9);
  1341. }
  1342. // member-function
  1343. {
  1344. int sum = QtConcurrent::mappedReduced(numberList,
  1345. &Number::toInt,
  1346. intSumReduce);
  1347. QCOMPARE(sum, 6);
  1348. int sum2 = QtConcurrent::mappedReduced(numberList.constBegin(),
  1349. numberList.constEnd(),
  1350. &Number::toInt,
  1351. intSumReduce);
  1352. QCOMPARE(sum2, 6);
  1353. int sum3 = QtConcurrent::mappedReduced(QList<Number>(numberList),
  1354. &Number::toInt,
  1355. intSumReduce);
  1356. QCOMPARE(sum3, 6);
  1357. }
  1358. {
  1359. int sum = QtConcurrent::mappedReduced(numberLinkedList,
  1360. &Number::toInt,
  1361. intSumReduce);
  1362. QCOMPARE(sum, 6);
  1363. int sum2 = QtConcurrent::mappedReduced(numberLinkedList.constBegin(),
  1364. numberLinkedList.constEnd(),
  1365. &Number::toInt,
  1366. intSumReduce);
  1367. QCOMPARE(sum2, 6);
  1368. int sum3 = QtConcurrent::mappedReduced(QLinkedList<Number>(numberLinkedList),
  1369. &Number::toInt,
  1370. intSumReduce);
  1371. QCOMPARE(sum3, 6);
  1372. }
  1373. // linked lists
  1374. {
  1375. QLinkedList<int> list;
  1376. list << 1 << 2 << 3;
  1377. QLinkedList<Number> numberList;
  1378. numberList << 1 << 2 << 3;
  1379. int sum = QtConcurrent::mappedReduced<int>(list, IntSquare(), IntSumReduce());
  1380. QCOMPARE(sum, 14);
  1381. int sum2 = QtConcurrent::mappedReduced<int>(list.constBegin(),
  1382. list.constEnd(),
  1383. IntSquare(),
  1384. IntSumReduce());
  1385. QCOMPARE(sum2, 14);
  1386. int sum3 = QtConcurrent::mappedReduced<int>(QLinkedList<int>(list), IntSquare(), IntSumReduce());
  1387. QCOMPARE(sum3, 14);
  1388. int sum4 = QtConcurrent::mappedReduced<int>(list, intSquare, intSumReduce);
  1389. QCOMPARE(sum4, 14);
  1390. int sum5 = QtConcurrent::mappedReduced<int>(list.constBegin(),
  1391. list.constEnd(),
  1392. intSquare,
  1393. intSumReduce);
  1394. QCOMPARE(sum5, 14);
  1395. int sum6 = QtConcurrent::mappedReduced<int>(QLinkedList<int>(list),
  1396. intSquare,
  1397. intSumReduce);
  1398. QCOMPARE(sum6, 14);
  1399. }
  1400. // ### the same as above, with an initial result value
  1401. }
  1402. void tst_QtConcurrentMap::blocking_mappedReduced()
  1403. {
  1404. QList<int> list;
  1405. list << 1 << 2 << 3;
  1406. QLinkedList<int> linkedList;
  1407. linkedList << 1 << 2 << 3;
  1408. QList<Number> numberList;
  1409. numberList << 1 << 2 << 3;
  1410. QLinkedList<Number> numberLinkedList;
  1411. numberLinkedList << 1 << 2 << 3;
  1412. // functor-functor
  1413. {
  1414. int sum = QtConcurrent::blockingMappedReduced<int>(list, IntSquare(), IntSumReduce());
  1415. QCOMPARE(sum, 14);
  1416. int sum2 = QtConcurrent::blockingMappedReduced<int>(list.constBegin(),
  1417. list.constEnd(),
  1418. IntSquare(),
  1419. IntSumReduce());
  1420. QCOMPARE(sum2, 14);
  1421. int sum3 = QtConcurrent::blockingMappedReduced<int>(QList<int>(list), IntSquare(), IntSumReduce());
  1422. QCOMPARE(sum3, 14);
  1423. int sum4 = QtConcurrent::blockingMappedReduced<int>(list, intSquare, intSumReduce);
  1424. QCOMPARE(sum4, 14);
  1425. int sum5 = QtConcurrent::blockingMappedReduced<int>(list.constBegin(),
  1426. list.constEnd(),
  1427. intSquare,
  1428. intSumReduce);
  1429. QCOMPARE(sum5, 14);
  1430. int sum6 = QtConcurrent::blockingMappedReduced<int>(QList<int>(list),
  1431. intSquare,
  1432. intSumReduce);
  1433. QCOMPARE(sum6, 14);
  1434. }
  1435. {
  1436. int sum = QtConcurrent::blockingMappedReduced<int>(linkedList, IntSquare(), IntSumReduce());
  1437. QCOMPARE(sum, 14);
  1438. int sum2 = QtConcurrent::blockingMappedReduced<int>(linkedList.constBegin(),
  1439. linkedList.constEnd(),
  1440. IntSquare(),
  1441. IntSumReduce());
  1442. QCOMPARE(sum2, 14);
  1443. int sum3 = QtConcurrent::blockingMappedReduced<int>(QLinkedList<int>(linkedList), IntSquare(), IntSumReduce());
  1444. QCOMPARE(sum3, 14);
  1445. int sum4 = QtConcurrent::blockingMappedReduced<int>(linkedList, intSquare, intSumReduce);
  1446. QCOMPARE(sum4, 14);
  1447. int sum5 = QtConcurrent::blockingMappedReduced<int>(linkedList.constBegin(),
  1448. linkedList.constEnd(),
  1449. intSquare,
  1450. intSumReduce);
  1451. QCOMPARE(sum5, 14);
  1452. int sum6 = QtConcurrent::blockingMappedReduced<int>(QLinkedList<int>(linkedList),
  1453. intSquare,
  1454. intSumReduce);
  1455. QCOMPARE(sum6, 14);
  1456. }
  1457. // function-functor
  1458. {
  1459. int sum = QtConcurrent::blockingMappedReduced<int>(list, intSquare, IntSumReduce());
  1460. QCOMPARE(sum, 14);
  1461. int sum2 = QtConcurrent::blockingMappedReduced<int>(list.constBegin(),
  1462. list.constEnd(),
  1463. intSquare,
  1464. IntSumReduce());
  1465. QCOMPARE(sum2, 14);
  1466. int sum3 = QtConcurrent::blockingMappedReduced<int>(QList<int>(list), intSquare, IntSumReduce());
  1467. QCOMPARE(sum3, 14);
  1468. }
  1469. {
  1470. int sum = QtConcurrent::blockingMappedReduced<int>(linkedList, intSquare, IntSumReduce());
  1471. QCOMPARE(sum, 14);
  1472. int sum2 = QtConcurrent::blockingMappedReduced<int>(linkedList.constBegin(),
  1473. linkedList.constEnd(),
  1474. intSquare,
  1475. IntSumReduce());
  1476. QCOMPARE(sum2, 14);
  1477. int sum3 = QtConcurrent::blockingMappedReduced<int>(QLinkedList<int>(linkedList), intSquare, IntSumReduce());
  1478. QCOMPARE(sum3, 14);
  1479. }
  1480. // functor-function
  1481. {
  1482. int sum = QtConcurrent::blockingMappedReduced(list, IntSquare(), intSumReduce);
  1483. QCOMPARE(sum, 14);
  1484. int sum2 = QtConcurrent::blockingMappedReduced(list.constBegin(),
  1485. list.constEnd(),
  1486. IntSquare(),
  1487. intSumReduce);
  1488. QCOMPARE(sum2, 14);
  1489. int sum3 = QtConcurrent::blockingMappedReduced(QList<int>(list), IntSquare(), intSumReduce);
  1490. QCOMPARE(sum3, 14);
  1491. }
  1492. {
  1493. int sum = QtConcurrent::blockingMappedReduced(linkedList, IntSquare(), intSumReduce);
  1494. QCOMPARE(sum, 14);
  1495. int sum2 = QtConcurrent::blockingMappedReduced(linkedList.constBegin(),
  1496. linkedList.constEnd(),
  1497. IntSquare(),
  1498. intSumReduce);
  1499. QCOMPARE(sum2, 14);
  1500. int sum3 = QtConcurrent::blockingMappedReduced(QLinkedList<int>(linkedList), IntSquare(), intSumReduce);
  1501. QCOMPARE(sum3, 14);
  1502. }
  1503. // function-function
  1504. {
  1505. int sum = QtConcurrent::blockingMappedReduced(list, intSquare, intSumReduce);
  1506. QCOMPARE(sum, 14);
  1507. int sum2 = QtConcurrent::blockingMappedReduced(list.constBegin(),
  1508. list.constEnd(),
  1509. intSquare,
  1510. intSumReduce);
  1511. QCOMPARE(sum2, 14);
  1512. int sum3 = QtConcurrent::blockingMappedReduced(QList<int>(list), intSquare, intSumReduce);
  1513. QCOMPARE(sum3, 14);
  1514. }
  1515. {
  1516. int sum = QtConcurrent::blockingMappedReduced(linkedList, intSquare, intSumReduce);
  1517. QCOMPARE(sum, 14);
  1518. int sum2 = QtConcurrent::blockingMappedReduced(linkedList.constBegin(),
  1519. linkedList.constEnd(),
  1520. intSquare,
  1521. intSumReduce);
  1522. QCOMPARE(sum2, 14);
  1523. int sum3 = QtConcurrent::blockingMappedReduced(QLinkedList<int>(linkedList), intSquare, intSumReduce);
  1524. QCOMPARE(sum3, 14);
  1525. }
  1526. // functor-member
  1527. {
  1528. QList<int> list2 = QtConcurrent::blockingMappedReduced(list,
  1529. IntSquare(),
  1530. &QList<int>::push_back,
  1531. OrderedReduce);
  1532. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1533. QCOMPARE(list2, QList<int>() << 1 << 4 << 9);
  1534. QList<int> list3 = QtConcurrent::blockingMappedReduced(list.constBegin(),
  1535. list.constEnd(),
  1536. IntSquare(),
  1537. &QList<int>::push_back,
  1538. OrderedReduce);
  1539. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1540. QCOMPARE(list3, QList<int>() << 1 << 4 << 9);
  1541. QList<int> list4 = QtConcurrent::blockingMappedReduced(QList<int>(list),
  1542. IntSquare(),
  1543. &QList<int>::push_back,
  1544. OrderedReduce);
  1545. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1546. QCOMPARE(list4, QList<int>() << 1 << 4 << 9);
  1547. }
  1548. {
  1549. QLinkedList<int> linkedList2 = QtConcurrent::blockingMappedReduced(linkedList,
  1550. IntSquare(),
  1551. &QLinkedList<int>::append,
  1552. OrderedReduce);
  1553. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1554. QCOMPARE(linkedList2, QLinkedList<int>() << 1 << 4 << 9);
  1555. QLinkedList<int> linkedList3 = QtConcurrent::blockingMappedReduced(linkedList.constBegin(),
  1556. linkedList.constEnd(),
  1557. IntSquare(),
  1558. &QLinkedList<int>::append,
  1559. OrderedReduce);
  1560. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1561. QCOMPARE(linkedList3, QLinkedList<int>() << 1 << 4 << 9);
  1562. QLinkedList<int> linkedList4 = QtConcurrent::blockingMappedReduced(QLinkedList<int>(linkedList),
  1563. IntSquare(),
  1564. &QLinkedList<int>::append,
  1565. OrderedReduce);
  1566. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1567. QCOMPARE(linkedList4, QLinkedList<int>() << 1 << 4 << 9);
  1568. }
  1569. // member-functor
  1570. {
  1571. int sum = QtConcurrent::blockingMappedReduced<int>(numberList, &Number::toInt,
  1572. IntSumReduce());
  1573. QCOMPARE(sum, 6);
  1574. int sum2 = QtConcurrent::blockingMappedReduced<int>(numberList.constBegin(),
  1575. numberList.constEnd(),
  1576. &Number::toInt,
  1577. IntSumReduce());
  1578. QCOMPARE(sum2, 6);
  1579. int sum3 = QtConcurrent::blockingMappedReduced<int>(QList<Number>(numberList),
  1580. &Number::toInt,
  1581. IntSumReduce());
  1582. QCOMPARE(sum3, 6);
  1583. }
  1584. {
  1585. int sum = QtConcurrent::blockingMappedReduced<int>(numberLinkedList, &Number::toInt, IntSumReduce());
  1586. QCOMPARE(sum, 6);
  1587. int sum2 = QtConcurrent::blockingMappedReduced<int>(numberLinkedList.constBegin(),
  1588. numberLinkedList.constEnd(),
  1589. &Number::toInt,
  1590. IntSumReduce());
  1591. QCOMPARE(sum2, 6);
  1592. int sum3 = QtConcurrent::blockingMappedReduced<int>(QLinkedList<Number>(numberLinkedList),
  1593. &Number::toInt,
  1594. IntSumReduce());
  1595. QCOMPARE(sum3, 6);
  1596. }
  1597. // member-member
  1598. {
  1599. QList<int> list2 = QtConcurrent::blockingMappedReduced(numberList,
  1600. &Number::toInt,
  1601. &QList<int>::push_back,
  1602. OrderedReduce);
  1603. QCOMPARE(list2, QList<int>() << 1 << 2 << 3);
  1604. QList<int> list3 = QtConcurrent::blockingMappedReduced(numberList.constBegin(),
  1605. numberList.constEnd(),
  1606. &Number::toInt,
  1607. &QList<int>::push_back,
  1608. OrderedReduce);
  1609. QCOMPARE(list3, QList<int>() << 1 << 2 << 3);
  1610. QList<int> list4 = QtConcurrent::blockingMappedReduced(QList<Number>(numberList),
  1611. &Number::toInt,
  1612. &QList<int>::push_back, OrderedReduce);
  1613. QCOMPARE(list4, QList<int>() << 1 << 2 << 3);
  1614. }
  1615. {
  1616. QLinkedList<int> linkedList2 = QtConcurrent::blockingMappedReduced(numberLinkedList,
  1617. &Number::toInt,
  1618. &QLinkedList<int>::append,
  1619. OrderedReduce);
  1620. QCOMPARE(linkedList2, QLinkedList<int>() << 1 << 2 << 3);
  1621. QLinkedList<int> linkedList3 = QtConcurrent::blockingMappedReduced(numberLinkedList.constBegin(),
  1622. numberLinkedList.constEnd(),
  1623. &Number::toInt,
  1624. &QLinkedList<int>::append,
  1625. OrderedReduce);
  1626. QCOMPARE(linkedList3, QLinkedList<int>() << 1 << 2 << 3);
  1627. QLinkedList<int> linkedList4 = QtConcurrent::blockingMappedReduced(QLinkedList<Number>(numberLinkedList),
  1628. &Number::toInt,
  1629. &QLinkedList<int>::append, OrderedReduce);
  1630. QCOMPARE(linkedList4, QLinkedList<int>() << 1 << 2 << 3);
  1631. }
  1632. // function-member
  1633. {
  1634. QList<int> list2 = QtConcurrent::blockingMappedReduced(list,
  1635. intSquare,
  1636. &QList<int>::push_back,
  1637. OrderedReduce);
  1638. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1639. QCOMPARE(list2, QList<int>() << 1 << 4 << 9);
  1640. QList<int> list3 = QtConcurrent::blockingMappedReduced(list.constBegin(),
  1641. list.constEnd(),
  1642. intSquare,
  1643. &QList<int>::push_back,
  1644. OrderedReduce);
  1645. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1646. QCOMPARE(list3, QList<int>() << 1 << 4 << 9);
  1647. QList<int> list4 = QtConcurrent::blockingMappedReduced(QList<int>(list),
  1648. intSquare,
  1649. &QList<int>::push_back,
  1650. OrderedReduce);
  1651. QCOMPARE(list, QList<int>() << 1 << 2 << 3);
  1652. QCOMPARE(list4, QList<int>() << 1 << 4 << 9);
  1653. }
  1654. {
  1655. QLinkedList<int> linkedList2 = QtConcurrent::blockingMappedReduced(linkedList,
  1656. intSquare,
  1657. &QLinkedList<int>::append,
  1658. OrderedReduce);
  1659. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1660. QCOMPARE(linkedList2, QLinkedList<int>() << 1 << 4 << 9);
  1661. QLinkedList<int> linkedList3 = QtConcurrent::blockingMappedReduced(linkedList.constBegin(),
  1662. linkedList.constEnd(),
  1663. intSquare,
  1664. &QLinkedList<int>::append,
  1665. OrderedReduce);
  1666. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1667. QCOMPARE(linkedList3, QLinkedList<int>() << 1 << 4 << 9);
  1668. QLinkedList<int> linkedList4 = QtConcurrent::blockingMappedReduced(QLinkedList<int>(linkedList),
  1669. intSquare,
  1670. &QLinkedList<int>::append,
  1671. OrderedReduce);
  1672. QCOMPARE(linkedList, QLinkedList<int>() << 1 << 2 << 3);
  1673. QCOMPARE(linkedList4, QLinkedList<int>() << 1 << 4 << 9);
  1674. }
  1675. // member-function
  1676. {
  1677. int sum = QtConcurrent::blockingMappedReduced(numberList,
  1678. &Number::toInt,
  1679. intSumReduce);
  1680. QCOMPARE(sum, 6);
  1681. int sum2 = QtConcurrent::blockingMappedReduced(numberList.constBegin(),
  1682. numberList.constEnd(),
  1683. &Number::toInt,
  1684. intSumReduce);
  1685. QCOMPARE(sum2, 6);
  1686. int sum3 = QtConcurrent::blockingMappedReduced(QList<Number>(numberList),
  1687. &Number::toInt,
  1688. intSumReduce);
  1689. QCOMPARE(sum3, 6);
  1690. }
  1691. {
  1692. int sum = QtConcurrent::blockingMappedReduced(numberLinkedList,
  1693. &Number::toInt,
  1694. intSumReduce);
  1695. QCOMPARE(sum, 6);
  1696. int sum2 = QtConcurrent::blockingMappedReduced(numberLinkedList.constBegin(),
  1697. numberLinkedList.constEnd(),
  1698. &Number::toInt,
  1699. intSumReduce);
  1700. QCOMPARE(sum2, 6);
  1701. int sum3 = QtConcurrent::blockingMappedReduced(QLinkedList<Number>(numberLinkedList),
  1702. &Number::toInt,
  1703. intSumReduce);
  1704. QCOMPARE(sum3, 6);
  1705. }
  1706. // linked lists
  1707. {
  1708. QLinkedList<int> list;
  1709. list << 1 << 2 << 3;
  1710. QLinkedList<Number> numberList;
  1711. numberList << 1 << 2 << 3;
  1712. int sum = QtConcurrent::blockingMappedReduced<int>(list, IntSquare(), IntSumReduce());
  1713. QCOMPARE(sum, 14);
  1714. int sum2 = QtConcurrent::blockingMappedReduced<int>(list.constBegin(),
  1715. list.constEnd(),
  1716. IntSquare(),
  1717. IntSumReduce());
  1718. QCOMPARE(sum2, 14);
  1719. int sum3 = QtConcurrent::blockingMappedReduced<int>(QLinkedList<int>(list), IntSquare(), IntSumReduce());
  1720. QCOMPARE(sum3, 14);
  1721. int sum4 = QtConcurrent::blockingMappedReduced<int>(list, intSquare, intSumReduce);
  1722. QCOMPARE(sum4, 14);
  1723. int sum5 = QtConcurrent::blockingMappedReduced<int>(list.constBegin(),
  1724. list.constEnd(),
  1725. intSquare,
  1726. intSumReduce);
  1727. QCOMPARE(sum5, 14);
  1728. int sum6 = QtConcurrent::blockingMappedReduced<int>(QLinkedList<int>(list),
  1729. intSquare,
  1730. intSumReduce);
  1731. QCOMPARE(sum6, 14);
  1732. }
  1733. // ### the same as above, with an initial result value
  1734. }
  1735. int sleeper(int val)
  1736. {
  1737. QTest::qSleep(100);
  1738. return val;
  1739. }
  1740. void tst_QtConcurrentMap::assignResult()
  1741. {
  1742. const QList<int> startList = QList<int>() << 0 << 1 << 2;
  1743. QList<int> list = QtConcurrent::blockingMapped(startList, sleeper);
  1744. QCOMPARE(list.at(0), 0);
  1745. QCOMPARE(list.at(1), 1);
  1746. }
  1747. int fnConst(const int &i)
  1748. {
  1749. return i;
  1750. }
  1751. int fn(int &i)
  1752. {
  1753. return i;
  1754. }
  1755. QString changeTypeConst(const int &)
  1756. {
  1757. return QString();
  1758. }
  1759. QString changeType(int &)
  1760. {
  1761. return QString();
  1762. }
  1763. int changeTypeQStringListConst(const QStringList &)
  1764. {
  1765. return 0;
  1766. }
  1767. int changeTypeQStringList(QStringList &)
  1768. {
  1769. return 0;
  1770. }
  1771. class MemFnTester
  1772. {
  1773. public:
  1774. MemFnTester() {}
  1775. MemFnTester fn()
  1776. {
  1777. return MemFnTester();
  1778. }
  1779. MemFnTester fnConst() const
  1780. {
  1781. return MemFnTester();
  1782. }
  1783. QString changeType()
  1784. {
  1785. return QString();
  1786. }
  1787. QString changeTypeConst() const
  1788. {
  1789. return QString();
  1790. }
  1791. };
  1792. Q_DECLARE_METATYPE(QVector<MemFnTester>);
  1793. Q_DECLARE_METATYPE(QList<MemFnTester>);
  1794. void tst_QtConcurrentMap::functionOverloads()
  1795. {
  1796. QList<int> intList;
  1797. const QList<int> constIntList;
  1798. QList<MemFnTester> classList;
  1799. const QList<MemFnTester> constMemFnTesterList;
  1800. QtConcurrent::mapped(intList, fnConst);
  1801. QtConcurrent::mapped(constIntList, fnConst);
  1802. QtConcurrent::mapped(classList, &MemFnTester::fnConst);
  1803. QtConcurrent::mapped(constMemFnTesterList, &MemFnTester::fnConst);
  1804. QtConcurrent::blockingMapped<QVector<int> >(intList, fnConst);
  1805. QtConcurrent::blockingMapped<QVector<int> >(constIntList, fnConst);
  1806. QtConcurrent::blockingMapped<QVector<MemFnTester> >(classList, &MemFnTester::fnConst);
  1807. QtConcurrent::blockingMapped<QVector<MemFnTester> >(constMemFnTesterList, &MemFnTester::fnConst);
  1808. QtConcurrent::blockingMapped<QList<QString> >(intList, changeTypeConst);
  1809. QtConcurrent::blockingMapped<QList<QString> >(constIntList, changeTypeConst);
  1810. QtConcurrent::blockingMapped<QList<QString> >(classList, &MemFnTester::changeTypeConst);
  1811. QtConcurrent::blockingMapped<QList<QString> >(constMemFnTesterList, &MemFnTester::changeTypeConst);
  1812. QStringList stringList;
  1813. const QStringList constStringList;
  1814. // QtConcurrent::map(stringList, changeTypeQStringListConst);
  1815. // QtConcurrent::map(intList, changeTypeNonConst);
  1816. // QList<QString>(QtConcurrent::map(constStringList, changeTypeQStringList));
  1817. // QtConcurrent::map(classList, &MemFnTester::changeType);
  1818. // QtConcurrent::map(classList, &MemFnTester::changeTypeConst);
  1819. // QtConcurrent::map(constMemFnTesterList, &MemFnTester::changeTypeConst);
  1820. }
  1821. QAtomicInt currentInstanceCount;
  1822. QAtomicInt peakInstanceCount;
  1823. class InstanceCounter
  1824. {
  1825. public:
  1826. inline InstanceCounter()
  1827. { currentInstanceCount.fetchAndAddRelaxed(1); updatePeak(); }
  1828. inline ~InstanceCounter()
  1829. { currentInstanceCount.fetchAndAddRelaxed(-1);}
  1830. inline InstanceCounter(const InstanceCounter &)
  1831. { currentInstanceCount.fetchAndAddRelaxed(1); updatePeak(); }
  1832. void updatePeak()
  1833. {
  1834. forever {
  1835. const int localPeak = peakInstanceCount;
  1836. const int localCurrent = currentInstanceCount;
  1837. if (localCurrent <= localPeak)
  1838. break;
  1839. if (peakInstanceCount.testAndSetOrdered(localPeak, localCurrent))
  1840. break;
  1841. }
  1842. }
  1843. };
  1844. InstanceCounter slowMap(const InstanceCounter &in)
  1845. {
  1846. QTest::qSleep(2);
  1847. return in;
  1848. }
  1849. InstanceCounter fastMap(const InstanceCounter &in)
  1850. {
  1851. QTest::qSleep(rand() % 2 + 1);
  1852. // qDebug() << "map " << QThread::currentThread();
  1853. return in;
  1854. }
  1855. void slowReduce(int &result, const InstanceCounter&)
  1856. {
  1857. QTest::qSleep(rand() % 4 + 1);
  1858. // qDebug() << "reduce" << QThread::currentThread();
  1859. ++result;
  1860. }
  1861. void fastReduce(int &result, const InstanceCounter&)
  1862. {
  1863. ++result;
  1864. }
  1865. void tst_QtConcurrentMap::throttling()
  1866. {
  1867. const int itemcount = 100;
  1868. const int allowedTemporaries = QThread::idealThreadCount() * 40;
  1869. {
  1870. currentInstanceCount = 0;
  1871. peakInstanceCount = 0;
  1872. QList<InstanceCounter> instances;
  1873. for (int i = 0; i < itemcount; ++i)
  1874. instances.append(InstanceCounter());
  1875. QCOMPARE((int)currentInstanceCount, itemcount);
  1876. int results = QtConcurrent::blockingMappedReduced(instances, slowMap, fastReduce);
  1877. QCOMPARE(results, itemcount);
  1878. qDebug() << (int)currentInstanceCount;
  1879. qDebug() << (int)peakInstanceCount;
  1880. QCOMPARE(int(currentInstanceCount), itemcount);
  1881. QVERIFY(int(peakInstanceCount) < itemcount + allowedTemporaries);
  1882. }
  1883. {
  1884. QCOMPARE(int(currentInstanceCount), 0);
  1885. peakInstanceCount = 0;
  1886. QList<InstanceCounter> instances;
  1887. for (int i = 0; i < itemcount; ++i)
  1888. instances.append(InstanceCounter());
  1889. QCOMPARE(int(currentInstanceCount), itemcount);
  1890. int results = QtConcurrent::blockingMappedReduced(instances, fastMap, slowReduce);
  1891. QCOMPARE(results, itemcount);
  1892. qDebug() << (int)currentInstanceCount;
  1893. qDebug() << (int)peakInstanceCount;
  1894. QCOMPARE((int)currentInstanceCount, itemcount);
  1895. QVERIFY(int(peakInstanceCount) < itemcount + allowedTemporaries);
  1896. }
  1897. }
  1898. #ifndef QT_NO_EXCEPTIONS
  1899. void throwMapper(int &e)
  1900. {
  1901. Q_UNUSED(e);
  1902. throw QtConcurrent::Exception();
  1903. }
  1904. void tst_QtConcurrentMap::exceptions()
  1905. {
  1906. bool caught = false;
  1907. try {
  1908. QList<int> list = QList<int>() << 1 << 2 << 3;
  1909. QtConcurrent::map(list, throwMapper).waitForFinished();
  1910. } catch (Exception &e) {
  1911. caught = true;
  1912. }
  1913. if (!caught)
  1914. QFAIL("did not get exception");
  1915. }
  1916. #endif
  1917. int mapper(const int &i)
  1918. {
  1919. QTest::qWait(1);
  1920. return i;
  1921. }
  1922. void tst_QtConcurrentMap::incrementalResults()
  1923. {
  1924. const int count = 200;
  1925. QList<int> ints;
  1926. for (int i=0; i < count; ++i)
  1927. ints << i;
  1928. QFuture<int> future = QtConcurrent::mapped(ints, mapper);
  1929. QList<int> results;
  1930. while (future.isFinished() == false) {
  1931. for (int i = 0; i < future.resultCount(); ++i) {
  1932. results += future.resultAt(i);
  1933. }
  1934. QTest::qWait(1);
  1935. }
  1936. QCOMPARE(future.isFinished(), true);
  1937. QCOMPARE(future.resultCount(), count);
  1938. QCOMPARE(future.results().count(), count);
  1939. }
  1940. /*
  1941. Test that mapped does not cause deep copies when holding
  1942. references to Qt containers.
  1943. */
  1944. void tst_QtConcurrentMap::noDetatch()
  1945. {
  1946. {
  1947. QList<int> l = QList<int>() << 1;
  1948. QVERIFY(l.isDetached());
  1949. QList<int> ll = l;
  1950. QVERIFY(l.isDetached() == false);
  1951. QtConcurrent::mapped(l, mapper).waitForFinished();
  1952. QVERIFY(l.isDetached() == false);
  1953. QVERIFY(ll.isDetached() == false);
  1954. QtConcurrent::mappedReduced(l, mapper, intSumReduce).waitForFinished();
  1955. QVERIFY(l.isDetached() == false);
  1956. QVERIFY(ll.isDetached() == false);
  1957. QtConcurrent::map(l, multiplyBy2Immutable).waitForFinished();
  1958. QVERIFY(l.isDetached() == true);
  1959. QVERIFY(ll.isDetached() == true);
  1960. }
  1961. {
  1962. const QList<int> l = QList<int>() << 1;
  1963. QVERIFY(l.isDetached());
  1964. const QList<int> ll = l;
  1965. QVERIFY(l.isDetached() == false);
  1966. QtConcurrent::mapped(l, mapper).waitForFinished();
  1967. QVERIFY(l.isDetached() == false);
  1968. QVERIFY(ll.isDetached() == false);
  1969. QtConcurrent::mappedReduced(l, mapper, intSumReduce).waitForFinished();
  1970. QVERIFY(l.isDetached() == false);
  1971. QVERIFY(ll.isDetached() == false);
  1972. }
  1973. }
  1974. void tst_QtConcurrentMap::stlContainers()
  1975. {
  1976. #ifdef QT_NO_STL
  1977. QSKIP("Qt compiled without STL support", SkipAll);
  1978. #else
  1979. std::vector<int> vector;
  1980. vector.push_back(1);
  1981. vector.push_back(2);
  1982. std::vector<int> vector2 = QtConcurrent::blockingMapped<std::vector<int> >(vector, mapper);
  1983. QCOMPARE(vector2.size(), (std::vector<int>::size_type)(2));
  1984. std::list<int> list;
  1985. list.push_back(1);
  1986. list.push_back(2);
  1987. std::list<int> list2 = QtConcurrent::blockingMapped<std::list<int> >(list, mapper);
  1988. QCOMPARE(list2.size(), (std::vector<int>::size_type)(2));
  1989. QtConcurrent::mapped(list, mapper).waitForFinished();
  1990. QtConcurrent::blockingMap(list, multiplyBy2Immutable);
  1991. #endif
  1992. }
  1993. InstanceCounter ic_fn(const InstanceCounter & ic)
  1994. {
  1995. return InstanceCounter(ic);
  1996. };
  1997. // Verify that held results are deleted when a future is
  1998. // assigned over with operator ==
  1999. void tst_QtConcurrentMap::qFutureAssignmentLeak()
  2000. {
  2001. currentInstanceCount = 0;
  2002. peakInstanceCount = 0;
  2003. QFuture<InstanceCounter> future;
  2004. {
  2005. QList<InstanceCounter> list;
  2006. for (int i=0;i<1000;++i)
  2007. list += InstanceCounter();
  2008. future = QtConcurrent::mapped(list, ic_fn);
  2009. future.waitForFinished();
  2010. future = QtConcurrent::mapped(list, ic_fn);
  2011. future.waitForFinished();
  2012. future = QtConcurrent::mapped(list, ic_fn);
  2013. future.waitForFinished();
  2014. }
  2015. QCOMPARE(int(currentInstanceCount), 1000);
  2016. future = QFuture<InstanceCounter>();
  2017. QCOMPARE(int(currentInstanceCount), 0);
  2018. }
  2019. inline void increment(int &num)
  2020. {
  2021. ++num;
  2022. }
  2023. inline int echo(const int &num)
  2024. {
  2025. return num;
  2026. }
  2027. void add(int &result, const int &sum)
  2028. {
  2029. result += sum;
  2030. }
  2031. void tst_QtConcurrentMap::stressTest()
  2032. {
  2033. const int listSize = 1000;
  2034. const int sum = (listSize - 1) * (listSize / 2);
  2035. QList<int> list;
  2036. for (int i = 0; i < listSize; ++i) {
  2037. list.append(i);
  2038. }
  2039. for (int i =0 ; i < 100; ++i) {
  2040. QList<int> result = QtConcurrent::blockingMapped(list, echo);
  2041. for (int j = 0; j < listSize; ++j)
  2042. QCOMPARE(result.at(j), j);
  2043. }
  2044. for (int i = 0 ; i < 100; ++i) {
  2045. int result = QtConcurrent::blockingMappedReduced(list, echo, add);
  2046. QCOMPARE(result, sum);
  2047. }
  2048. for (int i = 0 ; i < 100; ++i) {
  2049. QtConcurrent::map(list, increment).waitForFinished();
  2050. for (int j = 0; j < listSize; ++j)
  2051. QCOMPARE(list.at(j), i + j + 1);
  2052. }
  2053. }
  2054. QTEST_MAIN(tst_QtConcurrentMap)
  2055. #else
  2056. void tst_QtConcurrentMap::map() {}
  2057. void tst_QtConcurrentMap::blocking_map() {}
  2058. void tst_QtConcurrentMap::mapped() {}
  2059. void tst_QtConcurrentMap::blocking_mapped() {}
  2060. void tst_QtConcurrentMap::mappedReduced() {}
  2061. void tst_QtConcurrentMap::blocking_mappedReduced() {}
  2062. void tst_QtConcurrentMap::assignResult() {}
  2063. void tst_QtConcurrentMap::functionOverloads() {}
  2064. #ifndef QT_NO_EXCEPTIONS
  2065. void tst_QtConcurrentMap::exceptions() {}
  2066. #endif
  2067. void tst_QtConcurrentMap::incrementalResults() {}
  2068. void tst_QtConcurrentMap::stressTest() {}
  2069. void tst_QtConcurrentMap::throttling() {}
  2070. void tst_QtConcurrentMap::stlContainers() {}
  2071. void tst_QtConcurrentMap::qFutureAssignmentLeak() { }
  2072. void tst_QtConcurrentMap::noDetatch() {}
  2073. QTEST_NOOP_MAIN
  2074. #endif
  2075. #include "tst_qtconcurrentmap.moc"