XML.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. #include "XML.h"
  2. using namespace Framework;
  3. using namespace XML;
  4. // Erstellt ein XML Element
  5. // string: entweder der name des Elements oder ein XML Text der geparsed werden soll
  6. Element::Element( Text string )
  7. : Element( string, 0 )
  8. {}
  9. // Erstellt ein XML Element
  10. // string: entweder der name des Elements oder ein XML Text der geparsed werden soll
  11. // zParent: Ein Zeiger auf das eltern element (ohne erhöhten reference Counter)
  12. Element::Element( Text string, Element *zParent )
  13. {
  14. ref = 1;
  15. children = new RCArray< Element >();
  16. attributes = new RCArray< Text >();
  17. attributeValues = new RCArray< Text >();
  18. text = new Text();
  19. name = new Text();
  20. string.removeWhitespaceAfter( 0 );
  21. string.removeWhitespaceBefore( string.getLength() );
  22. setText( string );
  23. if( string[ 0 ] == '<' && string[ string.getLength() - 1 ] == '>' )
  24. {
  25. string.removeWhitespaceAfter( 1 );
  26. string.removeWhitespaceBefore( string.getLength() - 1 );
  27. int nameEnd = 0;
  28. for( int i = 1; i < string.getLength(); i++ )
  29. {
  30. if( ( string[ i ] < 'a' || string[ i ] > 'z' ) &&
  31. ( string[ i ] < 'A' || string[ i ] > 'Z' ) &&
  32. ( string[ i ] < '0' || string[ i ] > '9' ) )
  33. {
  34. nameEnd = i;
  35. break;
  36. }
  37. }
  38. name->setText( string.getTeilText( 1, nameEnd ) );
  39. if( string.hatAt( string.getLength() - 1 - name->getLength(), name->getText() ) || string[ string.getLength() - 2 ] == '/' )
  40. {
  41. string.removeWhitespaceAfter( nameEnd );
  42. // parse attributes
  43. int start = nameEnd;
  44. while( string[ nameEnd ] != '>' && string[ nameEnd ] != '/' )
  45. {
  46. for( int i = nameEnd + 1; i < string.getLength(); i++ )
  47. {
  48. if( ( string[ i ] < 'a' || string[ i ] > 'z' ) &&
  49. ( string[ i ] < 'A' || string[ i ] > 'Z' ) &&
  50. ( string[ i ] < '0' || string[ i ] > '9' ) )
  51. {
  52. nameEnd = i;
  53. break;
  54. }
  55. }
  56. Text *attrName = string.getTeilText( start, nameEnd );
  57. string.removeWhitespaceAfter( nameEnd );
  58. if( string[ nameEnd ] == '=' )
  59. {
  60. string.removeWhitespaceAfter( nameEnd + 1 );
  61. Text value = "";
  62. if( string[ nameEnd + 1 ] == '"' )
  63. {
  64. bool esc = 0;
  65. start = nameEnd + 2;
  66. for( int i = nameEnd + 2; string[ i ]; i++ )
  67. {
  68. if( string[ i ] == '\\' )
  69. esc = !esc;
  70. if( string[ i ] == '"' && !esc )
  71. {
  72. nameEnd = i + 1;
  73. break;
  74. }
  75. }
  76. value.setText( string.getTeilText( start, nameEnd - 1 ) );
  77. }
  78. if( string[ nameEnd + 1 ] == '\'' )
  79. {
  80. bool esc = 0;
  81. start = nameEnd + 2;
  82. for( int i = nameEnd + 2; string[ i ]; i++ )
  83. {
  84. if( string[ i ] == '\\' )
  85. esc = !esc;
  86. if( string[ i ] == '\'' && !esc )
  87. {
  88. nameEnd = i + 1;
  89. break;
  90. }
  91. }
  92. value.setText( string.getTeilText( start, nameEnd - 1 ) );
  93. }
  94. setAttribute( attrName->getText(), value );
  95. }
  96. else
  97. setAttribute( attrName->getText(), "" );
  98. attrName->release();
  99. string.removeWhitespaceAfter( nameEnd );
  100. start = nameEnd;
  101. }
  102. if( string[ string.getLength() - 2 ] != '/' )
  103. {
  104. string.removeWhitespaceBefore( string.getLength() - 1 - name->getLength() );
  105. if( string[ string.getLength() - 2 - name->getLength() ] == '/' )
  106. {
  107. string.removeWhitespaceBefore( string.getLength() - 2 - name->getLength() );
  108. if( string[ string.getLength() - 3 - name->getLength() ] == '<' )
  109. {
  110. text->setText( string.getTeilText( nameEnd + 1, string.getLength() - 3 - name->getLength() ) );
  111. // parse children
  112. text->removeWhitespaceAfter( 0 );
  113. text->removeWhitespaceBefore( text->getLength() );
  114. if( text->getText()[ 0 ] == '<' && text->getText()[ text->getLength() - 1 ] == '>' )
  115. {
  116. int start = 0;
  117. while( start < text->getLength() )
  118. {
  119. bool esc = 0;
  120. bool inString1 = 0;
  121. bool inString2 = 0;
  122. int poc = 0;
  123. bool lastSlash = 0;
  124. bool lastOpen = 0;
  125. bool openSlash = 0;
  126. for( int i = 0; text->getText()[ i ]; i++ )
  127. {
  128. switch( text->getText()[ i ] )
  129. {
  130. case '\\':
  131. esc = !esc;
  132. lastSlash = 0;
  133. lastOpen = 0;
  134. break;
  135. case '"':
  136. if( !esc && !inString2 )
  137. inString1 = !inString1;
  138. esc = 0;
  139. lastSlash = 0;
  140. lastOpen = 0;
  141. break;
  142. case '\'':
  143. if( !esc && !inString1 )
  144. inString2 = !inString2;
  145. esc = 0;
  146. lastSlash = 0;
  147. lastOpen = 0;
  148. break;
  149. case '<':
  150. if( !inString1 && !inString2 )
  151. {
  152. if( poc == 0 )
  153. lastOpen = 1;
  154. poc++;
  155. }
  156. esc = 0;
  157. lastSlash = 0;
  158. break;
  159. case '/':
  160. if( !inString1 && !inString2 )
  161. {
  162. lastSlash = 1;
  163. if( lastOpen )
  164. openSlash = 1;
  165. }
  166. esc = 0;
  167. lastSlash = 0;
  168. lastOpen = 0;
  169. break;
  170. case '>':
  171. if( !inString1 && !inString2 )
  172. {
  173. poc--;
  174. if( poc == 0 && (lastSlash || openSlash) )
  175. {
  176. Text *str = text->getTeilText( start, i + 1 );
  177. addChild( new Element( str->getText(), this ) );
  178. str->release();
  179. start = i + 1;
  180. }
  181. }
  182. esc = 0;
  183. lastSlash = 0;
  184. openSlash = 0;
  185. break;
  186. default:
  187. esc = 0;
  188. if( text->getText()[ i ] != ' ' && text->getText()[ i ] != '\t' && text->getText()[ i ] != '\r' && text->getText()[ i ] != '\n' )
  189. lastSlash = 0;
  190. }
  191. }
  192. }
  193. }
  194. }
  195. }
  196. }
  197. }
  198. }
  199. parent = zParent;
  200. }
  201. Element::~Element()
  202. {
  203. children->release();
  204. attributes->release();
  205. attributeValues->release();
  206. text->release();
  207. name->release();
  208. }
  209. // ändert ein attribut oder fügt eines hinzu
  210. // attribut: Der Name des Attributes
  211. // value: Der Wert des Attributes
  212. void Element::setAttribute( Text attribut, Text value )
  213. {
  214. for( auto i = attributes->getIterator(), j = attributeValues->getIterator(); i && j; i++, j++ )
  215. {
  216. if( i->istGleich( attribut ) )
  217. {
  218. j->setText( value );
  219. return;
  220. }
  221. }
  222. attributes->add( new Text( attribut ) );
  223. attributeValues->add( new Text( value ) );
  224. }
  225. // entfernt ein attribut
  226. // attribut: Der Name des Attributes
  227. void Element::removeAttribute( Text attribut )
  228. {
  229. for( int i = 0; i < attributes->getEintragAnzahl(); i++ )
  230. {
  231. if( attributes->z( i )->istGleich( attribut ) )
  232. {
  233. attributes->remove( i );
  234. attributeValues->remove( i );
  235. i--;
  236. }
  237. }
  238. }
  239. // fügt ein child hinzu
  240. // child: Das neue Child Element
  241. void Element::addChild( Element *child )
  242. {
  243. child->parent = this;
  244. children->add( child );
  245. }
  246. // entfernt ein child
  247. // zChild: das zu entfernende Child
  248. void Element::removeChild( Element *child )
  249. {
  250. for( int i = 0; i < children->getEintragAnzahl(); i++ )
  251. {
  252. if( children->z( i ) == child )
  253. {
  254. children->remove( i );
  255. i--;
  256. }
  257. }
  258. child->release();
  259. }
  260. // entfernt das i-te child
  261. // i: der Index des childs (bei 0 beginnend)
  262. void Element::removeChild( int i )
  263. {
  264. children->remove( i );
  265. }
  266. // entfernt alle childs
  267. void Element::removeAllChilds()
  268. {
  269. children->leeren();
  270. }
  271. // entfernt eine Liste mit childs
  272. // childs: alle Childs die entfernt werden sollen
  273. void Element::removeChilds( RCArray<Element> *childs )
  274. {
  275. for( auto i = childs->getIterator(); i; i++ )
  276. removeChild( i->getThis() );
  277. childs->release();
  278. }
  279. // entfernt dieses Element vom Eltern element
  280. void Element::remove()
  281. {
  282. if( parent )
  283. parent->removeChild( getThis() );
  284. }
  285. // setzt den Text in dem Element falls es keine childs gibt
  286. // text: dert Text
  287. void Element::setText( Text text )
  288. {
  289. this->text->setText( text );
  290. }
  291. // gibt den Text im Element zurück
  292. Text Element::getText() const
  293. {
  294. return text->getText();
  295. }
  296. // gibt die Anzahl der Childs zurück
  297. int Element::getChildCount() const
  298. {
  299. return children->getEintragAnzahl();
  300. }
  301. // gibt das i-te child zurück
  302. Element *Element::getChild( int i ) const
  303. {
  304. return children->get( i );
  305. }
  306. // gibt das i-te child zurück (ohne erhöhten reference Counter)
  307. Element *Element::zChild( int i ) const
  308. {
  309. return children->z( i );
  310. }
  311. // gibt einen iterator zurück mit dem durch alle childs iteriert werden kann
  312. Iterator< Element* > Element::getChilds() const
  313. {
  314. return children->getIterator();
  315. }
  316. // gibt einen selector zurück der alle childs beinhaltet
  317. Editor Element::selectChildren() const
  318. {
  319. return Editor( children->getThis() );
  320. }
  321. // gibt eine Liste mit childs zurück, die einen bestimmten Namen haben
  322. // name: der name der Childs
  323. Editor Element::selectChildsByName( Text name ) const
  324. {
  325. RCArray< Element > *tmp = new RCArray< Element >();
  326. for( auto i = children->getIterator(); i; i++ )
  327. {
  328. if( i->getName().istGleich( name ) )
  329. tmp->add( i->getThis() );
  330. }
  331. return Editor( tmp );
  332. }
  333. // gibt eine Liste mit childs zurück, die ein bestimmtes Attribut haben
  334. // attribute: der name des Attributes
  335. Editor Element::selectChildsByAttribute( Text attribute ) const
  336. {
  337. RCArray< Element > *tmp = new RCArray< Element >();
  338. for( auto i = children->getIterator(); i; i++ )
  339. {
  340. if( i->hasAttribute( attribute ) )
  341. tmp->add( i->getThis() );
  342. }
  343. return Editor( tmp );
  344. }
  345. // gibt eine Liste mit childs zurück, die ein bestimmtes Attribut mit einem bestimmten wert haben
  346. // attribute: der name des Attributes
  347. // value: der Wert des Attributes
  348. Editor Element::selectChildsByAttribute( Text attribute, Text value ) const
  349. {
  350. RCArray< Element > *tmp = new RCArray< Element >();
  351. for( auto i = children->getIterator(); i; i++ )
  352. {
  353. if( i->hasAttribute( attribute ) && i->getAttributeValue( attribute ).istGleich( value ) )
  354. tmp->add( i->getThis() );
  355. }
  356. return Editor( tmp );
  357. }
  358. // gibt 1 zurück, falls ein Attribut Name existiert, 0 sonnst
  359. bool Element::hasAttribute( Text name ) const
  360. {
  361. for( auto i = attributes->getIterator(); i; i++ )
  362. {
  363. if( i->istGleich( name ) )
  364. return 1;
  365. }
  366. return 0;
  367. }
  368. // gibt die Anzahl der Attribute zurück
  369. int Element::getAttributeCount() const
  370. {
  371. return attributes->getEintragAnzahl();
  372. }
  373. // gibt den Namen des i-ten Attributes zurück
  374. Text Element::getAttributeName( int i ) const
  375. {
  376. return attributes->z( i )->getText();
  377. }
  378. // gibt den Wert des i-ten Attributes zurück
  379. Text Element::getAttributeValue( int i ) const
  380. {
  381. return attributeValues->z( i )->getText();
  382. }
  383. // gibt den Wert eines Attributes zurück
  384. // attribut: Der Name des Attributes
  385. Text Element::getAttributeValue( Text attribut ) const
  386. {
  387. for( auto i = attributes->getIterator(), j = attributeValues->getIterator(); i && j; i++, j++ )
  388. {
  389. if( i->istGleich( name ) )
  390. return j->getText();
  391. }
  392. return "";
  393. }
  394. // gibt einen iterator zurück mit dem durch alle Attribut Namen iteriert werden kann
  395. Iterator< Text* > Element::getAttributeNames() const
  396. {
  397. return attributes->getIterator();
  398. }
  399. // gibt einen iterator zurück mit dem durch alle Attribut Werte iteriert werden kann
  400. Iterator< Text* > Element::getAttributeValues() const
  401. {
  402. return attributeValues->getIterator();
  403. }
  404. // gibt den Namen des Elementes zurück zurück
  405. Text Element::getName() const
  406. {
  407. return name->getText();
  408. }
  409. // erzeugt einen XML Text der dieses Element und alle childs beinhaltet
  410. Text Element::toString() const
  411. {
  412. Text ret = "<";
  413. ret += name->getText();
  414. ret += " ";
  415. for( auto i = attributes->getIterator(), j = attributeValues->getIterator(); i && j; i++, j++ )
  416. {
  417. ret += i->getText();
  418. ret += "=\"";
  419. ret += j->getText();
  420. ret += "\"";
  421. if( i.hasNext() )
  422. ret += " ";
  423. }
  424. if( children->getEintragAnzahl() || text->getLength() )
  425. {
  426. ret += ">";
  427. if( children->getEintragAnzahl() )
  428. {
  429. for( auto i = children->getIterator(); i; i++ )
  430. ret += i->toString();
  431. }
  432. else
  433. ret += text->getText();
  434. ret += "</";
  435. ret += name->getText();
  436. ret += ">";
  437. }
  438. else
  439. ret += "/>";
  440. return ret;
  441. }
  442. // Erzeugt eine Kopie ohne referenzen auf dieses objekt
  443. Element *Element::dublicate() const
  444. {
  445. return new Element( toString() );
  446. }
  447. // erhöht den reference Counter um 1 und gibt this zurück
  448. Element *Element::getThis()
  449. {
  450. ref++;
  451. return this;
  452. }
  453. // verringert den reference Counter um 1 und gibt 0 zurück
  454. Element *Element::release()
  455. {
  456. if( !--ref )
  457. delete this;
  458. return 0;
  459. }
  460. // Erzeugt einen neuen XML Editor mit einer Liste von Objekten die editiert werden sollen
  461. Editor::Editor( RCArray< Element > *elements )
  462. {
  463. this->elements = new RCArray< Element >();
  464. for( auto i = elements->getIterator(); i; i++ )
  465. this->elements->add( i->getThis() );
  466. elements->release();
  467. }
  468. Editor::Editor( const Editor &e )
  469. : Editor( e.elements->getThis() )
  470. {}
  471. Editor::~Editor()
  472. {
  473. elements->release();
  474. }
  475. // ändert ein attribut oder fügt eines hinzu (auf allen elementen in der Liste)
  476. // attribut: Der Name des Attributes
  477. // value: Der Wert des Attributes
  478. void Editor::setAttribute( Text attribut, Text value )
  479. {
  480. for( auto i = elements->getIterator(); i; i++ )
  481. i->setAttribute( attribut, value );
  482. }
  483. // entfernt ein attribut (auf allen elementen in der Liste)
  484. // attribut: Der Name des Attributes
  485. void Editor::removeAttribute( Text attribut )
  486. {
  487. for( auto i = elements->getIterator(); i; i++ )
  488. i->removeAttribute( attribut );
  489. }
  490. // fügt ein child hinzu (auf allen elementen in der Liste)
  491. // child: Das neue Child Element
  492. void Editor::addChild( Element *child )
  493. {
  494. for( auto i = elements->getIterator(); i; i++ )
  495. i->addChild( child->dublicate() );
  496. child->release();
  497. }
  498. // entfernt ein child (auf allen elementen in der Liste)
  499. // zChild: das zu entfernende Child
  500. void Editor::removeChild( Element *child )
  501. {
  502. for( auto i = elements->getIterator(); i; i++ )
  503. i->removeChild( child->getThis() );
  504. child->release();
  505. }
  506. // entfernt das i-te child (auf allen elementen in der Liste)
  507. // i: der Index des childs (bei 0 beginnend)
  508. void Editor::removeChild( int i )
  509. {
  510. for( auto j = elements->getIterator(); j; j++ )
  511. j->removeChild( i );
  512. }
  513. // entfernt alle childs (auf allen elementen in der Liste)
  514. void Editor::removeAllChilds()
  515. {
  516. for( auto i = elements->getIterator(); i; i++ )
  517. i->removeAllChilds();
  518. }
  519. // entfernt eine Liste mit childs (auf allen elementen in der Liste)
  520. // childs: alle Childs die entfernt werden sollen
  521. void Editor::removeChilds( RCArray<Element> *childs )
  522. {
  523. for( auto i = elements->getIterator(); i; i++ )
  524. i->removeChilds( childs->getThis() );
  525. childs->release();
  526. }
  527. // entfernt dieses Element vom Eltern element (auf allen elementen in der Liste)
  528. void Editor::remove()
  529. {
  530. for( auto i = elements->getIterator(); i; i++ )
  531. i->remove();
  532. }
  533. // setzt den Text in dem Element falls es keine childs gibt (auf allen elementen in der Liste)
  534. // text: dert Text
  535. void Editor::setText( Text text )
  536. {
  537. for( auto i = elements->getIterator(); i; i++ )
  538. i->setText( text );
  539. }
  540. // Gibt ein Iterator durch alle Elemente zurück
  541. Iterator<Element *> Editor::getIterator()
  542. {
  543. return elements->getIterator();
  544. }
  545. // gibt einen selector zurück der alle childs beinhaltet
  546. Editor Editor::selectChildren() const
  547. {
  548. RCArray<Element> *list = new RCArray<Element>();
  549. for( auto i = elements->getIterator(); i; i++ )
  550. {
  551. for( auto j = i->selectChildren().getIterator(); j; j++ )
  552. {
  553. list->add( j->getThis() );
  554. }
  555. }
  556. return Editor( list );
  557. }
  558. // gibt einen selector zurück der alle parents beinhaltet
  559. Editor Editor::selectParents() const
  560. {
  561. RCArray<Element> *list = new RCArray<Element>();
  562. for( auto i = elements->getIterator(); i; i++ )
  563. {
  564. if( i->parent )
  565. list->add( i->parent->getThis() );
  566. }
  567. return Editor( list );
  568. }
  569. // gibt eine Liste mit elementen zurück, die einen bestimmten Namen haben
  570. // name: der name der Childs
  571. Editor Editor::whereNameEquals( Text name ) const
  572. {
  573. RCArray<Element> *list = new RCArray<Element>();
  574. for( auto i = elements->getIterator(); i; i++ )
  575. {
  576. if( i->getName().istGleich( name ) )
  577. list->add( i->getThis() );
  578. }
  579. return Editor( list );
  580. }
  581. // gibt eine Liste mit elementen zurück, die ein bestimmtes child haben
  582. // name: der name des childs
  583. Editor Editor::whereChildWithNameExists( Text name ) const
  584. {
  585. RCArray<Element> *list = new RCArray<Element>();
  586. for( auto i = elements->getIterator(); i; i++ )
  587. {
  588. if( i->selectChildsByName( name ).elements->getEintragAnzahl() )
  589. list->add( i->getThis() );
  590. }
  591. return Editor( list );
  592. }
  593. // gibt eine Liste mit elementen zurück, die ein bestimmtes child haben
  594. // attribute: der name des attributes
  595. Editor Editor::whereChildWithAttributeExists( Text attribute ) const
  596. {
  597. RCArray<Element> *list = new RCArray<Element>();
  598. for( auto i = elements->getIterator(); i; i++ )
  599. {
  600. if( i->selectChildsByAttribute( attribute ).elements->getEintragAnzahl() )
  601. list->add( i->getThis() );
  602. }
  603. return Editor( list );
  604. }
  605. // gibt eine Liste mit elementen zurück, die ein bestimmtes child haben
  606. // attribute: der name des attributes
  607. // value: der Wert des Attributes
  608. Editor Editor::whereChildWithAttributeExists( Text attribute, Text value ) const
  609. {
  610. RCArray<Element> *list = new RCArray<Element>();
  611. for( auto i = elements->getIterator(); i; i++ )
  612. {
  613. if( i->selectChildsByAttribute( attribute, value ).elements->getEintragAnzahl() )
  614. list->add( i->getThis() );
  615. }
  616. return Editor( list );
  617. }
  618. // gibt eine Liste mit elementen zurück, die ein bestimmtes Attribut haben
  619. // attribute: der name des Attributes
  620. Editor Editor::whereAttributeExists( Text attribute ) const
  621. {
  622. RCArray<Element> *list = new RCArray<Element>();
  623. for( auto i = elements->getIterator(); i; i++ )
  624. {
  625. if( i->hasAttribute( attribute ) )
  626. list->add( i->getThis() );
  627. }
  628. return Editor( list );
  629. }
  630. // gibt eine Liste mit elementen zurück, die ein bestimmtes Attribut mit einem bestimmten wert haben
  631. // attribute: der name des Attributes
  632. // value: der Wert des Attributes
  633. Editor Editor::whereAttributeEquals( Text attribute, Text value ) const
  634. {
  635. RCArray<Element> *list = new RCArray<Element>();
  636. for( auto i = elements->getIterator(); i; i++ )
  637. {
  638. if( i->hasAttribute( attribute ) && i->getAttributeValue( attribute ).istGleich( value ) )
  639. list->add( i->getThis() );
  640. }
  641. return Editor( list );
  642. }
  643. // Gibt einen Editor zurück welcher nurnoch die Elemente enthält die nicht in e sind
  644. // e: Ein Editor mit elementen die nicht enthalten sein sollen
  645. Editor Editor::without( Editor e ) const
  646. {
  647. RCArray<Element> *list = new RCArray<Element>();
  648. for( auto i = elements->getIterator(); i; i++ )
  649. {
  650. bool found = 0;
  651. for( auto j = e.elements->getIterator(); j; j++ )
  652. found |= i._ == j._;
  653. if( !found )
  654. list->add( i->getThis() );
  655. }
  656. return Editor( list );
  657. }
  658. // Ruft eine funktion für jedes Element auf
  659. // f: die funktion (nimmt als argument ein Element objekt ohne erhöhten reference Counter)
  660. void Editor::forEach( std::function< void( Element * ) > f ) const
  661. {
  662. for( auto i = elements->getIterator(); i; i++ )
  663. {
  664. f( i );
  665. }
  666. }