Array.h 24 KB

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