Array.h 17 KB

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