Array.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833
  1. #ifndef Array_H
  2. #define Array_H
  3. #include <functional>
  4. #include <stdexcept>
  5. #include "Errors.h"
  6. #include "Iterator.h"
  7. #include "ReferenceCounter.h"
  8. #include "Text.h"
  9. namespace Framework
  10. {
  11. template<class TYP>
  12. //! Ein Eintrag in einer Linked List
  13. struct ArrayEintrag
  14. {
  15. TYP var;
  16. bool set;
  17. ArrayEintrag<TYP>* next;
  18. ArrayEintrag()
  19. : var(),
  20. set(0),
  21. next(0)
  22. {}
  23. //! Setzt den Eintrag auf die Werte des anderen Eintrages
  24. ArrayEintrag& operator=(ArrayEintrag& r)
  25. {
  26. var = r.var;
  27. set = r.set;
  28. next = r.next;
  29. return *this;
  30. }
  31. //! Gibt den aktuell gespeicherten Wert zurück
  32. operator TYP()
  33. {
  34. if (!set)
  35. {
  36. Text err = "Index out of Range Exception File: ";
  37. err += __FILE__;
  38. err += " Line: ";
  39. err += __LINE__;
  40. throw std::out_of_range(err);
  41. }
  42. return var;
  43. }
  44. //! inkrementiert durch die Linked List durch
  45. ArrayEintrag<TYP>& operator++() //! prefix
  46. {
  47. if (!next)
  48. {
  49. ArrayEintrag<TYP> tmp;
  50. tmp.set = 0;
  51. tmp.next = 0;
  52. *this = tmp;
  53. return *this;
  54. }
  55. *this = *next;
  56. return *next;
  57. }
  58. //! inkrementiert durch die Linked List durch
  59. ArrayEintrag<TYP>& operator++(int) //! postfix
  60. {
  61. if (!next)
  62. {
  63. ArrayEintrag<TYP> tmp;
  64. tmp.set = 0;
  65. tmp.next = 0;
  66. *this = tmp;
  67. return *this;
  68. }
  69. *this = *next;
  70. return *next;
  71. }
  72. #ifdef WIN32
  73. # pragma warning(once : 26495)
  74. };
  75. #else
  76. };
  77. #endif
  78. template<class TYP> class ArrayIterator
  79. : public Iterator<TYP, ArrayIterator<TYP>>
  80. {
  81. private:
  82. ArrayEintrag<TYP>* current;
  83. std::function<ArrayEintrag<TYP>*(ArrayEintrag<TYP>* removed)> onRemove;
  84. public:
  85. ArrayIterator(ArrayEintrag<TYP>* start,
  86. std::function<ArrayEintrag<TYP>*(ArrayEintrag<TYP>* removed)>
  87. onRemove)
  88. {
  89. this->onRemove = onRemove;
  90. current = start;
  91. while (current && !current->set)
  92. {
  93. current = current->next;
  94. }
  95. }
  96. ArrayIterator(const ArrayIterator& it)
  97. {
  98. onRemove = it.onRemove;
  99. current = it.current;
  100. }
  101. virtual ~ArrayIterator()
  102. {
  103. current = 0;
  104. }
  105. ArrayIterator<TYP>& operator=(ArrayIterator<TYP> r)
  106. {
  107. onRemove = r.onRemove;
  108. current = r.current;
  109. return *this;
  110. }
  111. bool hasNext() override
  112. {
  113. ArrayEintrag<TYP>* next = current->next;
  114. while (next && !next->set)
  115. {
  116. next = next->next;
  117. }
  118. return next != 0;
  119. }
  120. ArrayIterator<TYP> next() override
  121. {
  122. if (!current)
  123. {
  124. Text err = "Index out of Range Exception File: ";
  125. err += __FILE__;
  126. err += " Line: ";
  127. err += __LINE__;
  128. throw std::out_of_range(err);
  129. }
  130. return ArrayIterator(current->next, onRemove);
  131. }
  132. operator bool() override
  133. {
  134. return current != 0;
  135. }
  136. ArrayIterator<TYP>& operator++() override //! prefix
  137. {
  138. do
  139. {
  140. if (current) current = current->next;
  141. } while (current && !current->set);
  142. return *this;
  143. }
  144. ArrayIterator<TYP> operator++(int) override //! postfix
  145. {
  146. ArrayIterator<TYP> temp(*this);
  147. do
  148. {
  149. if (current) current = current->next;
  150. } while (current && !current->set);
  151. return temp;
  152. }
  153. TYP val() override
  154. {
  155. if (!current || !current->set)
  156. {
  157. Text err = "Index out of Range Exception File: ";
  158. err += __FILE__;
  159. err += " Line: ";
  160. err += __LINE__;
  161. throw std::out_of_range(err);
  162. }
  163. return current->var;
  164. }
  165. void set(TYP val) override
  166. {
  167. if (current)
  168. {
  169. current->var = val;
  170. current->set = true;
  171. }
  172. else
  173. {
  174. Text err = "Index out of Range Exception File: ";
  175. err += __FILE__;
  176. err += " Line: ";
  177. err += __LINE__;
  178. throw std::out_of_range(err);
  179. }
  180. }
  181. bool operator!=(ArrayIterator<TYP>& r)
  182. {
  183. return current != r.current;
  184. }
  185. void remove() override
  186. {
  187. current = onRemove(current);
  188. }
  189. };
  190. #define _ val()
  191. template<class TYP>
  192. //! Eine Linked List von Klassen, die kein Reference Counting berteiben
  193. class Array : public virtual ReferenceCounter
  194. {
  195. private:
  196. ArrayEintrag<TYP>* entries;
  197. ArrayEintrag<TYP>* last;
  198. int count;
  199. std::function<ArrayEintrag<TYP>*(ArrayEintrag<TYP>* removed)> onRemove;
  200. public:
  201. //! Erstellt eine neue Linked List
  202. Array() noexcept
  203. : ReferenceCounter()
  204. {
  205. entries = new ArrayEintrag<TYP>();
  206. entries->set = 0;
  207. entries->next = 0;
  208. last = entries;
  209. count = 0;
  210. onRemove = [this](ArrayEintrag<TYP>* entry) {
  211. if (!entry) return (ArrayEintrag<TYP>*)0;
  212. if (entry->next)
  213. {
  214. entry->var = entry->next->var;
  215. entry->set = entry->next->set;
  216. }
  217. else
  218. entry->set = 0;
  219. ArrayEintrag<TYP>* del = entry->next;
  220. if (entry->next)
  221. entry->next = entry->next->next;
  222. else
  223. entry->next = 0;
  224. if (del)
  225. {
  226. del->set = 0;
  227. del->next = 0;
  228. if (last == del) last = entry;
  229. delete del;
  230. }
  231. count--;
  232. return entry->set ? entry : 0;
  233. };
  234. }
  235. //! Kopiert eine Linked list
  236. //!
  237. Array(const Array& arr)
  238. : Array()
  239. {
  240. int anz = arr.getEintragAnzahl();
  241. for (int i = 0; i < anz; i++)
  242. add(arr.get(i));
  243. }
  244. //! Leert und löscht die Linked List
  245. ~Array()
  246. {
  247. leeren();
  248. delete entries;
  249. }
  250. //! Hängt ein Element ans Ende der Liste an
  251. //! \param t Das neue Element
  252. void add(TYP t)
  253. {
  254. if (!last->set)
  255. {
  256. last->var = t;
  257. last->set = 1;
  258. count++;
  259. return;
  260. }
  261. last->next = new ArrayEintrag<TYP>();
  262. last = last->next;
  263. last->set = 1;
  264. last->var = t;
  265. count++;
  266. }
  267. //! Fügt ein Element bei einer bestimmten Position in die Liste ein
  268. //! \param t das neue Element
  269. //! \param i Die Position, wo das Element eingefügt wird (danach der
  270. //! Index des neuen Elementes)
  271. void add(TYP t, int i)
  272. {
  273. if (i < 0 || i > count)
  274. throwOutOfRange(__FILE__, __LINE__, i, count);
  275. if (i == count)
  276. {
  277. add(t);
  278. return;
  279. }
  280. ArrayEintrag<TYP>* e = entries;
  281. for (int a = 0; a < i; ++a)
  282. e = e->next;
  283. ArrayEintrag<TYP>* ne = new ArrayEintrag<TYP>();
  284. ne->var = e->var;
  285. ne->set = e->set;
  286. ne->next = e->next;
  287. e->next = ne;
  288. e->var = t;
  289. e->set = 1;
  290. if (last->next) last = last->next;
  291. count++;
  292. }
  293. //! Setzt den Wert des i-ten Eintrags
  294. //! \param t der Neue Wert
  295. //! \param i Der Index des Eintrages der gesetzt werden soll
  296. void set(TYP t, int i)
  297. {
  298. if (i < 0 || i >= count)
  299. throwOutOfRange(__FILE__, __LINE__, i, count);
  300. ArrayEintrag<TYP>* e = entries;
  301. for (int a = 0; a < i; ++a)
  302. e = e->next;
  303. e->var = t;
  304. e->set = 1;
  305. }
  306. //! Verändert die Position des i-ten Elementes in der Liste
  307. //! \param i Der Index des Elementes, welches verschoben werden soll
  308. //! \param p Die Zielposition des Elementes (danach der neue Index des
  309. //! Elementes)
  310. void setPosition(int i, int p)
  311. {
  312. if (i == p) return;
  313. if (i < 0 || p < 0 || i >= count || p >= count)
  314. throwOutOfRange(__FILE__, __LINE__, i, count);
  315. TYP t = get(i);
  316. remove(i);
  317. add(t, p);
  318. }
  319. //! Löscht ein Bestimmtes Element
  320. //! \param i Der Index des Elementes das gelöscht werden soll
  321. void remove(int i)
  322. {
  323. if (i < 0 || i >= count)
  324. throwOutOfRange(__FILE__, __LINE__, i, count);
  325. ArrayEintrag<TYP>* e = entries;
  326. for (int a = 0; a < i; ++a)
  327. e = e->next;
  328. onRemove(e);
  329. }
  330. //! Löscht ein Bestimmtes Element
  331. //! \param i Der Index des Elementes das gelöscht werden soll
  332. void removeValue(TYP value)
  333. {
  334. ArrayEintrag<TYP>* e = entries;
  335. while (e->var != value)
  336. {
  337. if (!e->next) return;
  338. e = e->next;
  339. }
  340. if (!e) return;
  341. if (e->next)
  342. {
  343. e->var = e->next->var;
  344. e->set = e->next->set;
  345. }
  346. else
  347. e->set = 0;
  348. ArrayEintrag<TYP>* del = e->next;
  349. if (e->next)
  350. e->next = e->next->next;
  351. else
  352. e->next = 0;
  353. if (del)
  354. {
  355. del->set = 0;
  356. del->next = 0;
  357. if (last == del) last = e;
  358. delete del;
  359. }
  360. count--;
  361. }
  362. //! Vertauscht zwei Elemente in der Liste
  363. //! \param vi Der Index des ersten Elementes
  364. //! \param ni Der Index des zweiten Elementes
  365. void tausch(int vi, int ni)
  366. {
  367. TYP tmp = get(ni);
  368. set(get(vi), ni);
  369. set(tmp, vi);
  370. }
  371. //! Löscht alle Elemente der Liste
  372. void leeren()
  373. {
  374. ArrayEintrag<TYP>* e2 = 0;
  375. for (ArrayEintrag<TYP>* e = entries; e; e = e->next)
  376. {
  377. delete e2;
  378. e2 = e;
  379. }
  380. delete e2;
  381. entries = new ArrayEintrag<TYP>();
  382. entries->set = 0;
  383. entries->next = 0;
  384. last = entries;
  385. count = 0;
  386. }
  387. //! Gibt einen Iterator zurück.
  388. //! Mit ++ kann durch die Liste iteriert werden
  389. ArrayIterator<TYP> begin() const
  390. {
  391. return ArrayIterator<TYP>(entries, onRemove);
  392. }
  393. ArrayIterator<TYP> end() const
  394. {
  395. return ArrayIterator<TYP>(0, onRemove);
  396. }
  397. //! Gibt zurück, wie viele Elemente in der Liste sind
  398. int getEintragAnzahl() const
  399. {
  400. return count;
  401. }
  402. //! Gibt den Wert des i-ten Elementes zurück
  403. //! \param i Der index des gesuchten Elementes
  404. //! throws:
  405. //! \param std:out_of_range wenn i < 0 oder i >= getEintragAnzahl()
  406. TYP get(int i) const
  407. {
  408. if (i < 0 || i >= count)
  409. throwOutOfRange(__FILE__, __LINE__, i, count);
  410. ArrayEintrag<TYP>* e = entries;
  411. for (int a = 0; a < i && e; ++a)
  412. e = e->next;
  413. return e->var;
  414. }
  415. //! Überprüft, ob ein Element in der Liste enthalten ist
  416. //! \param i Der Index des gesuchten Elementes
  417. //! \return (true), wenn der Index vorhanden ist. (false) sonnst
  418. bool hat(int i) const
  419. {
  420. return i >= 0 && i < count;
  421. }
  422. //! Gibt den Index eines Wertes zurück
  423. //! \param t Der Wert, nach dem gesucht werden soll
  424. int getWertIndex(TYP t) const
  425. {
  426. int ret = 0;
  427. for (ArrayEintrag<TYP>* e = entries; e; e = e->next)
  428. {
  429. if (e->set && e->var == t) return ret;
  430. ++ret;
  431. }
  432. return -1;
  433. }
  434. bool anyMatch(std::function<bool(const TYP element)> predicate) const
  435. {
  436. for (TYP t : *this)
  437. {
  438. if (predicate(t)) return 1;
  439. }
  440. return 0;
  441. }
  442. bool allMatch(std::function<bool(const TYP element)> predicate) const
  443. {
  444. for (TYP t : *this)
  445. {
  446. if (!predicate(t)) return 0;
  447. }
  448. return 1;
  449. }
  450. int findIndex(std::function<bool(const TYP element)> predicate) const
  451. {
  452. int index = 0;
  453. for (TYP t : *this)
  454. {
  455. if (predicate(t)) return index;
  456. index++;
  457. }
  458. return -1;
  459. }
  460. Array& operator=(const Array& arr)
  461. {
  462. leeren();
  463. int anz = arr.getEintragAnzahl();
  464. for (int i = 0; i < anz; i++)
  465. add(arr.get(i));
  466. return *this;
  467. }
  468. };
  469. template<class TYP>
  470. //! Eine Linked List von Zeigern auf Zeichnunge, die Reference Counting
  471. //! berteiben
  472. class RCArray : public virtual ReferenceCounter
  473. {
  474. private:
  475. ArrayEintrag<TYP*>* entries;
  476. ArrayEintrag<TYP*>* last;
  477. int count;
  478. std::function<ArrayEintrag<TYP*>*(ArrayEintrag<TYP*>* removed)>
  479. onRemove;
  480. public:
  481. //! Erstellt eine neue Linked List
  482. RCArray() noexcept
  483. : ReferenceCounter()
  484. {
  485. entries = new ArrayEintrag<TYP*>();
  486. entries->var = 0;
  487. entries->set = 0;
  488. entries->next = 0;
  489. last = entries;
  490. count = 0;
  491. onRemove = [this](ArrayEintrag<TYP*>* entry) {
  492. if (!entry) return (ArrayEintrag<TYP*>*)0;
  493. if (entry->next)
  494. {
  495. if (entry->set && entry->var) entry->var->release();
  496. entry->var = entry->next->var;
  497. entry->set = entry->next->set;
  498. }
  499. else
  500. {
  501. if (entry->set && entry->var) entry->var->release();
  502. entry->set = 0;
  503. }
  504. ArrayEintrag<TYP*>* del = entry->next;
  505. if (entry->next)
  506. entry->next = entry->next->next;
  507. else
  508. entry->next = 0;
  509. if (del)
  510. {
  511. del->var = 0;
  512. del->set = 0;
  513. del->next = 0;
  514. if (last == del) last = entry;
  515. delete del;
  516. }
  517. count--;
  518. return entry->set ? entry : 0;
  519. };
  520. }
  521. //! Kopiert eine Linked list
  522. RCArray(const RCArray& arr)
  523. : RCArray()
  524. {
  525. int anz = arr.getEintragAnzahl();
  526. for (int i = 0; i < anz; i++)
  527. add(arr.get(i));
  528. }
  529. //! Leert und löscht die Linked List
  530. ~RCArray()
  531. {
  532. leeren();
  533. delete entries;
  534. }
  535. //! Hängt ein Element ans Ende der Liste an
  536. //! \param t Das neue Element
  537. void add(TYP* t)
  538. {
  539. count++;
  540. if (!last->set)
  541. {
  542. last->var = t;
  543. last->set = 1;
  544. return;
  545. }
  546. last->next = new ArrayEintrag<TYP*>();
  547. last = last->next;
  548. last->var = t;
  549. last->set = 1;
  550. }
  551. //! Fügt ein Element bei einer bestimmten Position in die Liste ein
  552. //! \param t das neue Element
  553. //! \param i Die Position, wo das Element eingefügt wird (danach der
  554. //! Index des neuen Elementes)
  555. void add(TYP* t, int i)
  556. {
  557. if (i < 0 || i > count)
  558. throwOutOfRange(__FILE__, __LINE__, i, count);
  559. if (i == count)
  560. {
  561. add(t);
  562. return;
  563. }
  564. ArrayEintrag<TYP*>* e = entries;
  565. for (int a = 0; a < i; ++a)
  566. e = e->next;
  567. ArrayEintrag<TYP*>* ne = new ArrayEintrag<TYP*>();
  568. ne->var = e->var;
  569. ne->set = e->set;
  570. ne->next = e->next;
  571. e->next = ne;
  572. e->var = t;
  573. e->set = 1;
  574. if (last->next) last = last->next;
  575. count++;
  576. }
  577. //! Setzt den Wert des i-ten Eintrags
  578. //! \param t der Neue Wert
  579. //! \param i Der Index des Eintrages der gesetzt werden soll
  580. void set(TYP* t, int i)
  581. {
  582. if (i < 0 || i >= count)
  583. throwOutOfRange(__FILE__, __LINE__, i, count);
  584. ArrayEintrag<TYP*>* e = entries;
  585. for (int a = 0; a < i; ++a)
  586. e = e->next;
  587. if (e->set && e->var) e->var->release();
  588. e->var = t;
  589. e->set = 1;
  590. }
  591. //! Verändert die Position des i-ten Elementes in der Liste
  592. //! \param i Der Index des Elementes, welches verschoben werden soll
  593. //! \param p Die Zielposition des Elementes (danach der neue Index des
  594. //! Elementes)
  595. void setPosition(int i, int p)
  596. {
  597. if (i == p) return;
  598. if (i < 0 || p < 0 || i >= count || p >= count)
  599. throwOutOfRange(__FILE__, __LINE__, i, count);
  600. TYP* t = get(i);
  601. remove(i);
  602. add(t, p);
  603. }
  604. //! Löscht ein Bestimmtes Element
  605. //! \param i Der Index des Elementes das gelöscht werden soll
  606. void remove(int i)
  607. {
  608. if (i < 0 || i >= count)
  609. throwOutOfRange(__FILE__, __LINE__, i, count);
  610. ArrayEintrag<TYP*>* e = entries;
  611. for (int a = 0; a < i; ++a)
  612. e = e->next;
  613. if (e->next)
  614. {
  615. if (e->set && e->var) e->var->release();
  616. e->var = e->next->var;
  617. e->set = e->next->set;
  618. }
  619. else
  620. {
  621. if (e->set && e->var) e->var->release();
  622. e->set = 0;
  623. }
  624. ArrayEintrag<TYP*>* del = e->next;
  625. if (e->next)
  626. e->next = e->next->next;
  627. else
  628. e->next = 0;
  629. if (del)
  630. {
  631. del->set = 0;
  632. del->next = 0;
  633. if (last == del) last = e;
  634. delete del;
  635. }
  636. count--;
  637. }
  638. //! Vertauscht zwei Elemente in der Liste
  639. //! \param vi Der Index des ersten Elementes
  640. //! \param ni Der Index des zweiten Elementes
  641. void tausch(int vi, int ni)
  642. {
  643. if (vi < 0 || ni < 0) return;
  644. TYP* tmp = get(ni);
  645. set(get(vi), ni);
  646. set(tmp, vi);
  647. }
  648. //! Löscht alle Elemente der Liste
  649. void leeren()
  650. {
  651. for (ArrayEintrag<TYP*>* e = entries; e;)
  652. {
  653. if (e && e->var && e->set) e->var->release();
  654. auto tmp = e->next;
  655. delete e;
  656. e = tmp;
  657. }
  658. entries = new ArrayEintrag<TYP*>();
  659. entries->set = 0;
  660. entries->next = 0;
  661. last = entries;
  662. count = 0;
  663. }
  664. //! Gibt einen Iterator zurück.
  665. //! Mit ++ kann durch die Liste iteriert werden
  666. ArrayIterator<TYP*> begin() const
  667. {
  668. return ArrayIterator<TYP*>(entries, onRemove);
  669. }
  670. ArrayIterator<TYP*> end() const
  671. {
  672. return ArrayIterator<TYP*>(0, onRemove);
  673. }
  674. //! Gibt zurück, wie viele Elemente in der Liste sind
  675. int getEintragAnzahl() const
  676. {
  677. return count;
  678. }
  679. int getLastIndex() const
  680. {
  681. return count - 1;
  682. }
  683. //! Gibt den Wert des i-ten Elementes zurück mit erhöhtem Reference
  684. //! Counter \param i Der index des gesuchten Elementes, (0) wenn der
  685. //! Index nicht existiert
  686. TYP* get(int i) const
  687. {
  688. if (i < 0 || i >= count)
  689. throwOutOfRange(__FILE__, __LINE__, i, count);
  690. ArrayEintrag<TYP*>* e = entries;
  691. for (int a = 0; a < i && e; ++a)
  692. e = e->next;
  693. if (e && e->set && e->var)
  694. return dynamic_cast<TYP*>(e->var->getThis());
  695. return (TYP*)0;
  696. }
  697. //! Gibt den Wert des i-ten Elementes zurück ohne erhöhten Reference
  698. //! Counter \param i Der index des gesuchten Elementes, (0) wenn der
  699. //! Index nicht existiert
  700. TYP* z(int i) const //! gibt den index - ten T zurück
  701. {
  702. if (i < 0 || i >= count)
  703. throwOutOfRange(__FILE__, __LINE__, i, count);
  704. ArrayEintrag<TYP*>* e = entries;
  705. for (int a = 0; a < i && e; ++a)
  706. e = e->next;
  707. if (e && e->set && e->var) return (TYP*)e->var;
  708. return (TYP*)0;
  709. }
  710. //! Überprüft, ob ein Element in der Liste enthalten ist
  711. //! \param i Der Index des gesuchten Elementes
  712. //! \return (true), wenn der Index vorhanden ist. (false) sonnst
  713. bool hat(int i) const
  714. {
  715. return i >= 0 && i < count;
  716. }
  717. //! returns the index of the first element that matches zT or -1 if not
  718. //! found
  719. int indexOf(TYP* zT) const
  720. {
  721. int i = 0;
  722. for (TYP* t : *this)
  723. {
  724. if (t == zT) return i;
  725. ++i;
  726. }
  727. return -1;
  728. }
  729. bool anyMatch(std::function<bool(const TYP* zElement)> predicate) const
  730. {
  731. for (TYP* t : *this)
  732. {
  733. if (predicate(t)) return 1;
  734. }
  735. return 0;
  736. }
  737. bool allMatch(std::function<bool(const TYP* zElement)> predicate) const
  738. {
  739. for (TYP* t : *this)
  740. {
  741. if (!predicate(t)) return 0;
  742. }
  743. return 1;
  744. }
  745. int findIndex(std::function<bool(const TYP* zElement)> predicate) const
  746. {
  747. int index = 0;
  748. for (TYP* t : *this)
  749. {
  750. if (predicate(t)) return index;
  751. index++;
  752. }
  753. return -1;
  754. }
  755. RCArray& operator=(const RCArray& arr)
  756. {
  757. leeren();
  758. int anz = arr.getEintragAnzahl();
  759. for (int i = 0; i < anz; i++)
  760. add(arr.get(i));
  761. return *this;
  762. }
  763. };
  764. } // namespace Framework
  765. #endif