LibreOffice Module starmath (master) 1
iterator.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
9
10#include <mathml/iterator.hxx>
11
17namespace mathml
18{
19static inline void deleteElement(SmMlElement* aSmMlElement, void*) { delete aSmMlElement; }
20
21static inline void cloneElement(SmMlElement* aSmMlElement, void* aData)
22{
23 // Prepare data
24 SmMlElement* aNewSmMlElement = new SmMlElement(*aSmMlElement);
25 SmMlElement* aCopyTree = *static_cast<SmMlElement**>(aData);
26
27 // Append data
28 aCopyTree->setSubElement(aCopyTree->getSubElementsCount(), aNewSmMlElement);
29
30 // Prepare for following
31 // If it has sub elements, then it will be the next
32 if (aSmMlElement->getSubElementsCount() != 0)
33 aCopyTree = aNewSmMlElement;
34 else // Otherwise remounts up to where it should be
35 {
36 while (aSmMlElement->getParentElement() != nullptr)
37 {
38 // get parent
39 SmMlElement* pParent = aSmMlElement->getParentElement();
40 aCopyTree = aCopyTree->getParentElement();
41 // was this the last branch ?
42 if (aSmMlElement->getSubElementId() + 1 != pParent->getSubElementsCount())
43 break; // no -> stop going up
44 // Prepare for next round
45 aSmMlElement = pParent;
46 }
47 }
48
49 // Closing extras
50 *static_cast<SmMlElement**>(aData) = aCopyTree;
51}
52
53void SmMlIteratorFree(SmMlElement* pMlElementTree)
54{
55 if (pMlElementTree == nullptr)
56 return;
57 for (size_t i = 0; i < pMlElementTree->getSubElementsCount(); ++i)
58 {
59 SmMlIteratorFree(pMlElementTree->getSubElement(i));
60 }
61 deleteElement(pMlElementTree, nullptr);
62}
63
65{
66 if (pMlElementTree == nullptr)
67 return nullptr;
68 SmMlElement* aDummyElement = new SmMlElement();
69 SmMlIteratorTopToBottom(pMlElementTree, cloneElement, &aDummyElement);
70 SmMlElement* aResultElement = aDummyElement->getSubElement(0);
71 delete aDummyElement;
72 return aResultElement;
73}
74
75} // end namespace mathml
76
77/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
SmMlElement * getParentElement()
Returns the parent element.
Definition: element.hxx:263
void setSubElement(size_t nPos, SmMlElement *aElement)
Sets a given sub element.
Definition: element.cxx:106
SmMlElement * getSubElement(size_t nPos)
Returns a given sub element.
Definition: element.hxx:225
size_t getSubElementId() const
Gets subelement id.
Definition: element.hxx:250
size_t getSubElementsCount() const
Returns the sub elements count.
Definition: element.hxx:218
constexpr OUStringLiteral aData
int i
The purpose of this iterator is to be able to iterate threw an infinite element tree infinite -> as m...
Definition: iterator.cxx:18
void SmMlIteratorFree(SmMlElement *pMlElementTree)
Definition: iterator.cxx:53
static void deleteElement(SmMlElement *aSmMlElement, void *)
Definition: iterator.cxx:19
SmMlElement * SmMlIteratorCopy(SmMlElement *pMlElementTree)
Definition: iterator.cxx:64
void SmMlIteratorTopToBottom(SmMlElement *pMlElementTree, runType aRunType, void *aData)
Definition: iterator.hxx:71
static void cloneElement(SmMlElement *aSmMlElement, void *aData)
Definition: iterator.cxx:21