Array.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843
  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. 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->next; e; e = e->next)
  376. {
  377. delete e2;
  378. e2 = e;
  379. }
  380. delete e2;
  381. entries->set = 0;
  382. entries->next = 0;
  383. last = entries;
  384. count = 0;
  385. }
  386. //! Gibt einen Iterator zurück.
  387. //! Mit ++ kann durch die Liste iteriert werden
  388. ArrayIterator<TYP> begin() const
  389. {
  390. return ArrayIterator<TYP>(entries, onRemove);
  391. }
  392. ArrayIterator<TYP> end() const
  393. {
  394. return ArrayIterator<TYP>(0, onRemove);
  395. }
  396. //! Gibt zurück, wie viele Elemente in der Liste sind
  397. int getEintragAnzahl() const
  398. {
  399. return count;
  400. }
  401. //! Gibt den Wert des i-ten Elementes zurück
  402. //! \param i Der index des gesuchten Elementes
  403. //! throws:
  404. //! \param std:out_of_range wenn i < 0 oder i >= getEintragAnzahl()
  405. TYP get(int i) const
  406. {
  407. if (i < 0 || i >= count)
  408. throwOutOfRange(__FILE__, __LINE__, i, count);
  409. ArrayEintrag<TYP>* e = entries;
  410. for (int a = 0; a < i && e; ++a)
  411. e = e->next;
  412. return e->var;
  413. }
  414. //! Überprüft, ob ein Element in der Liste enthalten ist
  415. //! \param i Der Index des gesuchten Elementes
  416. //! \return (true), wenn der Index vorhanden ist. (false) sonnst
  417. bool hat(int i) const
  418. {
  419. return i >= 0 && i < count;
  420. }
  421. //! Gibt den Index eines Wertes zurück
  422. //! \param t Der Wert, nach dem gesucht werden soll
  423. int getWertIndex(TYP t) const
  424. {
  425. int ret = 0;
  426. for (ArrayEintrag<TYP>* e = entries; e; e = e->next)
  427. {
  428. if (e->set && e->var == t) return ret;
  429. ++ret;
  430. }
  431. return -1;
  432. }
  433. bool anyMatch(std::function<bool(const TYP element)> predicate) const
  434. {
  435. for (TYP t : *this)
  436. {
  437. if (predicate(t)) return 1;
  438. }
  439. return 0;
  440. }
  441. bool allMatch(std::function<bool(const TYP element)> predicate) const
  442. {
  443. for (TYP t : *this)
  444. {
  445. if (!predicate(t)) return 0;
  446. }
  447. return 1;
  448. }
  449. int findIndex(std::function<bool(const TYP element)> predicate) const
  450. {
  451. int index = 0;
  452. for (TYP t : *this)
  453. {
  454. if (predicate(t)) return index;
  455. index++;
  456. }
  457. return -1;
  458. }
  459. Array& operator=(const Array& arr)
  460. {
  461. leeren();
  462. int anz = arr.getEintragAnzahl();
  463. for (int i = 0; i < anz; i++)
  464. add(arr.get(i));
  465. return *this;
  466. }
  467. Stream<TYP> stream()
  468. {
  469. return Stream<TYP>(new IteratorSupplier<TYP>(
  470. new ArrayIterator<TYP>(entries, onRemove)));
  471. }
  472. };
  473. template<class TYP>
  474. //! Eine Linked List von Zeigern auf Zeichnunge, die Reference Counting
  475. //! berteiben
  476. class RCArray : public virtual ReferenceCounter
  477. {
  478. private:
  479. ArrayEintrag<TYP*>* entries;
  480. ArrayEintrag<TYP*>* last;
  481. int count;
  482. std::function<ArrayEintrag<TYP*>*(ArrayEintrag<TYP*>* removed)>
  483. onRemove;
  484. public:
  485. //! Erstellt eine neue Linked List
  486. RCArray() noexcept
  487. : ReferenceCounter()
  488. {
  489. entries = new ArrayEintrag<TYP*>();
  490. entries->var = 0;
  491. entries->set = 0;
  492. entries->next = 0;
  493. last = entries;
  494. count = 0;
  495. onRemove = [this](ArrayEintrag<TYP*>* entry) {
  496. if (!entry) return (ArrayEintrag<TYP*>*)0;
  497. if (entry->next)
  498. {
  499. if (entry->set && entry->var) entry->var->release();
  500. entry->var = entry->next->var;
  501. entry->set = entry->next->set;
  502. }
  503. else
  504. {
  505. if (entry->set && entry->var) entry->var->release();
  506. entry->set = 0;
  507. }
  508. ArrayEintrag<TYP*>* del = entry->next;
  509. if (entry->next)
  510. entry->next = entry->next->next;
  511. else
  512. entry->next = 0;
  513. if (del)
  514. {
  515. del->var = 0;
  516. del->set = 0;
  517. del->next = 0;
  518. if (last == del) last = entry;
  519. delete del;
  520. }
  521. count--;
  522. return entry->set ? entry : 0;
  523. };
  524. }
  525. //! Kopiert eine Linked list
  526. RCArray(const RCArray& arr)
  527. : RCArray()
  528. {
  529. int anz = arr.getEintragAnzahl();
  530. for (int i = 0; i < anz; i++)
  531. add(arr.get(i));
  532. }
  533. //! Leert und löscht die Linked List
  534. ~RCArray()
  535. {
  536. leeren();
  537. delete entries;
  538. }
  539. //! Hängt ein Element ans Ende der Liste an
  540. //! \param t Das neue Element
  541. void add(TYP* t)
  542. {
  543. count++;
  544. if (!last->set)
  545. {
  546. last->var = t;
  547. last->set = 1;
  548. return;
  549. }
  550. last->next = new ArrayEintrag<TYP*>();
  551. last = last->next;
  552. last->var = t;
  553. last->set = 1;
  554. }
  555. //! Fügt ein Element bei einer bestimmten Position in die Liste ein
  556. //! \param t das neue Element
  557. //! \param i Die Position, wo das Element eingefügt wird (danach der
  558. //! Index des neuen Elementes)
  559. void add(TYP* t, int i)
  560. {
  561. if (i < 0 || i > count)
  562. throwOutOfRange(__FILE__, __LINE__, i, count);
  563. if (i == count)
  564. {
  565. add(t);
  566. return;
  567. }
  568. ArrayEintrag<TYP*>* e = entries;
  569. for (int a = 0; a < i; ++a)
  570. e = e->next;
  571. ArrayEintrag<TYP*>* ne = new ArrayEintrag<TYP*>();
  572. ne->var = e->var;
  573. ne->set = e->set;
  574. ne->next = e->next;
  575. e->next = ne;
  576. e->var = t;
  577. e->set = 1;
  578. if (last->next) last = last->next;
  579. count++;
  580. }
  581. //! Setzt den Wert des i-ten Eintrags
  582. //! \param t der Neue Wert
  583. //! \param i Der Index des Eintrages der gesetzt werden soll
  584. void set(TYP* t, int i)
  585. {
  586. if (i < 0 || i >= count)
  587. throwOutOfRange(__FILE__, __LINE__, i, count);
  588. ArrayEintrag<TYP*>* e = entries;
  589. for (int a = 0; a < i; ++a)
  590. e = e->next;
  591. if (e->set && e->var) e->var->release();
  592. e->var = t;
  593. e->set = 1;
  594. }
  595. //! Verändert die Position des i-ten Elementes in der Liste
  596. //! \param i Der Index des Elementes, welches verschoben werden soll
  597. //! \param p Die Zielposition des Elementes (danach der neue Index des
  598. //! Elementes)
  599. void setPosition(int i, int p)
  600. {
  601. if (i == p) return;
  602. if (i < 0 || p < 0 || i >= count || p >= count)
  603. throwOutOfRange(__FILE__, __LINE__, i, count);
  604. TYP* t = get(i);
  605. remove(i);
  606. add(t, p);
  607. }
  608. //! Löscht ein Bestimmtes Element
  609. //! \param i Der Index des Elementes das gelöscht werden soll
  610. void remove(int i)
  611. {
  612. if (i < 0 || i >= count)
  613. throwOutOfRange(__FILE__, __LINE__, i, count);
  614. ArrayEintrag<TYP*>* e = entries;
  615. for (int a = 0; a < i; ++a)
  616. e = e->next;
  617. if (e->next)
  618. {
  619. if (e->set && e->var) e->var->release();
  620. e->var = e->next->var;
  621. e->set = e->next->set;
  622. }
  623. else
  624. {
  625. if (e->set && e->var) e->var->release();
  626. e->set = 0;
  627. }
  628. ArrayEintrag<TYP*>* del = e->next;
  629. if (e->next)
  630. e->next = e->next->next;
  631. else
  632. e->next = 0;
  633. if (del)
  634. {
  635. del->set = 0;
  636. del->next = 0;
  637. if (last == del) last = e;
  638. delete del;
  639. }
  640. count--;
  641. }
  642. //! Vertauscht zwei Elemente in der Liste
  643. //! \param vi Der Index des ersten Elementes
  644. //! \param ni Der Index des zweiten Elementes
  645. void tausch(int vi, int ni)
  646. {
  647. if (vi < 0 || ni < 0) return;
  648. TYP* tmp = get(ni);
  649. set(get(vi), ni);
  650. set(tmp, vi);
  651. }
  652. //! Löscht alle Elemente der Liste
  653. void leeren()
  654. {
  655. for (ArrayEintrag<TYP*>* e = entries->next; e;)
  656. {
  657. if (e && e->var && e->set) e->var->release();
  658. auto tmp = e->next;
  659. delete e;
  660. e = tmp;
  661. }
  662. if (entries && entries->var && entries->set)
  663. entries->var->release();
  664. entries->set = 0;
  665. entries->next = 0;
  666. last = entries;
  667. count = 0;
  668. }
  669. //! Gibt einen Iterator zurück.
  670. //! Mit ++ kann durch die Liste iteriert werden
  671. ArrayIterator<TYP*> begin() const
  672. {
  673. return ArrayIterator<TYP*>(entries, onRemove);
  674. }
  675. ArrayIterator<TYP*> end() const
  676. {
  677. return ArrayIterator<TYP*>(0, onRemove);
  678. }
  679. //! Gibt zurück, wie viele Elemente in der Liste sind
  680. int getEintragAnzahl() const
  681. {
  682. return count;
  683. }
  684. int getLastIndex() const
  685. {
  686. return count - 1;
  687. }
  688. //! Gibt den Wert des i-ten Elementes zurück mit erhöhtem Reference
  689. //! Counter \param i Der index des gesuchten Elementes, (0) wenn der
  690. //! Index nicht existiert
  691. TYP* get(int i) const
  692. {
  693. if (i < 0 || i >= count)
  694. throwOutOfRange(__FILE__, __LINE__, i, count);
  695. ArrayEintrag<TYP*>* e = entries;
  696. for (int a = 0; a < i && e; ++a)
  697. e = e->next;
  698. if (e && e->set && e->var)
  699. return dynamic_cast<TYP*>(e->var->getThis());
  700. return (TYP*)0;
  701. }
  702. //! Gibt den Wert des i-ten Elementes zurück ohne erhöhten Reference
  703. //! Counter \param i Der index des gesuchten Elementes, (0) wenn der
  704. //! Index nicht existiert
  705. TYP* z(int i) const //! gibt den index - ten T zurück
  706. {
  707. if (i < 0 || i >= count)
  708. throwOutOfRange(__FILE__, __LINE__, i, count);
  709. ArrayEintrag<TYP*>* e = entries;
  710. for (int a = 0; a < i && e; ++a)
  711. e = e->next;
  712. if (e && e->set && e->var) return (TYP*)e->var;
  713. return (TYP*)0;
  714. }
  715. //! Überprüft, ob ein Element in der Liste enthalten ist
  716. //! \param i Der Index des gesuchten Elementes
  717. //! \return (true), wenn der Index vorhanden ist. (false) sonnst
  718. bool hat(int i) const
  719. {
  720. return i >= 0 && i < count;
  721. }
  722. //! returns the index of the first element that matches zT or -1 if not
  723. //! found
  724. int indexOf(TYP* zT) const
  725. {
  726. int i = 0;
  727. for (TYP* t : *this)
  728. {
  729. if (t == zT) return i;
  730. ++i;
  731. }
  732. return -1;
  733. }
  734. bool anyMatch(std::function<bool(const TYP* zElement)> predicate) const
  735. {
  736. for (TYP* t : *this)
  737. {
  738. if (predicate(t)) return 1;
  739. }
  740. return 0;
  741. }
  742. bool allMatch(std::function<bool(const TYP* zElement)> predicate) const
  743. {
  744. for (TYP* t : *this)
  745. {
  746. if (!predicate(t)) return 0;
  747. }
  748. return 1;
  749. }
  750. int findIndex(std::function<bool(const TYP* zElement)> predicate) const
  751. {
  752. int index = 0;
  753. for (TYP* t : *this)
  754. {
  755. if (predicate(t)) return index;
  756. index++;
  757. }
  758. return -1;
  759. }
  760. RCArray& operator=(const RCArray& arr)
  761. {
  762. leeren();
  763. int anz = arr.getEintragAnzahl();
  764. for (int i = 0; i < anz; i++)
  765. add(arr.get(i));
  766. return *this;
  767. }
  768. Stream<TYP*> stream()
  769. {
  770. return Stream<TYP*>(new IteratorSupplier<TYP*>(
  771. new ArrayIterator<TYP*>(entries, onRemove)));
  772. }
  773. };
  774. } // namespace Framework