From 7dca9d2f994d7df60d225259cec42d1371283f98 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Tue, 3 May 2016 22:04:23 +0200 Subject: [PATCH] make unranked trees use smart pointers --- .../src/arbology/exact/ExactPatternMatch.cpp | 4 +- .../src/arbology/exact/ExactSubtreeMatch.cpp | 4 +- .../src/tree/generate/RandomTreeFactory.cpp | 22 +++--- .../src/tree/common/TreeFromXMLParser.cpp | 8 +- alib2data/src/tree/common/TreeFromXMLParser.h | 2 +- alib2data/src/tree/ranked/RankedNode.cpp | 15 ++-- alib2data/src/tree/ranked/RankedNode.h | 2 +- alib2data/src/tree/unranked/PrefixBarTree.cpp | 2 +- alib2data/src/tree/unranked/UnrankedNode.cpp | 79 +++++-------------- alib2data/src/tree/unranked/UnrankedNode.h | 32 ++------ .../unranked/UnrankedNonlinearPattern.cpp | 24 +++--- .../tree/unranked/UnrankedNonlinearPattern.h | 2 +- .../src/tree/unranked/UnrankedPattern.cpp | 26 +++--- alib2data/src/tree/unranked/UnrankedPattern.h | 2 +- alib2data/src/tree/unranked/UnrankedTree.cpp | 26 +++--- alib2data/src/tree/unranked/UnrankedTree.h | 2 +- alib2raw/src/tree/TreeFromRawParser.cpp | 40 +++------- alib2raw/src/tree/TreeFromRawParser.h | 3 +- alib2str/src/tree/TreeFromStringParser.cpp | 40 +++++----- alib2str/src/tree/TreeFromStringParser.h | 2 +- alib2str/src/tree/TreeToStringComposer.cpp | 4 +- astat2/src/TreeStat.cpp | 6 +- 22 files changed, 129 insertions(+), 218 deletions(-) diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp index aa2738b21a..31342bff37 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp +++ b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp @@ -36,7 +36,7 @@ bool ExactPatternMatch::matchHelper ( const tree::UnrankedNode & subject, const if ( subject.getChildren ( ).size ( ) != pattern.getChildren ( ).size ( ) ) return false; - for ( const std::tuple < const tree::UnrankedNode *, const tree::UnrankedNode * > & childs : std::make_tuple_foreach ( subject.getChildren ( ), pattern.getChildren ( ) ) ) + for ( const std::tuple < std::smart_ptr < const tree::UnrankedNode >, std::smart_ptr < const tree::UnrankedNode > > & childs : std::make_tuple_foreach ( subject.getChildren ( ), pattern.getChildren ( ) ) ) if ( !matchHelper ( * std::get < 0 > ( childs ), * std::get < 1 > ( childs ), subtreeVariable ) ) return false; return true; @@ -81,7 +81,7 @@ void ExactPatternMatch::matchInternal ( unsigned & index, std::set < unsigned > index++; - for ( const tree::UnrankedNode * child : subject.getChildren ( ) ) + for ( const std::smart_ptr < const tree::UnrankedNode > & child : subject.getChildren ( ) ) matchInternal ( index, occ, * child, pattern, subtreeVariable ); } diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp b/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp index c3aae2a0d2..07388e8bed 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp +++ b/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp @@ -27,7 +27,7 @@ bool ExactSubtreeMatch::matchHelper ( const tree::UnrankedNode & subject, const if ( subject.getChildren ( ).size ( ) != pattern.getChildren ( ).size ( ) ) return false; - for ( const std::tuple < const tree::UnrankedNode *, const tree::UnrankedNode * > & childs : std::make_tuple_foreach ( subject.getChildren ( ), pattern.getChildren ( ) ) ) + for ( const std::tuple < std::smart_ptr < const tree::UnrankedNode >, std::smart_ptr < const tree::UnrankedNode > > & childs : std::make_tuple_foreach ( subject.getChildren ( ), pattern.getChildren ( ) ) ) if ( !matchHelper ( * std::get < 0 > ( childs ), * std::get < 1 > ( childs ) ) ) return false; return true; @@ -48,7 +48,7 @@ void ExactSubtreeMatch::matchInternal ( unsigned & index, std::set < unsigned > index++; - for ( const tree::UnrankedNode * child : subject.getChildren ( ) ) + for ( const std::smart_ptr < const tree::UnrankedNode > & child : subject.getChildren ( ) ) matchInternal ( index, occ, * child, pattern ); } diff --git a/alib2algo/src/tree/generate/RandomTreeFactory.cpp b/alib2algo/src/tree/generate/RandomTreeFactory.cpp index d0cd078eb3..4ae101b37f 100644 --- a/alib2algo/src/tree/generate/RandomTreeFactory.cpp +++ b/alib2algo/src/tree/generate/RandomTreeFactory.cpp @@ -105,31 +105,31 @@ struct Node { } } - UnrankedNode * createUnrankedNode ( ) { - std::vector < UnrankedNode * > children; + UnrankedNode createUnrankedNode ( ) { + std::vector < std::smart_ptr < UnrankedNode > > children; Node * nextChild = child; for ( int i = 0; i < rank; i++ ) { - children.push_back ( nextChild->createUnrankedNode ( ) ); + children.emplace_back ( std::make_smart < UnrankedNode > ( nextChild->createUnrankedNode ( ) ) ); nextChild = nextChild->right; } - return new UnrankedNode ( alphabet::symbolFrom ( symbol ), children ); + return UnrankedNode ( alphabet::symbolFrom ( symbol ), std::move ( children ) ); } - UnrankedNode * createUnrankedPatternNode ( ) { + UnrankedNode createUnrankedPatternNode ( ) { if ( rank == 0 ) { - return new UnrankedNode ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), { } ); + return UnrankedNode ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), { } ); } else { - std::vector < UnrankedNode * > children; + std::vector < std::smart_ptr < UnrankedNode > > children; Node * nextChild = child; for ( int i = 0; i < rank; i++ ) { - children.push_back ( nextChild->createUnrankedPatternNode ( ) ); + children.emplace_back ( std::make_smart < UnrankedNode > ( nextChild->createUnrankedPatternNode ( ) ) ); nextChild = nextChild->right; } - return new UnrankedNode ( alphabet::symbolFrom ( symbol ), children ); + return UnrankedNode ( alphabet::symbolFrom ( symbol ), std::move ( children ) ); } } @@ -274,7 +274,7 @@ UnrankedTree RandomTreeFactory::generateUnrankedTree ( int depth, int nodesCount for ( std::vector < char >::const_iterator it = alphabet.begin ( ); it != alphabet.end ( ); ++it ) treeAlphabet.insert ( alphabet::symbolFrom ( * it ) ); - UnrankedTree tree ( treeAlphabet, * std::move ( root->createUnrankedNode ( ) ) ); + UnrankedTree tree ( treeAlphabet, std::move ( root->createUnrankedNode ( ) ) ); delete root; return tree; } @@ -292,7 +292,7 @@ UnrankedPattern RandomTreeFactory::generateUnrankedPattern ( int depth, int node alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); treeAlphabet.insert ( subtreeWildcard ); - UnrankedPattern tree ( std::move ( subtreeWildcard ), treeAlphabet, * std::move ( root->createUnrankedPatternNode ( ) ) ); + UnrankedPattern tree ( std::move ( subtreeWildcard ), treeAlphabet, std::move ( root->createUnrankedPatternNode ( ) ) ); delete root; return tree; } diff --git a/alib2data/src/tree/common/TreeFromXMLParser.cpp b/alib2data/src/tree/common/TreeFromXMLParser.cpp index 79f8383925..11aa1a1c3f 100644 --- a/alib2data/src/tree/common/TreeFromXMLParser.cpp +++ b/alib2data/src/tree/common/TreeFromXMLParser.cpp @@ -101,17 +101,17 @@ RankedNode TreeFromXMLParser::parseRankedNode ( std::deque < sax::Token >::itera return RankedNode ( std::move ( symbol ), std::move ( children ) ); } -UnrankedNode * TreeFromXMLParser::parseUnrankedNode ( std::deque < sax::Token >::iterator & input ) { +UnrankedNode TreeFromXMLParser::parseUnrankedNode ( std::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "unrankedNode" ); alphabet::Symbol symbol = alib::xmlApi < alphabet::Symbol >::parse ( input ); - std::vector < UnrankedNode * > children; + std::vector < std::smart_ptr < UnrankedNode > > children; while ( sax::FromXMLParserHelper::isTokenType ( input, sax::Token::TokenType::START_ELEMENT ) ) - children.push_back ( parseUnrankedNode ( input ) ); + children.emplace_back ( std::make_smart< UnrankedNode > ( parseUnrankedNode ( input ) ) ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "unrankedNode" ); - return new UnrankedNode ( std::move ( symbol ), std::move ( children ) ); + return UnrankedNode ( std::move ( symbol ), std::move ( children ) ); } std::set < alphabet::RankedSymbol > TreeFromXMLParser::parseRankedNonlinearVariables ( std::deque < sax::Token >::iterator & input ) { diff --git a/alib2data/src/tree/common/TreeFromXMLParser.h b/alib2data/src/tree/common/TreeFromXMLParser.h index 3aab8d039c..292bf38d22 100644 --- a/alib2data/src/tree/common/TreeFromXMLParser.h +++ b/alib2data/src/tree/common/TreeFromXMLParser.h @@ -25,7 +25,7 @@ namespace tree { class TreeFromXMLParser { public: static RankedNode parseRankedNode ( std::deque < sax::Token >::iterator & input ); - static UnrankedNode * parseUnrankedNode ( std::deque < sax::Token >::iterator & input ); + static UnrankedNode parseUnrankedNode ( std::deque < sax::Token >::iterator & input ); static std::vector < alphabet::RankedSymbol > parseRankedContent ( std::deque < sax::Token >::iterator & input ); static std::vector < alphabet::Symbol > parseUnrankedContent ( std::deque < sax::Token >::iterator & input ); diff --git a/alib2data/src/tree/ranked/RankedNode.cpp b/alib2data/src/tree/ranked/RankedNode.cpp index 6cea1fef7c..74aa02e3a8 100644 --- a/alib2data/src/tree/ranked/RankedNode.cpp +++ b/alib2data/src/tree/ranked/RankedNode.cpp @@ -15,30 +15,27 @@ namespace tree { -RankedNode::RankedNode ( alphabet::RankedSymbol symbol, std::vector < std::smart_ptr < RankedNode > > children ) : symbol ( std::move ( symbol ) ), children ( std::move ( children ) ), alphabet ( NULL ) { +RankedNode::RankedNode ( alphabet::RankedSymbol symbol, std::vector < std::smart_ptr < RankedNode > > children ) : symbol ( std::move ( symbol ) ), children ( std::move ( children ) ), parent ( NULL ), alphabet ( NULL ) { if ( this->children.size ( ) != this->symbol.getRank ( ).getData ( ) ) throw TreeException ( "Number of children doesn't match the rank of the symbol" ); for ( std::smart_ptr < RankedNode > & element : this->children ) element->parent = this; this->attachAlphabet ( NULL ); - this->parent = NULL; } -RankedNode::RankedNode ( const RankedNode & other ) : symbol ( other.symbol ), children ( other.children ), alphabet ( NULL ) { +RankedNode::RankedNode ( const RankedNode & other ) : symbol ( other.symbol ), children ( other.children ), parent ( NULL ), alphabet ( NULL ) { for ( std::smart_ptr < RankedNode > & element : this->children ) element->parent = this; this->attachAlphabet ( NULL ); - this->parent = NULL; } -RankedNode::RankedNode ( RankedNode && other ) noexcept : symbol ( std::move ( other.symbol ) ), children ( std::move ( other.children ) ), alphabet ( NULL ) { +RankedNode::RankedNode ( RankedNode && other ) noexcept : symbol ( std::move ( other.symbol ) ), children ( std::move ( other.children ) ), parent ( NULL ), alphabet ( NULL ) { for ( std::smart_ptr < RankedNode > & element : this->children ) element->parent = this; this->attachAlphabet ( NULL ); - this->parent = NULL; } RankedNode & RankedNode::operator =( const RankedNode & other ) { @@ -91,7 +88,7 @@ void RankedNode::setSymbol ( alphabet::RankedSymbol symbol ) { } void RankedNode::swap ( RankedNode & other ) { - const std::set < alphabet::RankedSymbol > * thisParentTree = this->alphabet; + const std::set < alphabet::RankedSymbol > * thisParentTree = this->alphabet; const std::set < alphabet::RankedSymbol > * otherParentTree = other.alphabet; RankedNode tmp = std::move ( other ); @@ -104,10 +101,10 @@ void RankedNode::swap ( RankedNode & other ) { } UnrankedNode RankedNode::asUnranked ( ) const { - std::vector < UnrankedNode * > unrankedChildren; + std::vector < std::smart_ptr < UnrankedNode > > unrankedChildren; for ( const std::smart_ptr < const RankedNode > & child : this->getChildren() ) - unrankedChildren.push_back ( new UnrankedNode ( child->asUnranked ( ) ) ); + unrankedChildren.emplace_back ( std::make_smart < UnrankedNode > ( child->asUnranked ( ) ) ); return UnrankedNode ( this->symbol.getSymbol ( ), std::move ( unrankedChildren ) ); } diff --git a/alib2data/src/tree/ranked/RankedNode.h b/alib2data/src/tree/ranked/RankedNode.h index a441bdb545..6709235867 100644 --- a/alib2data/src/tree/ranked/RankedNode.h +++ b/alib2data/src/tree/ranked/RankedNode.h @@ -8,10 +8,10 @@ #ifndef RANKED_NODE_H_ #define RANKED_NODE_H_ -#include "../../alphabet/LabeledSymbol.h" #include "../../alphabet/RankedSymbol.h" #include <vector> #include <set> +#include <XmlApi.hpp> namespace tree { diff --git a/alib2data/src/tree/unranked/PrefixBarTree.cpp b/alib2data/src/tree/unranked/PrefixBarTree.cpp index adec2aa147..be0f5ed2e0 100644 --- a/alib2data/src/tree/unranked/PrefixBarTree.cpp +++ b/alib2data/src/tree/unranked/PrefixBarTree.cpp @@ -44,7 +44,7 @@ PrefixBarTree::PrefixBarTree ( const UnrankedTree & tree ) : PrefixBarTree ( alp void PrefixBarTree::toPrefixBar ( const UnrankedNode & node ) { m_Data.push_back ( node.getSymbol ( ) ); - for ( const UnrankedNode * child : node.getChildren ( ) ) + for ( const std::smart_ptr < const UnrankedNode > & child : node.getChildren ( ) ) toPrefixBar ( * child ); m_Data.push_back ( bar ); diff --git a/alib2data/src/tree/unranked/UnrankedNode.cpp b/alib2data/src/tree/unranked/UnrankedNode.cpp index 59c4a3171e..7163f5d7d5 100644 --- a/alib2data/src/tree/unranked/UnrankedNode.cpp +++ b/alib2data/src/tree/unranked/UnrankedNode.cpp @@ -16,24 +16,21 @@ namespace tree { -UnrankedNode::UnrankedNode ( alphabet::Symbol symbol, std::vector < UnrankedNode * > children ) : symbol ( std::move ( symbol ) ), children ( std::move ( children ) ), alphabet ( NULL ) { +UnrankedNode::UnrankedNode ( alphabet::Symbol symbol, std::vector < std::smart_ptr < UnrankedNode > > children ) : symbol ( std::move ( symbol ) ), children ( std::move ( children ) ), parent ( NULL ), alphabet ( NULL ) { for ( auto & element : this->children ) element->parent = this; this->attachAlphabet ( NULL ); } -UnrankedNode::UnrankedNode ( const UnrankedNode & other ) : symbol ( other.symbol ), alphabet ( NULL ) { - for ( const auto & element : other.children ) - children.push_back ( element->clone ( ) ); - +UnrankedNode::UnrankedNode ( const UnrankedNode & other ) : symbol ( other.symbol ), children ( other.children ), parent ( NULL ), alphabet ( NULL ) { for ( auto & element : this->children ) element->parent = this; this->attachAlphabet ( NULL ); } -UnrankedNode::UnrankedNode ( UnrankedNode && other ) noexcept : symbol ( std::move ( other.symbol ) ), children ( std::move ( other.children ) ), alphabet ( NULL ) { +UnrankedNode::UnrankedNode ( UnrankedNode && other ) noexcept : symbol ( std::move ( other.symbol ) ), children ( std::move ( other.children ) ), parent ( NULL ), alphabet ( NULL ) { other.children.clear ( ); for ( auto & element : this->children ) @@ -65,17 +62,13 @@ UnrankedNode & UnrankedNode::operator =( UnrankedNode && other ) noexcept { } UnrankedNode::~UnrankedNode ( ) noexcept { - for ( auto element : children ) - delete element; - - children.clear ( ); } -const std::vector < const UnrankedNode * > & UnrankedNode::getChildren ( ) const { - return * reinterpret_cast < const std::vector < const UnrankedNode * > * > ( & children ); +const std::vector < std::smart_ptr < const UnrankedNode > > & UnrankedNode::getChildren ( ) const { + return reinterpret_cast < const std::vector < std::smart_ptr < const UnrankedNode > > & > ( children ); } -const std::vector < UnrankedNode * > & UnrankedNode::getChildren ( ) { +const std::vector < std::smart_ptr < UnrankedNode > > & UnrankedNode::getChildren ( ) { return children; } @@ -93,11 +86,9 @@ void UnrankedNode::setSymbol ( alphabet::Symbol symbol ) { if ( ( this->alphabet != NULL ) && ( this->alphabet->count ( this->symbol ) == 0 ) ) throw TreeException ( "Symbol is not in the alphabet" ); } -void UnrankedNode::pushBackChild ( const UnrankedNode & node ) { - UnrankedNode * tmp = node.clone ( ); - - tmp->attachAlphabet ( this->alphabet ); - this->children.push_back ( tmp ); +void UnrankedNode::pushBackChild ( UnrankedNode node ) { + node.attachAlphabet ( this->alphabet ); + this->children.emplace_back ( std::make_smart < UnrankedNode > ( node ) ); } void UnrankedNode::swap ( UnrankedNode & other ) { @@ -113,18 +104,10 @@ void UnrankedNode::swap ( UnrankedNode & other ) { other.attachAlphabet ( otherParentTree ); } -UnrankedNode * UnrankedNode::clone ( ) const { - return new UnrankedNode ( * this ); -} - -UnrankedNode * UnrankedNode::plunder ( ) && { - return new UnrankedNode ( std::move ( * this ) ); -} - RankedNode UnrankedNode::asRanked ( ) const { std::vector < std::smart_ptr < RankedNode > > rankedChildren; - for ( const UnrankedNode * child : this->children ) + for ( const std::smart_ptr < const UnrankedNode > & child : this->getChildren() ) rankedChildren.emplace_back ( std::make_smart < RankedNode > ( child->asRanked ( ) ) ); primitive::Unsigned rank( rankedChildren.size ( ) ); @@ -132,28 +115,12 @@ RankedNode UnrankedNode::asRanked ( ) const { } int UnrankedNode::compare ( const UnrankedNode & other ) const { - std::compare < alphabet::Symbol > comp; - int res = comp ( this->symbol, other.symbol ); - - if ( res != 0 ) return res; + auto first = std::tie ( symbol, getChildren() ); + auto second = std::tie ( other.symbol, other.getChildren() ); - int thisSize = this->children.size ( ); - int otherSize = other.children.size ( ); + std::compare < decltype ( first ) > comp; - if ( thisSize < otherSize ) return -1; - - if ( thisSize > otherSize ) return 1; - - auto thisIter = this->children.begin ( ); - auto otherIter = other.children.begin ( ); - - for ( ; thisIter != this->children.end ( ); ++thisIter, ++otherIter ) { - int res = ( * thisIter )->compare ( * * otherIter ); - - if ( res != 0 ) return res; - } - - return 0; + return comp ( first, second ); } void UnrankedNode::operator >>( std::ostream & out ) const { @@ -168,7 +135,7 @@ std::ostream & operator <<( std::ostream & out, const UnrankedNode & node ) { bool UnrankedNode::testSymbol ( const alphabet::Symbol & symbol ) const { if ( symbol == this->symbol ) return true; - for ( const auto & child : this->children ) + for ( const std::smart_ptr < const UnrankedNode > & child : this->getChildren() ) if ( child->testSymbol ( symbol ) ) return true; return false; @@ -179,7 +146,7 @@ bool UnrankedNode::attachAlphabet ( const std::set < alphabet::Symbol > * alphab this->alphabet = alphabet; - for ( const auto & child : this->children ) + for ( std::smart_ptr < UnrankedNode > & child : this->children ) if ( !child->attachAlphabet ( alphabet ) ) return false; if ( ( this->alphabet != NULL ) && ( this->alphabet->count ( this->symbol ) == 0 ) ) return false; @@ -190,7 +157,7 @@ bool UnrankedNode::attachAlphabet ( const std::set < alphabet::Symbol > * alphab void UnrankedNode::computeMinimalAlphabet ( std::set < alphabet::Symbol > & alphabet ) const { alphabet.insert ( this->symbol ); - for ( const auto & child : this->children ) + for ( const std::smart_ptr < const UnrankedNode > & child : this->getChildren() ) child->computeMinimalAlphabet ( alphabet ); } @@ -229,20 +196,16 @@ void UnrankedNode::nicePrint ( std::ostream & os, const std::string & prefix, co namespace alib { -tree::UnrankedNode * xmlApi < tree::UnrankedNode * >::parse ( std::deque < sax::Token >::iterator & input ) { +tree::UnrankedNode xmlApi < tree::UnrankedNode >::parse ( std::deque < sax::Token >::iterator & input ) { return tree::TreeFromXMLParser::parseUnrankedNode ( input ); } -bool xmlApi < tree::UnrankedNode * >::first ( const std::deque < sax::Token >::const_iterator & ) { +bool xmlApi < tree::UnrankedNode >::first ( const std::deque < sax::Token >::const_iterator & ) { throw tree::TreeException ( "Unimplemented" ); } -void xmlApi < tree::UnrankedNode * >::compose ( std::deque < sax::Token > & output, const tree::UnrankedNode * const & data ) { - tree::TreeToXMLComposer::composeNode ( output, * data ); -} - -void xmlApi < const tree::UnrankedNode * >::compose ( std::deque < sax::Token > & output, const tree::UnrankedNode * const & data ) { - tree::TreeToXMLComposer::composeNode ( output, * data ); +void xmlApi < tree::UnrankedNode >::compose ( std::deque < sax::Token > & output, const tree::UnrankedNode & data ) { + tree::TreeToXMLComposer::composeNode ( output, data ); } } /* namespace alib */ diff --git a/alib2data/src/tree/unranked/UnrankedNode.h b/alib2data/src/tree/unranked/UnrankedNode.h index 3e1653943f..30de24cb55 100644 --- a/alib2data/src/tree/unranked/UnrankedNode.h +++ b/alib2data/src/tree/unranked/UnrankedNode.h @@ -24,7 +24,7 @@ class UnrankedNode { protected: alphabet::Symbol symbol; - std::vector < UnrankedNode * > children; + std::vector < std::smart_ptr < UnrankedNode > > children; UnrankedNode * parent; @@ -44,7 +44,7 @@ protected: void computeMinimalAlphabet ( std::set < alphabet::Symbol > & alphabet ) const; public: - explicit UnrankedNode ( alphabet::Symbol symbol, std::vector < UnrankedNode * > children ); + explicit UnrankedNode ( alphabet::Symbol symbol, std::vector < std::smart_ptr < UnrankedNode > > children ); UnrankedNode ( const UnrankedNode & other ); UnrankedNode ( UnrankedNode && other ) noexcept; @@ -52,16 +52,6 @@ public: UnrankedNode & operator =( UnrankedNode && other ) noexcept; ~UnrankedNode ( ) noexcept; - /** - * @copydoc UnrankedNode::clone() const - */ - UnrankedNode * clone ( ) const; - - /** - * @copydoc UnrankedNode::plunder() const - */ - UnrankedNode * plunder ( ) &&; - /** * @copydoc UnrankedNode::cloneAsUnranked() const */ @@ -75,12 +65,12 @@ public: /** * @return children */ - const std::vector < const UnrankedNode * > & getChildren ( ) const; + const std::vector < std::smart_ptr < const UnrankedNode > > & getChildren ( ) const; /** * @return children */ - const std::vector < UnrankedNode * > & getChildren ( ); + const std::vector < std::smart_ptr < UnrankedNode > > & getChildren ( ); UnrankedNode * getParent ( ); @@ -88,7 +78,7 @@ public: void setSymbol ( alphabet::Symbol symbol ); - void pushBackChild ( const UnrankedNode & node ); + void pushBackChild ( UnrankedNode node ); void swap ( UnrankedNode & other ); @@ -113,7 +103,6 @@ public: friend class UnrankedTree; friend class UnrankedPattern; friend class UnrankedNonlinearPattern; - friend class RankedTree; friend class RankedPattern; }; @@ -123,15 +112,10 @@ public: namespace alib { template < > -struct xmlApi < tree::UnrankedNode * > { - static tree::UnrankedNode * parse ( std::deque < sax::Token >::iterator & input ); +struct xmlApi < tree::UnrankedNode > { + static tree::UnrankedNode parse ( std::deque < sax::Token >::iterator & input ); static bool first ( const std::deque < sax::Token >::const_iterator & input ); - static void compose ( std::deque < sax::Token > & output, const tree::UnrankedNode * const & data ); -}; - -template < > -struct xmlApi < const tree::UnrankedNode * > { - static void compose ( std::deque < sax::Token > & output, const tree::UnrankedNode * const & data ); + static void compose ( std::deque < sax::Token > & output, const tree::UnrankedNode & data ); }; } /* namespace alib */ diff --git a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp index 5b33fe98ec..8732a8fcc8 100644 --- a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp +++ b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp @@ -25,11 +25,11 @@ namespace tree { -UnrankedNonlinearPattern::UnrankedNonlinearPattern ( alphabet::Symbol subtreeWildcard, std::set < alphabet::Symbol > nonlinearVariables, std::set < alphabet::Symbol > alphabet, UnrankedNode pattern ) : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( NULL ) { +UnrankedNonlinearPattern::UnrankedNonlinearPattern ( alphabet::Symbol subtreeWildcard, std::set < alphabet::Symbol > nonlinearVariables, std::set < alphabet::Symbol > alphabet, UnrankedNode pattern ) : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( nullptr ) { setTree ( std::move ( pattern ) ); } -UnrankedNonlinearPattern::UnrankedNonlinearPattern ( alphabet::Symbol subtreeWildcard, std::set < alphabet::Symbol > nonlinearVariables, UnrankedNode pattern ) : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( nonlinearVariables + std::set < alphabet::Symbol > { subtreeWildcard }, nonlinearVariables ), std::make_tuple ( subtreeWildcard ) ), pattern ( NULL ) { +UnrankedNonlinearPattern::UnrankedNonlinearPattern ( alphabet::Symbol subtreeWildcard, std::set < alphabet::Symbol > nonlinearVariables, UnrankedNode pattern ) : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( nonlinearVariables + std::set < alphabet::Symbol > { subtreeWildcard }, nonlinearVariables ), std::make_tuple ( subtreeWildcard ) ), pattern ( nullptr ) { pattern.computeMinimalAlphabet ( accessComponent < GeneralAlphabet > ( ).get ( ) ); setTree ( std::move ( pattern ) ); } @@ -39,13 +39,12 @@ UnrankedNonlinearPattern::UnrankedNonlinearPattern ( alphabet::Symbol subtreeWil setTree ( std::move ( pattern ) ); } -UnrankedNonlinearPattern::UnrankedNonlinearPattern ( const UnrankedNonlinearPattern & other ) : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ), other.getNonlinearVariables ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern->clone ( ) ) { +UnrankedNonlinearPattern::UnrankedNonlinearPattern ( const UnrankedNonlinearPattern & other ) : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ), other.getNonlinearVariables ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern ) { this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) ); } -UnrankedNonlinearPattern::UnrankedNonlinearPattern ( UnrankedNonlinearPattern && other ) noexcept : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ), std::move ( other.accessComponent < NonlinearAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( other.pattern ) { +UnrankedNonlinearPattern::UnrankedNonlinearPattern ( UnrankedNonlinearPattern && other ) noexcept : std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ), std::move ( other.accessComponent < NonlinearAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( std::move ( other.pattern ) ) { this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) ); - other.pattern = NULL; } UnrankedTreeBase * UnrankedNonlinearPattern::clone ( ) const { @@ -75,7 +74,6 @@ UnrankedNonlinearPattern & UnrankedNonlinearPattern::operator =( UnrankedNonline } UnrankedNonlinearPattern::~UnrankedNonlinearPattern ( ) noexcept { - delete pattern; } const UnrankedNode & UnrankedNonlinearPattern::getRoot ( ) const { @@ -87,13 +85,10 @@ UnrankedNode & UnrankedNonlinearPattern::getRoot ( ) { } void UnrankedNonlinearPattern::setTree ( UnrankedNode pattern ) { - delete this->pattern; - this->pattern = std::move ( pattern ).plunder ( ); + this->pattern = std::make_smart < UnrankedNode > ( std::move ( pattern ) ); - if ( !this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) ) ) { - delete this->pattern; + if ( !this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) ) ) throw TreeException ( "Input symbols not in the alphabet." ); - } } void UnrankedNonlinearPattern::operator >>( std::ostream & out ) const { @@ -126,10 +121,9 @@ UnrankedNonlinearPattern UnrankedNonlinearPattern::parse ( std::deque < sax::Tok alphabet::Symbol subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardSymbol ( input ); std::set < alphabet::Symbol > nonlinearVariables = TreeFromXMLParser::parseUnrankedNonlinearVariables ( input ); std::set < alphabet::Symbol > rankedAlphabet = TreeFromXMLParser::parseUnrankedAlphabet ( input ); - UnrankedNode * root = alib::xmlApi < UnrankedNode * >::parse ( input ); - UnrankedNonlinearPattern tree ( std::move ( subtreeWildcardSymbol ), std::move ( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( * root ) ); + UnrankedNode root = alib::xmlApi < UnrankedNode >::parse ( input ); + UnrankedNonlinearPattern tree ( std::move ( subtreeWildcardSymbol ), std::move ( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( root ) ); - delete root; sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, UnrankedNonlinearPattern::XML_TAG_NAME ); return tree; } @@ -139,7 +133,7 @@ void UnrankedNonlinearPattern::compose ( std::deque < sax::Token > & out ) const TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard ( ) ); TreeToXMLComposer::composeNonlinearVariables ( out, getNonlinearVariables ( ) ); TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) ); - alib::xmlApi < UnrankedNode * >::compose ( out, pattern ); + alib::xmlApi < UnrankedNode >::compose ( out, * pattern ); out.emplace_back ( UnrankedNonlinearPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); } diff --git a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.h b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.h index 343e0c17bb..e0e5613756 100644 --- a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.h +++ b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.h @@ -29,7 +29,7 @@ class NonlinearAlphabet; */ class UnrankedNonlinearPattern : public UnrankedTreeBase, public std::Components < UnrankedNonlinearPattern, alphabet::Symbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > { protected: - UnrankedNode * pattern; + std::smart_ptr < UnrankedNode > pattern; public: /** diff --git a/alib2data/src/tree/unranked/UnrankedPattern.cpp b/alib2data/src/tree/unranked/UnrankedPattern.cpp index 9d2dd97b27..bda841f24b 100644 --- a/alib2data/src/tree/unranked/UnrankedPattern.cpp +++ b/alib2data/src/tree/unranked/UnrankedPattern.cpp @@ -25,7 +25,7 @@ namespace tree { -UnrankedPattern::UnrankedPattern ( const RankedPattern & other ) : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::Symbol > { other.getSubtreeWildcard ( ).getSymbol ( ) } ), std::make_tuple ( other.getSubtreeWildcard ( ).getSymbol ( ) ) ), pattern ( new UnrankedNode ( other.getRoot ( ).asUnranked ( ) ) ) { +UnrankedPattern::UnrankedPattern ( const RankedPattern & other ) : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::Symbol > { other.getSubtreeWildcard ( ).getSymbol ( ) } ), std::make_tuple ( other.getSubtreeWildcard ( ).getSymbol ( ) ) ), pattern ( std::make_smart < UnrankedNode > ( other.getRoot ( ).asUnranked ( ) ) ) { std::transform ( other.getAlphabet ( ).begin ( ), other.getAlphabet ( ).end ( ), std::inserter ( accessComponent < GeneralAlphabet > ( ).get ( ), getAlphabet ( ).begin ( ) ), [] ( const alphabet::RankedSymbol & symbol ) { return symbol.getSymbol ( ); } ); @@ -33,22 +33,21 @@ UnrankedPattern::UnrankedPattern ( const RankedPattern & other ) : std::Componen this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) ); } -UnrankedPattern::UnrankedPattern ( alphabet::Symbol subtreeWildcard, std::set < alphabet::Symbol > alphabet, UnrankedNode pattern ) : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( NULL ) { +UnrankedPattern::UnrankedPattern ( alphabet::Symbol subtreeWildcard, std::set < alphabet::Symbol > alphabet, UnrankedNode pattern ) : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( nullptr ) { setTree ( std::move ( pattern ) ); } -UnrankedPattern::UnrankedPattern ( alphabet::Symbol subtreeWildcard, UnrankedNode pattern ) : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::Symbol > { subtreeWildcard } ), std::make_tuple ( subtreeWildcard ) ), pattern ( NULL ) { +UnrankedPattern::UnrankedPattern ( alphabet::Symbol subtreeWildcard, UnrankedNode pattern ) : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::Symbol > { subtreeWildcard } ), std::make_tuple ( subtreeWildcard ) ), pattern ( nullptr ) { pattern.computeMinimalAlphabet ( accessComponent < GeneralAlphabet > ( ).get ( ) ); setTree ( std::move ( pattern ) ); } -UnrankedPattern::UnrankedPattern ( const UnrankedPattern & other ) : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern->clone ( ) ) { +UnrankedPattern::UnrankedPattern ( const UnrankedPattern & other ) : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern ) { this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) ); } -UnrankedPattern::UnrankedPattern ( UnrankedPattern && other ) noexcept : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( other.pattern ) { +UnrankedPattern::UnrankedPattern ( UnrankedPattern && other ) noexcept : std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( std::move ( other.pattern ) ) { this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) ); - other.pattern = NULL; } UnrankedTreeBase * UnrankedPattern::clone ( ) const { @@ -77,7 +76,6 @@ UnrankedPattern & UnrankedPattern::operator =( UnrankedPattern && other ) noexce } UnrankedPattern::~UnrankedPattern ( ) noexcept { - delete pattern; } const UnrankedNode & UnrankedPattern::getRoot ( ) const { @@ -89,13 +87,10 @@ UnrankedNode & UnrankedPattern::getRoot ( ) { } void UnrankedPattern::setTree ( UnrankedNode pattern ) { - delete this->pattern; - this->pattern = std::move ( pattern ).plunder ( ); + this->pattern = std::make_smart < UnrankedNode > ( std::move ( pattern ) ); - if ( !this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) ) ) { - delete this->pattern; + if ( !this->pattern->attachAlphabet ( & ( this->getAlphabet ( ) ) ) ) throw TreeException ( "Input symbols not in the alphabet." ); - } } void UnrankedPattern::operator >>( std::ostream & out ) const { @@ -127,10 +122,9 @@ UnrankedPattern UnrankedPattern::parse ( std::deque < sax::Token >::iterator & i sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, UnrankedPattern::XML_TAG_NAME ); alphabet::Symbol subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardSymbol ( input ); std::set < alphabet::Symbol > rankedAlphabet = TreeFromXMLParser::parseUnrankedAlphabet ( input ); - UnrankedNode * root = alib::xmlApi < UnrankedNode * >::parse ( input ); - UnrankedPattern tree ( std::move ( subtreeWildcardSymbol ), std::move ( rankedAlphabet ), std::move ( * root ) ); + UnrankedNode root = alib::xmlApi < UnrankedNode >::parse ( input ); + UnrankedPattern tree ( std::move ( subtreeWildcardSymbol ), std::move ( rankedAlphabet ), std::move ( root ) ); - delete root; sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, UnrankedPattern::XML_TAG_NAME ); return tree; } @@ -139,7 +133,7 @@ void UnrankedPattern::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( UnrankedPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard ( ) ); TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) ); - alib::xmlApi < UnrankedNode * >::compose ( out, pattern ); + alib::xmlApi < UnrankedNode >::compose ( out, * pattern ); out.emplace_back ( UnrankedPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); } diff --git a/alib2data/src/tree/unranked/UnrankedPattern.h b/alib2data/src/tree/unranked/UnrankedPattern.h index 1965315d37..f720a759c8 100644 --- a/alib2data/src/tree/unranked/UnrankedPattern.h +++ b/alib2data/src/tree/unranked/UnrankedPattern.h @@ -28,7 +28,7 @@ class SubtreeWildcard; */ class UnrankedPattern : public UnrankedTreeBase, public std::Components < UnrankedPattern, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > { protected: - UnrankedNode * pattern; + std::smart_ptr < UnrankedNode > pattern; public: /** diff --git a/alib2data/src/tree/unranked/UnrankedTree.cpp b/alib2data/src/tree/unranked/UnrankedTree.cpp index 8c542527d5..5c1a0f75cb 100644 --- a/alib2data/src/tree/unranked/UnrankedTree.cpp +++ b/alib2data/src/tree/unranked/UnrankedTree.cpp @@ -25,7 +25,7 @@ namespace tree { -UnrankedTree::UnrankedTree ( const RankedTree & other ) : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::Symbol > { } ), std::tuple < > ( ) ), tree ( new UnrankedNode ( other.getRoot ( ).asUnranked ( ) ) ) { +UnrankedTree::UnrankedTree ( const RankedTree & other ) : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::Symbol > { } ), std::tuple < > ( ) ), tree ( std::make_smart < UnrankedNode > ( other.getRoot ( ).asUnranked ( ) ) ) { std::transform ( other.getAlphabet ( ).begin ( ), other.getAlphabet ( ).end ( ), std::inserter ( accessComponent < GeneralAlphabet > ( ).get ( ), getAlphabet ( ).begin ( ) ), [] ( const alphabet::RankedSymbol & symbol ) { return symbol.getSymbol ( ); } ); @@ -33,22 +33,21 @@ UnrankedTree::UnrankedTree ( const RankedTree & other ) : std::Components < Unra this->tree->attachAlphabet ( & ( this->getAlphabet ( ) ) ); } -UnrankedTree::UnrankedTree ( std::set < alphabet::Symbol > alphabet, UnrankedNode tree ) : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ), tree ( NULL ) { +UnrankedTree::UnrankedTree ( std::set < alphabet::Symbol > alphabet, UnrankedNode tree ) : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ), tree ( nullptr ) { setTree ( std::move ( tree ) ); } -UnrankedTree::UnrankedTree ( UnrankedNode tree ) : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::Symbol > { } ), std::tuple < > ( ) ), tree ( NULL ) { +UnrankedTree::UnrankedTree ( UnrankedNode tree ) : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::Symbol > { } ), std::tuple < > ( ) ), tree ( nullptr ) { tree.computeMinimalAlphabet ( accessComponent < GeneralAlphabet > ( ).get ( ) ); setTree ( std::move ( tree ) ); } -UnrankedTree::UnrankedTree ( const UnrankedTree & other ) : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( other.getAlphabet ( ) ), std::tuple < > ( ) ), tree ( other.tree->clone ( ) ) { +UnrankedTree::UnrankedTree ( const UnrankedTree & other ) : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( other.getAlphabet ( ) ), std::tuple < > ( ) ), tree ( other.tree ) { this->tree->attachAlphabet ( & ( this->getAlphabet ( ) ) ); } -UnrankedTree::UnrankedTree ( UnrankedTree && other ) noexcept : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::tuple < > ( ) ), tree ( other.tree ) { +UnrankedTree::UnrankedTree ( UnrankedTree && other ) noexcept : std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ) ), std::tuple < > ( ) ), tree ( std::move ( other.tree ) ) { this->tree->attachAlphabet ( & ( this->getAlphabet ( ) ) ); - other.tree = NULL; } UnrankedTreeBase * UnrankedTree::clone ( ) const { @@ -76,7 +75,6 @@ UnrankedTree & UnrankedTree::operator =( UnrankedTree && other ) noexcept { } UnrankedTree::~UnrankedTree ( ) noexcept { - delete tree; } const UnrankedNode & UnrankedTree::getRoot ( ) const { @@ -88,13 +86,10 @@ UnrankedNode & UnrankedTree::getRoot ( ) { } void UnrankedTree::setTree ( UnrankedNode tree ) { - delete this->tree; - this->tree = std::move ( tree ).plunder ( ); + this->tree = std::make_smart < UnrankedNode > ( std::move ( tree ) ); - if ( !this->tree->attachAlphabet ( & ( this->getAlphabet ( ) ) ) ) { - delete this->tree; + if ( !this->tree->attachAlphabet ( & ( this->getAlphabet ( ) ) ) ) throw TreeException ( "Input symbols not in the alphabet." ); - } } void UnrankedTree::operator >>( std::ostream & out ) const { @@ -125,10 +120,9 @@ const std::string UnrankedTree::XML_TAG_NAME = "UnrankedTree"; UnrankedTree UnrankedTree::parse ( std::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, UnrankedTree::XML_TAG_NAME ); std::set < alphabet::Symbol > rankedAlphabet = TreeFromXMLParser::parseUnrankedAlphabet ( input ); - UnrankedNode * root = alib::xmlApi < UnrankedNode * >::parse ( input ); - UnrankedTree tree ( std::move ( rankedAlphabet ), std::move ( * root ) ); + UnrankedNode root = alib::xmlApi < UnrankedNode >::parse ( input ); + UnrankedTree tree ( std::move ( rankedAlphabet ), std::move ( root ) ); - delete root; sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, UnrankedTree::XML_TAG_NAME ); return tree; } @@ -136,7 +130,7 @@ UnrankedTree UnrankedTree::parse ( std::deque < sax::Token >::iterator & input ) void UnrankedTree::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( UnrankedTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) ); - alib::xmlApi < UnrankedNode * >::compose ( out, tree ); + alib::xmlApi < UnrankedNode >::compose ( out, * tree ); out.emplace_back ( UnrankedTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); } diff --git a/alib2data/src/tree/unranked/UnrankedTree.h b/alib2data/src/tree/unranked/UnrankedTree.h index a0221eb3bb..12da03ddcb 100644 --- a/alib2data/src/tree/unranked/UnrankedTree.h +++ b/alib2data/src/tree/unranked/UnrankedTree.h @@ -27,7 +27,7 @@ class GeneralAlphabet; */ class UnrankedTree : public UnrankedTreeBase, public std::Components < UnrankedTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > { protected: - UnrankedNode * tree; + std::smart_ptr < UnrankedNode > tree; public: /** diff --git a/alib2raw/src/tree/TreeFromRawParser.cpp b/alib2raw/src/tree/TreeFromRawParser.cpp index 83256aa29d..f3fed9e55c 100644 --- a/alib2raw/src/tree/TreeFromRawParser.cpp +++ b/alib2raw/src/tree/TreeFromRawParser.cpp @@ -20,17 +20,8 @@ Tree TreeFromRawParser::parseTree(std::deque<sax::Token>::iterator& input) const } Tree TreeFromRawParser::parseTree(std::deque<sax::Token>::iterator& input, const std::set<FEATURES>& features) const { - UnrankedNode* root = NULL; - if (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - root = this->parseContent(input); - } else if(sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::CHARACTER)) { - root = this->parseContentLeaf(input); - } else { - throw exception::CommonException("Invalid token stream"); - } + UnrankedTree tree(this->parseContent(input)); - UnrankedTree tree(std::move(*root)); - delete root; if(features.count(FEATURES::UNRANKED_TREE)) return Tree{tree}; if(features.count(FEATURES::PREFIX_RANKED_TREE)) return Tree{PrefixRankedTree{RankedTree{tree}}}; @@ -42,24 +33,19 @@ Tree TreeFromRawParser::parseTree(std::deque<sax::Token>::iterator& input, const throw exception::CommonException("Invalid input"); } -UnrankedNode* TreeFromRawParser::parseContent(std::deque<sax::Token>::iterator& input) const { - UnrankedNode* node = new UnrankedNode(alphabet::symbolFrom(sax::FromXMLParserHelper::popTokenData(input, sax::Token::TokenType::START_ELEMENT)), std::vector<UnrankedNode*> {}); - while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - UnrankedNode* child = this->parseContent(input); - node->pushBackChild(std::move(*child)); - delete child; - } - if(sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::CHARACTER)) { - UnrankedNode* child = this->parseContentLeaf(input); - node->pushBackChild(std::move(*child)); - delete child; +UnrankedNode TreeFromRawParser::parseContent(std::deque<sax::Token>::iterator& input) const { + if (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { + UnrankedNode node(alphabet::symbolFrom(sax::FromXMLParserHelper::popTokenData(input, sax::Token::TokenType::START_ELEMENT)), std::vector<std::smart_ptr < UnrankedNode > > {}); + while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT) || sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::CHARACTER)) { + node.pushBackChild(this->parseContent(input)); + } + sax::FromXMLParserHelper::popTokenData(input, sax::Token::TokenType::END_ELEMENT); + return node; + } else if(sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::CHARACTER)) { + return UnrankedNode(alphabet::symbolFrom(sax::FromXMLParserHelper::popTokenData(input, sax::Token::TokenType::CHARACTER)), std::vector<std::smart_ptr<UnrankedNode>> {}); + } else { + throw exception::CommonException("Invalid token stream"); } - sax::FromXMLParserHelper::popTokenData(input, sax::Token::TokenType::END_ELEMENT); - return node; -} - -UnrankedNode* TreeFromRawParser::parseContentLeaf(std::deque<sax::Token>::iterator& input) const { - return new UnrankedNode(alphabet::symbolFrom(sax::FromXMLParserHelper::popTokenData(input, sax::Token::TokenType::CHARACTER)), std::vector<UnrankedNode*> {}); } } /* namespace tree */ diff --git a/alib2raw/src/tree/TreeFromRawParser.h b/alib2raw/src/tree/TreeFromRawParser.h index c7ff68e6a1..b63658fb28 100644 --- a/alib2raw/src/tree/TreeFromRawParser.h +++ b/alib2raw/src/tree/TreeFromRawParser.h @@ -23,8 +23,7 @@ public: Tree parseTree(std::deque<sax::Token>::iterator& input, const std::set<FEATURES>& features) const; private: - UnrankedNode* parseContent(std::deque<sax::Token>::iterator& input) const; - UnrankedNode* parseContentLeaf(std::deque<sax::Token>::iterator& input) const; + UnrankedNode parseContent(std::deque<sax::Token>::iterator& input) const; }; } /* namespace tree */ diff --git a/alib2str/src/tree/TreeFromStringParser.cpp b/alib2str/src/tree/TreeFromStringParser.cpp index 163fd15a6e..d6688a0f88 100644 --- a/alib2str/src/tree/TreeFromStringParser.cpp +++ b/alib2str/src/tree/TreeFromStringParser.cpp @@ -65,28 +65,28 @@ Tree TreeFromStringParser::parseTree ( std::istream & input, const std::set < FE if ( isPattern && nonlinearVariables.size ( ) ) { alphabet::RankedSymbol subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); - RankedNonlinearPattern tree ( std::move ( subtreeWildcard ), nonlinearVariables, RankedNode ( alphabet::RankedSymbol ( symbol, rank ), std::move ( childs ) ) ); + RankedNonlinearPattern tree ( std::move ( subtreeWildcard ), std::move ( nonlinearVariables ), RankedNode ( alphabet::RankedSymbol ( std::move ( symbol ), rank ), std::move ( childs ) ) ); - if ( features.count ( FEATURES::RANKED_NONLINEAR_PATTERN ) ) return Tree ( tree ); + if ( features.count ( FEATURES::RANKED_NONLINEAR_PATTERN ) ) return Tree ( std::move ( tree ) ); } else if ( isPattern ) { alphabet::RankedSymbol subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); - RankedPattern tree ( std::move ( subtreeWildcard ), RankedNode ( alphabet::RankedSymbol ( symbol, rank ), std::move ( childs ) ) ); + RankedPattern tree ( std::move ( subtreeWildcard ), RankedNode ( alphabet::RankedSymbol ( std::move ( symbol ), rank ), std::move ( childs ) ) ); - if ( features.count ( FEATURES::RANKED_PATTERN ) ) return Tree ( tree ); + if ( features.count ( FEATURES::RANKED_PATTERN ) ) return Tree ( std::move ( tree ) ); } else { - RankedTree tree ( RankedNode ( alphabet::RankedSymbol ( symbol, rank ), std::move ( childs ) ) ); + RankedTree tree ( RankedNode ( alphabet::RankedSymbol ( std::move ( symbol ), rank ), std::move ( childs ) ) ); - if ( features.count ( FEATURES::RANKED_TREE ) ) return Tree ( tree ); + if ( features.count ( FEATURES::RANKED_TREE ) ) return Tree ( std::move ( tree ) ); } } else { std::set < alphabet::Symbol > nonlinearVariables; - std::vector < tree::UnrankedNode * > childs; + std::vector < std::smart_ptr < tree::UnrankedNode > > childs; bool isPattern = false; while ( token.type != TreeFromStringLexer::TokenType::BAR ) { m_TreeLexer.putback ( input, token ); - childs.push_back ( parseUnrankedContent ( input, isPattern, nonlinearVariables ) ); + childs.emplace_back ( std::make_smart < UnrankedNode > ( parseUnrankedContent ( input, isPattern, nonlinearVariables ) ) ); token = m_TreeLexer.next ( input ); } @@ -95,18 +95,18 @@ Tree TreeFromStringParser::parseTree ( std::istream & input, const std::set < FE if ( isPattern && nonlinearVariables.size ( ) ) { alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); - UnrankedNonlinearPattern tree ( std::move ( subtreeWildcard ), nonlinearVariables, UnrankedNode ( symbol, childs ) ); + UnrankedNonlinearPattern tree ( std::move ( subtreeWildcard ), std::move ( nonlinearVariables ), UnrankedNode ( std::move ( symbol ), std::move ( childs ) ) ); - if ( features.count ( FEATURES::UNRANKED_NONLINEAR_PATTERN ) ) return Tree ( tree ); + if ( features.count ( FEATURES::UNRANKED_NONLINEAR_PATTERN ) ) return Tree ( std::move ( tree ) ); } else if ( isPattern ) { alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); - UnrankedPattern tree ( std::move ( subtreeWildcard ), UnrankedNode ( symbol, childs ) ); + UnrankedPattern tree ( std::move ( subtreeWildcard ), UnrankedNode ( std::move ( symbol ), std::move ( childs ) ) ); - if ( features.count ( FEATURES::UNRANKED_PATTERN ) ) return Tree ( tree ); + if ( features.count ( FEATURES::UNRANKED_PATTERN ) ) return Tree ( std::move ( tree ) ); } else { - UnrankedTree tree ( UnrankedNode ( symbol, childs ) ); + UnrankedTree tree ( UnrankedNode ( std::move ( symbol ), std::move ( childs ) ) ); - if ( features.count ( FEATURES::UNRANKED_TREE ) ) return Tree ( tree ); + if ( features.count ( FEATURES::UNRANKED_TREE ) ) return Tree ( std::move ( tree ) ); } } @@ -147,7 +147,7 @@ tree::RankedNode TreeFromStringParser::parseRankedContent ( std::istream & input } } -tree::UnrankedNode * TreeFromStringParser::parseUnrankedContent ( std::istream & input, bool & isPattern, std::set < alphabet::Symbol > & nonlinearVariables ) const { +tree::UnrankedNode TreeFromStringParser::parseUnrankedContent ( std::istream & input, bool & isPattern, std::set < alphabet::Symbol > & nonlinearVariables ) const { TreeFromStringLexer::Token token = m_TreeLexer.next ( input ); if ( token.type == TreeFromStringLexer::TokenType::SUBTREE_WILDCARD ) { @@ -158,7 +158,7 @@ tree::UnrankedNode * TreeFromStringParser::parseUnrankedContent ( std::istream & isPattern = true; alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); - return new UnrankedNode ( std::move ( subtreeWildcard ), { } ); + return UnrankedNode ( std::move ( subtreeWildcard ), { } ); } else if ( token.type == TreeFromStringLexer::TokenType::NONLINEAR_VARIABLE ) { token = m_TreeLexer.next ( input ); @@ -168,25 +168,25 @@ tree::UnrankedNode * TreeFromStringParser::parseUnrankedContent ( std::istream & isPattern = true; alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( token.value ) ) ); nonlinearVariables.insert ( nonlinearVariable ); - return new UnrankedNode ( std::move ( nonlinearVariable ), { } ); + return UnrankedNode ( std::move ( nonlinearVariable ), { } ); } else { m_TreeLexer.putback ( input, token ); alphabet::Symbol symbol = alib::stringApi < alphabet::Symbol >::parse ( input ); - std::vector < tree::UnrankedNode * > childs; + std::vector < std::smart_ptr < tree::UnrankedNode > > childs; TreeFromStringLexer::Token token = m_TreeLexer.next ( input ); while ( token.type != TreeFromStringLexer::TokenType::BAR ) { m_TreeLexer.putback ( input, token ); - childs.push_back ( parseUnrankedContent ( input, isPattern, nonlinearVariables ) ); + childs.emplace_back ( std::make_smart < UnrankedNode > ( parseUnrankedContent ( input, isPattern, nonlinearVariables ) ) ); token = m_TreeLexer.next ( input ); } if ( token.type != TreeFromStringLexer::TokenType::BAR ) throw exception::CommonException ( "Missing bar" ); - return new UnrankedNode ( std::move ( symbol ), std::move ( childs ) ); + return UnrankedNode ( std::move ( symbol ), std::move ( childs ) ); } } diff --git a/alib2str/src/tree/TreeFromStringParser.h b/alib2str/src/tree/TreeFromStringParser.h index 5d17877ee1..3759dccd77 100644 --- a/alib2str/src/tree/TreeFromStringParser.h +++ b/alib2str/src/tree/TreeFromStringParser.h @@ -30,7 +30,7 @@ public: private: tree::RankedNode parseRankedContent ( std::istream &, bool &, std::set < alphabet::RankedSymbol > & ) const; - tree::UnrankedNode * parseUnrankedContent ( std::istream &, bool &, std::set < alphabet::Symbol > & ) const; + tree::UnrankedNode parseUnrankedContent ( std::istream &, bool &, std::set < alphabet::Symbol > & ) const; TreeFromStringLexer m_TreeLexer; diff --git a/alib2str/src/tree/TreeToStringComposer.cpp b/alib2str/src/tree/TreeToStringComposer.cpp index d4fce18151..c496990673 100644 --- a/alib2str/src/tree/TreeToStringComposer.cpp +++ b/alib2str/src/tree/TreeToStringComposer.cpp @@ -62,7 +62,7 @@ TreeToStringComposer::RegistratorWrapper < void, UnrankedTree > StringToStringCo void TreeToStringComposer::compose ( std::ostream & out, const UnrankedNode & node ) { alib::stringApi < alphabet::Symbol >::compose ( out, node.getSymbol ( ) ); - for ( const UnrankedNode * child : node.getChildren ( ) ) { + for ( const std::smart_ptr < const UnrankedNode > & child : node.getChildren ( ) ) { out << " "; compose ( out, * child ); } @@ -82,7 +82,7 @@ void TreeToStringComposer::compose ( std::ostream & out, const alphabet::Symbol } else { alib::stringApi < alphabet::Symbol >::compose ( out, node.getSymbol ( ) ); - for ( const UnrankedNode * child : node.getChildren ( ) ) { + for ( const std::smart_ptr < const UnrankedNode > & child : node.getChildren ( ) ) { out << " "; compose ( out, subtreeWildcard, * child ); } diff --git a/astat2/src/TreeStat.cpp b/astat2/src/TreeStat.cpp index 69be052ead..f07baf713c 100644 --- a/astat2/src/TreeStat.cpp +++ b/astat2/src/TreeStat.cpp @@ -70,7 +70,7 @@ auto TreeStatFormalTree = TreeStat::RegistratorWrapper < void, tree::RankedTree unsigned TreeStat::countNodes ( const tree::UnrankedNode & node ) { unsigned res = 1; - for ( const tree::UnrankedNode * child : node.getChildren ( ) ) + for ( const std::smart_ptr < const tree::UnrankedNode > & child : node.getChildren ( ) ) res += countNodes ( * child ); return res; @@ -97,7 +97,7 @@ void TreeStat::stat ( const tree::UnrankedTree & tree, const TreeSettings & sett switch ( settings.nodes ) { case PrintingOptions::PRINT: - alib::XmlDataFactory::toStdout ( & tree.getRoot ( ) ); + alib::XmlDataFactory::toStdout ( tree.getRoot ( ) ); break; case PrintingOptions::SIZE: @@ -105,7 +105,7 @@ void TreeStat::stat ( const tree::UnrankedTree & tree, const TreeSettings & sett break; case PrintingOptions::BOTH: - alib::XmlDataFactory::toStdout ( & tree.getRoot ( ) ); + alib::XmlDataFactory::toStdout ( tree.getRoot ( ) ); std::cout << countNodes ( tree.getRoot ( ) ) << std::endl; break; -- GitLab