diff --git a/GUI/coregui/Models/GUIDomainSampleVisitor.cpp b/GUI/coregui/Models/GUIDomainSampleVisitor.cpp index ed2253a5fffd23ce0cd72f4a75804a4ff651801a..2f8c6095b0c9987eadf5ffcd6bf9aa38e3b612f0 100644 --- a/GUI/coregui/Models/GUIDomainSampleVisitor.cpp +++ b/GUI/coregui/Models/GUIDomainSampleVisitor.cpp @@ -78,11 +78,10 @@ SessionItem* GUIDomainSampleVisitor::populateSampleModel(SampleModel* sampleMode if (m_topSampleName.isEmpty()) m_topSampleName = sample.getName().c_str(); - VisitNodesPreorder(sample, *this); - //for (const auto [child, depth, parent]: NodeUtils::progenyPlus(&sample)) { - // setDepth(depth); - // child->accept(this); - //} + for (const auto [child, depth, parent]: NodeUtils::progenyPlus(&sample)) { + setDepth(depth+1); + child->accept(this); + } SessionItem* result = m_levelToParentItem[1]; result->setItemName(m_topSampleName); diff --git a/Param/Node/INodeVisitor.cpp b/Param/Node/INodeVisitor.cpp deleted file mode 100644 index 6e70df009b59d05fb4e1fac38fe723c469efcc23..0000000000000000000000000000000000000000 --- a/Param/Node/INodeVisitor.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit scattering at grazing incidence -// -//! @file Param/Node/INodeVisitor.cpp -//! @brief Implements interface INodeVisitor. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#include "Param/Node/IterationStrategy.h" -#include "Param/Node/NodeIterator.h" - -void VisitNodesPreorder(const INode& node, INodeVisitor& visitor) { - NodeIterator<PreorderStrategy> it(&node); - it.first(); - while (!it.isDone()) { - visitor.setDepth(it.depth()); - const INode* child = it.getCurrent(); - child->accept(&visitor); - it.next(); - } -} diff --git a/Param/Node/INodeVisitor.h b/Param/Node/INodeVisitor.h index 7520a298676527ddce97186b69292c94235277f9..2acf99b0819f038920b4944c476ca08eb0d8d68d 100644 --- a/Param/Node/INodeVisitor.h +++ b/Param/Node/INodeVisitor.h @@ -279,6 +279,4 @@ private: int m_depth; }; -void VisitNodesPreorder(const INode& node, INodeVisitor& visitor); - #endif // BORNAGAIN_PARAM_NODE_INODEVISITOR_H diff --git a/Param/Node/IterationStrategy.cpp b/Param/Node/IterationStrategy.cpp deleted file mode 100644 index 8d3d34f184536756b4f870b8799fa6b11995ec8d..0000000000000000000000000000000000000000 --- a/Param/Node/IterationStrategy.cpp +++ /dev/null @@ -1,49 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit scattering at grazing incidence -// -//! @file Param/Node/IterationStrategy.cpp -//! @brief Implements class IterationStrategy and children. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#include "Param/Node/IterationStrategy.h" -#include "Base/Utils/Assert.h" -#include "Param/Node/NodeIterator.h" - -PreorderStrategy::PreorderStrategy() = default; - -PreorderStrategy* PreorderStrategy::clone() const { - return new PreorderStrategy(); -} - -IteratorMemento PreorderStrategy::first(const INode* p_root) { - IteratorMemento iterator_stack; - iterator_stack.push_state(IteratorState(p_root)); - return iterator_stack; -} - -void PreorderStrategy::next(IteratorMemento& iterator_stack) const { - const INode* node = iterator_stack.getCurrent(); - ASSERT(node); - std::vector<const INode*> children = node->getChildren(); - if (children.size() > 0) { - iterator_stack.push_state(IteratorState(children)); - return; - } - iterator_stack.next(); - while (!iterator_stack.empty() && iterator_stack.get_state().isEnd()) { - iterator_stack.pop_state(); - if (!iterator_stack.empty()) - iterator_stack.next(); - } -} - -bool PreorderStrategy::isDone(IteratorMemento& iterator_stack) const { - return iterator_stack.empty(); -} diff --git a/Param/Node/IterationStrategy.h b/Param/Node/IterationStrategy.h deleted file mode 100644 index 74668675b2ddea78f192fd31abce76aa662c42a9..0000000000000000000000000000000000000000 --- a/Param/Node/IterationStrategy.h +++ /dev/null @@ -1,46 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit scattering at grazing incidence -// -//! @file Param/Node/IterationStrategy.h -//! @brief Defines class IterationStrategy and children. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#ifndef BORNAGAIN_PARAM_NODE_ITERATIONSTRATEGY_H -#define BORNAGAIN_PARAM_NODE_ITERATIONSTRATEGY_H - -class INode; -class IteratorMemento; - -//! Abstract base class for tree traversal strategies, for use in INodeVisitor. -//! -//! For definition of different strategies see https://en.wikipedia.org/wiki/Tree_traversal. - -class IterationStrategy { -public: - virtual IterationStrategy* clone() const = 0; - - virtual IteratorMemento first(const INode* p_root) = 0; - virtual void next(IteratorMemento& iterator_stack) const = 0; - virtual bool isDone(IteratorMemento& iterator_stack) const = 0; -}; - -//! Traverse tree; visit parents before their children. -class PreorderStrategy : public IterationStrategy { -public: - PreorderStrategy(); - - virtual PreorderStrategy* clone() const; - - virtual IteratorMemento first(const INode* p_root); - virtual void next(IteratorMemento& iterator_stack) const; - virtual bool isDone(IteratorMemento& iterator_stack) const; -}; - -#endif // BORNAGAIN_PARAM_NODE_ITERATIONSTRATEGY_H diff --git a/Param/Node/NodeIterator.cpp b/Param/Node/NodeIterator.cpp deleted file mode 100644 index 3ec63f0b68fb18340c8fa917ad2a0e9f25fecb14..0000000000000000000000000000000000000000 --- a/Param/Node/NodeIterator.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit scattering at grazing incidence -// -//! @file Param/Node/NodeIterator.cpp -//! @brief Implements class IteratorState. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#include "Param/Node/NodeIterator.h" - -IteratorState::IteratorState(const INode* single_element) : m_position(0) { - m_samples.push_back(single_element); -} - -IteratorState::IteratorState(std::vector<const INode*> samples) - : m_samples(samples), m_position(0) {} diff --git a/Param/Node/NodeIterator.h b/Param/Node/NodeIterator.h deleted file mode 100644 index afe7857bab7a789f298543a6f873eb6be78c8f68..0000000000000000000000000000000000000000 --- a/Param/Node/NodeIterator.h +++ /dev/null @@ -1,125 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit scattering at grazing incidence -// -//! @file Param/Node/NodeIterator.h -//! @brief Defines classes IteratorState, IteratorMemento and NodeIterator. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#ifndef BORNAGAIN_PARAM_NODE_NODEITERATOR_H -#define BORNAGAIN_PARAM_NODE_NODEITERATOR_H - -#include "Param/Node/INode.h" -#include <ostream> -#include <stack> -#include <vector> - -//! Holds state of iterator at single level for SampleTreeIterator. -//! @ingroup samples_internal - -class IteratorState { -public: - IteratorState(const INode* single_element); - IteratorState(std::vector<const INode*> samples); - - virtual ~IteratorState() {} - - const INode* getCurrent() const { return m_samples[m_position]; } - bool isEnd() const { return m_position >= m_samples.size(); } - void next() { ++m_position; } - - friend std::ostream& operator<<(std::ostream& output_stream, - IteratorState const& iterator_state) { - return output_stream << "memento state " << iterator_state.m_position << " " - << iterator_state.m_samples.size(); - } - -private: - std::vector<const INode*> m_samples; - size_t m_position; - - IteratorState(); -}; - -//! Holds all iterator states encountered for SampleTreeIterator. -//! @ingroup samples_internal - -class IteratorMemento { -public: - IteratorMemento() {} - virtual ~IteratorMemento() {} - - void push_state(const IteratorState& state) { m_state_stack.push(state); } - void pop_state() { m_state_stack.pop(); } - IteratorState& get_state() { return m_state_stack.top(); } - bool empty() const { return m_state_stack.empty(); } - void reset() { - while (!m_state_stack.empty()) - m_state_stack.pop(); - } - const INode* getCurrent() { return m_state_stack.top().getCurrent(); } - void next() { m_state_stack.top().next(); } - size_t size() const { return m_state_stack.size(); } - -protected: - std::stack<IteratorState> m_state_stack; -}; - -//! Iterator through INode tree of objects. -//! -//! Usage example: -//! SampleTreeIterator<Strategy> it(&sample); -//! it.first(); -//! while( !it.is_done() ) { -//! INode *p_sample = it.get_current(); -//! it.next(); -//! } -//! @ingroup samples_internal - -template <class Strategy> class NodeIterator { -public: - NodeIterator(const INode* root); - virtual ~NodeIterator() {} - - void first(); - void next(); - const INode* getCurrent(); - bool isDone() const; - int depth() const; - -protected: - Strategy m_strategy; - IteratorMemento m_memento_itor; - const INode* m_root; -}; - -template <class Strategy> -inline NodeIterator<Strategy>::NodeIterator(const INode* root) : m_root(root) {} - -template <class Strategy> inline void NodeIterator<Strategy>::first() { - m_memento_itor = m_strategy.first(m_root); -} - -template <class Strategy> inline void NodeIterator<Strategy>::next() { - m_strategy.next(m_memento_itor); -} - -template <class Strategy> inline const INode* NodeIterator<Strategy>::getCurrent() { - return m_memento_itor.getCurrent(); -} - -template <class Strategy> inline bool NodeIterator<Strategy>::isDone() const { - return m_memento_itor.size() == 0; -} - -template <class Strategy> inline int NodeIterator<Strategy>::depth() const { - return static_cast<int>(m_memento_itor.size()); -} - -#endif // BORNAGAIN_PARAM_NODE_NODEITERATOR_H diff --git a/auto/Wrap/doxygenParam.i b/auto/Wrap/doxygenParam.i index b111bfa70451d97a29d7043ea66f1fef102b9c29..a777a86bf758b52ee04d38f596d874918b8997fa 100644 --- a/auto/Wrap/doxygenParam.i +++ b/auto/Wrap/doxygenParam.i @@ -1630,10 +1630,10 @@ C++ includes: Unit.h // File: namespace_0d15.xml -// File: namespace_0d25.xml +// File: namespace_0d24.xml -// File: namespace_0d30.xml +// File: namespace_0d29.xml // File: namespaceNodeUtils.xml @@ -1726,14 +1726,7 @@ Returns units of main parameter. "; -// File: INodeVisitor_8cpp.xml -%feature("docstring") VisitNodesPreorder "void VisitNodesPreorder(const INode &node, INodeVisitor &visitor) -"; - - // File: INodeVisitor_8h.xml -%feature("docstring") VisitNodesPreorder "void VisitNodesPreorder(const INode &node, INodeVisitor &visitor) -"; // File: IterationStrategy_8cpp.xml diff --git a/auto/Wrap/libBornAgainParam.py b/auto/Wrap/libBornAgainParam.py index 1bd005bce613afaa9078a8131f09cc2f4135e4de..ccd5a62b6833e3e358e852330bdd8c104d177508 100644 --- a/auto/Wrap/libBornAgainParam.py +++ b/auto/Wrap/libBornAgainParam.py @@ -3491,14 +3491,6 @@ class INodeVisitor(object): # Register INodeVisitor in _libBornAgainParam: _libBornAgainParam.INodeVisitor_swigregister(INodeVisitor) - -def VisitNodesPreorder(node, visitor): - r""" - VisitNodesPreorder(INode node, INodeVisitor visitor) - void VisitNodesPreorder(const INode &node, INodeVisitor &visitor) - - """ - return _libBornAgainParam.VisitNodesPreorder(node, visitor) class IDistribution1D(libBornAgainBase.ICloneable, INode): r""" diff --git a/auto/Wrap/libBornAgainParam_wrap.cpp b/auto/Wrap/libBornAgainParam_wrap.cpp index c4ec55623e15cc279162830a64978ac90bbf82f5..52e2a6cca627deb63db10d156a8ffa3774db2037 100644 --- a/auto/Wrap/libBornAgainParam_wrap.cpp +++ b/auto/Wrap/libBornAgainParam_wrap.cpp @@ -42286,41 +42286,6 @@ SWIGINTERN PyObject *INodeVisitor_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObj return SWIG_Python_InitShadowInstance(args); } -SWIGINTERN PyObject *_wrap_VisitNodesPreorder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - INode *arg1 = 0 ; - INodeVisitor *arg2 = 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - void *argp2 = 0 ; - int res2 = 0 ; - PyObject *swig_obj[2] ; - - if (!SWIG_Python_UnpackTuple(args, "VisitNodesPreorder", 2, 2, swig_obj)) SWIG_fail; - res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_INode, 0 | 0); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VisitNodesPreorder" "', argument " "1"" of type '" "INode const &""'"); - } - if (!argp1) { - SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VisitNodesPreorder" "', argument " "1"" of type '" "INode const &""'"); - } - arg1 = reinterpret_cast< INode * >(argp1); - res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_INodeVisitor, 0 ); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VisitNodesPreorder" "', argument " "2"" of type '" "INodeVisitor &""'"); - } - if (!argp2) { - SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VisitNodesPreorder" "', argument " "2"" of type '" "INodeVisitor &""'"); - } - arg2 = reinterpret_cast< INodeVisitor * >(argp2); - VisitNodesPreorder((INode const &)*arg1,*arg2); - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - SWIGINTERN PyObject *_wrap_IDistribution1D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; IDistribution1D *arg1 = (IDistribution1D *) 0 ; @@ -51455,11 +51420,6 @@ static PyMethodDef SwigMethods[] = { ""}, { "INodeVisitor_swigregister", INodeVisitor_swigregister, METH_O, NULL}, { "INodeVisitor_swiginit", INodeVisitor_swiginit, METH_VARARGS, NULL}, - { "VisitNodesPreorder", _wrap_VisitNodesPreorder, METH_VARARGS, "\n" - "VisitNodesPreorder(INode node, INodeVisitor visitor)\n" - "void VisitNodesPreorder(const INode &node, INodeVisitor &visitor)\n" - "\n" - ""}, { "IDistribution1D_clone", _wrap_IDistribution1D_clone, METH_O, "\n" "IDistribution1D_clone(IDistribution1D self) -> IDistribution1D\n" "virtual IDistribution1D* IDistribution1D::clone() const =0\n"