Skip to content
Snippets Groups Projects
Commit ef5bd30e authored by Jan Trávníček's avatar Jan Trávníček
Browse files

continue refactoring

parent 267c27ce
No related branches found
No related tags found
No related merge requests found
...@@ -20,9 +20,7 @@ namespace arbology { ...@@ -20,9 +20,7 @@ namespace arbology {
namespace exact { namespace exact {
   
std::set<unsigned> ExactSubtreeMatch::match(const tree::Tree& subject, const tree::Tree& pattern) { std::set<unsigned> ExactSubtreeMatch::match(const tree::Tree& subject, const tree::Tree& pattern) {
std::set<unsigned> data; return getInstance().dispatch(subject.getData(), pattern.getData());
Accept((void*) &data, subject.getData(), pattern.getData(), ExactSubtreeMatch::EXACT_SUBTREE_MATCH);
return data;
} }
   
bool ExactSubtreeMatch::matchHelper(const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern) { bool ExactSubtreeMatch::matchHelper(const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern) {
...@@ -36,7 +34,7 @@ bool ExactSubtreeMatch::matchHelper(const tree::UnrankedNode& subject, const tre ...@@ -36,7 +34,7 @@ bool ExactSubtreeMatch::matchHelper(const tree::UnrankedNode& subject, const tre
   
bool ExactSubtreeMatch::matchHelper(const tree::RankedNode& subject, const tree::RankedNode& pattern) { bool ExactSubtreeMatch::matchHelper(const tree::RankedNode& subject, const tree::RankedNode& pattern) {
if(subject.getSymbol() != pattern.getSymbol()) return false; if(subject.getSymbol() != pattern.getSymbol()) return false;
// ranked symbols are the same test for number of children is not needed // ranked symbols are the same; test for number of children is not needed
for(const std::tuple<const tree::RankedNode*, const tree::RankedNode*>& childs : std::make_pair_foreach(subject.getChildren(), pattern.getChildren())) { for(const std::tuple<const tree::RankedNode*, const tree::RankedNode*>& childs : std::make_pair_foreach(subject.getChildren(), pattern.getChildren())) {
if(!matchHelper(*std::get<0>(childs), *std::get<1>(childs))) return false; if(!matchHelper(*std::get<0>(childs), *std::get<1>(childs))) return false;
} }
...@@ -66,6 +64,8 @@ std::set<unsigned> ExactSubtreeMatch::match(const tree::UnrankedTree& subject, c ...@@ -66,6 +64,8 @@ std::set<unsigned> ExactSubtreeMatch::match(const tree::UnrankedTree& subject, c
return occ; return occ;
} }
   
auto ExactSubtreeMatchUnrankedTreeUnrankedTree = ExactSubtreeMatch::RegistratorWrapper<std::set<unsigned>, tree::UnrankedTree, tree::UnrankedTree>(ExactSubtreeMatch::getInstance(), ExactSubtreeMatch::match);
std::set<unsigned> ExactSubtreeMatch::match(const tree::RankedTree& subject, const tree::RankedTree& pattern) { std::set<unsigned> ExactSubtreeMatch::match(const tree::RankedTree& subject, const tree::RankedTree& pattern) {
unsigned i = 0; unsigned i = 0;
std::set<unsigned> occ; std::set<unsigned> occ;
...@@ -73,6 +73,8 @@ std::set<unsigned> ExactSubtreeMatch::match(const tree::RankedTree& subject, con ...@@ -73,6 +73,8 @@ std::set<unsigned> ExactSubtreeMatch::match(const tree::RankedTree& subject, con
return occ; return occ;
} }
   
auto ExactSubtreeMatchRankedTreeRankedTree = ExactSubtreeMatch::RegistratorWrapper<std::set<unsigned>, tree::RankedTree, tree::RankedTree>(ExactSubtreeMatch::getInstance(), ExactSubtreeMatch::match);
std::set<unsigned> ExactSubtreeMatch::match(const tree::PrefixRankedTree& subject, const tree::PrefixRankedTree& pattern) { std::set<unsigned> ExactSubtreeMatch::match(const tree::PrefixRankedTree& subject, const tree::PrefixRankedTree& pattern) {
std::set<unsigned> occ; std::set<unsigned> occ;
for(unsigned i = 0; i <= subject.getContent().size() - pattern.getContent().size(); i++) { for(unsigned i = 0; i <= subject.getContent().size() - pattern.getContent().size(); i++) {
...@@ -87,6 +89,8 @@ std::set<unsigned> ExactSubtreeMatch::match(const tree::PrefixRankedTree& subjec ...@@ -87,6 +89,8 @@ std::set<unsigned> ExactSubtreeMatch::match(const tree::PrefixRankedTree& subjec
return occ; return occ;
} }
   
auto ExactSubtreeMatchPrefixRankedTreePrefixRankedTree = ExactSubtreeMatch::RegistratorWrapper<std::set<unsigned>, tree::PrefixRankedTree, tree::PrefixRankedTree>(ExactSubtreeMatch::getInstance(), ExactSubtreeMatch::match);
std::set<unsigned> ExactSubtreeMatch::match(const tree::PrefixRankedBarTree& subject, const tree::PrefixRankedBarTree& pattern) { std::set<unsigned> ExactSubtreeMatch::match(const tree::PrefixRankedBarTree& subject, const tree::PrefixRankedBarTree& pattern) {
std::set<unsigned> occ; std::set<unsigned> occ;
for(unsigned i = 0; i <= subject.getContent().size() - pattern.getContent().size(); i++) { for(unsigned i = 0; i <= subject.getContent().size() - pattern.getContent().size(); i++) {
...@@ -101,43 +105,7 @@ std::set<unsigned> ExactSubtreeMatch::match(const tree::PrefixRankedBarTree& sub ...@@ -101,43 +105,7 @@ std::set<unsigned> ExactSubtreeMatch::match(const tree::PrefixRankedBarTree& sub
return occ; return occ;
} }
   
void ExactSubtreeMatch::Visit(void* data, const tree::UnrankedTree& subject, const tree::UnrankedTree& pattern) const { auto ExactSubtreeMatchPrefixRankedBarTreePrefixRankedBarTree = ExactSubtreeMatch::RegistratorWrapper<std::set<unsigned>, tree::PrefixRankedBarTree, tree::PrefixRankedBarTree>(ExactSubtreeMatch::getInstance(), ExactSubtreeMatch::match);
std::set<unsigned> & res = *((std::set<unsigned>*) data);
res = this->match(subject, pattern);
}
void ExactSubtreeMatch::Visit(void* data, const tree::RankedTree& subject, const tree::RankedTree& pattern) const {
std::set<unsigned> & res = *((std::set<unsigned>*) data);
res = this->match(subject, pattern);
}
void ExactSubtreeMatch::Visit(void*, const tree::RankedPattern&, const tree::RankedPattern&) const {
throw exception::AlibException("Unsupported tree type RankedPattern");
}
void ExactSubtreeMatch::Visit(void* data, const tree::PrefixRankedTree& subject, const tree::PrefixRankedTree& pattern) const {
std::set<unsigned> & res = *((std::set<unsigned>*) data);
res = this->match(subject, pattern);
}
void ExactSubtreeMatch::Visit(void* data, const tree::PrefixRankedBarTree& subject, const tree::PrefixRankedBarTree& pattern) const {
std::set<unsigned> & res = *((std::set<unsigned>*) data);
res = this->match(subject, pattern);
}
void ExactSubtreeMatch::Visit(void*, const tree::PrefixRankedPattern&, const tree::PrefixRankedPattern&) const {
throw exception::AlibException("Unsupported tree type PrefixRankedPattern");
}
void ExactSubtreeMatch::Visit(void*, const tree::PrefixRankedBarPattern&, const tree::PrefixRankedBarPattern&) const {
throw exception::AlibException("Unsupported tree type PrefixRankedBarPattern");
}
void ExactSubtreeMatch::Visit(void*, const tree::UnrankedPattern&, const tree::UnrankedPattern&) const {
throw exception::AlibException("Unsupported tree type UnrankedPattern");
}
const ExactSubtreeMatch ExactSubtreeMatch::EXACT_SUBTREE_MATCH;
   
} /* namespace exact */ } /* namespace exact */
   
......
...@@ -12,15 +12,14 @@ ...@@ -12,15 +12,14 @@
#include <tree/ranked/RankedNode.h> #include <tree/ranked/RankedNode.h>
#include <tree/unranked/UnrankedNode.h> #include <tree/unranked/UnrankedNode.h>
#include <set> #include <set>
#include <common/multipleDispatch.hpp>
   
namespace arbology { namespace arbology {
   
namespace exact { namespace exact {
   
class ExactSubtreeMatch : public tree::VisitableTreeBase::const_promoting_visitor_type { class ExactSubtreeMatch : public std::DoubleDispatch<std::set<unsigned>, tree::TreeBase, tree::TreeBase> {
public: public:
ExactSubtreeMatch() {}
/** /**
* Performs conversion. * Performs conversion.
* @return left regular grammar equivalent to source automaton. * @return left regular grammar equivalent to source automaton.
...@@ -38,16 +37,11 @@ private: ...@@ -38,16 +37,11 @@ private:
static void matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern); static void matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern);
static void matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::RankedNode& subject, const tree::RankedNode& pattern); static void matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::RankedNode& subject, const tree::RankedNode& pattern);
   
void Visit(void*, const tree::UnrankedTree& subject, const tree::UnrankedTree& pattern) const; public:
void Visit(void*, const tree::RankedTree& subject, const tree::RankedTree& pattern) const; static ExactSubtreeMatch& getInstance() {
void Visit(void*, const tree::RankedPattern& subject, const tree::RankedPattern& pattern) const; static ExactSubtreeMatch res;
void Visit(void*, const tree::PrefixRankedTree& subject, const tree::PrefixRankedTree& pattern) const; return res;
void Visit(void*, const tree::PrefixRankedBarTree& subject, const tree::PrefixRankedBarTree& pattern) const; }
void Visit(void*, const tree::PrefixRankedPattern& subject, const tree::PrefixRankedPattern& pattern) const;
void Visit(void*, const tree::PrefixRankedBarPattern& subject, const tree::PrefixRankedBarPattern& pattern) const;
void Visit(void*, const tree::UnrankedPattern& subject, const tree::UnrankedPattern& pattern) const;
static const ExactSubtreeMatch EXACT_SUBTREE_MATCH;
}; };
   
} /* namespace exact */ } /* namespace exact */
......
...@@ -17,11 +17,7 @@ namespace arbology { ...@@ -17,11 +17,7 @@ namespace arbology {
namespace exact { namespace exact {
   
automaton::Automaton ExactSubtreeMatchingAutomaton::construct(const tree::Tree& pattern) { automaton::Automaton ExactSubtreeMatchingAutomaton::construct(const tree::Tree& pattern) {
automaton::Automaton* out = NULL; return getInstance().dispatch(pattern.getData());
pattern.getData().Accept((void*) &out, ExactSubtreeMatchingAutomaton::EXACT_SUBTREE_MATCHING_AUTOMATON);
automaton::Automaton res = std::move(*out);
delete out;
return res;
} }
   
automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct(const tree::PrefixRankedTree& pattern) { automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct(const tree::PrefixRankedTree& pattern) {
...@@ -45,6 +41,8 @@ automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct(const tree:: ...@@ -45,6 +41,8 @@ automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct(const tree::
return res; return res;
} }
   
auto ExactSubtreeMatchingAutomatonPrefixRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper<automaton::InputDrivenNPDA, tree::PrefixRankedTree>(ExactSubtreeMatchingAutomaton::getInstance(), ExactSubtreeMatchingAutomaton::construct);
automaton::State constructRecursive(const tree::RankedNode & node, automaton::NFTA & res, int & nextState) { automaton::State constructRecursive(const tree::RankedNode & node, automaton::NFTA & res, int & nextState) {
std::vector<automaton::State> states; std::vector<automaton::State> states;
states.reserve(node.getSymbol().getRank().getData()); states.reserve(node.getSymbol().getRank().getData());
...@@ -65,41 +63,7 @@ automaton::NFTA ExactSubtreeMatchingAutomaton::construct(const tree::RankedTree ...@@ -65,41 +63,7 @@ automaton::NFTA ExactSubtreeMatchingAutomaton::construct(const tree::RankedTree
return res; return res;
} }
   
void ExactSubtreeMatchingAutomaton::Visit(void* data, const tree::RankedTree& pattern) const { auto ExactSubtreeMatchingAutomatonRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper<automaton::NFTA, tree::RankedTree>(ExactSubtreeMatchingAutomaton::getInstance(), ExactSubtreeMatchingAutomaton::construct);
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->construct(pattern));
}
void ExactSubtreeMatchingAutomaton::Visit(void* data, const tree::PrefixRankedTree& pattern) const {
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->construct(pattern));
}
void ExactSubtreeMatchingAutomaton::Visit(void*, const tree::PrefixRankedBarTree&) const {
throw exception::AlibException("Unsupported tree type PrefixRankedBarTree");
}
void ExactSubtreeMatchingAutomaton::Visit(void*, const tree::RankedPattern&) const {
throw exception::AlibException("Unsupported tree type RankedPattern");
}
void ExactSubtreeMatchingAutomaton::Visit(void*, const tree::PrefixRankedPattern&) const {
throw exception::AlibException("Unsupported tree type PrefixRankedPattern");
}
void ExactSubtreeMatchingAutomaton::Visit(void*, const tree::PrefixRankedBarPattern&) const {
throw exception::AlibException("Unsupported tree type PrefixRankedBarPattern");
}
void ExactSubtreeMatchingAutomaton::Visit(void*, const tree::UnrankedTree&) const {
throw exception::AlibException("Unsupported tree type UnrankedTree");
}
void ExactSubtreeMatchingAutomaton::Visit(void*, const tree::UnrankedPattern&) const {
throw exception::AlibException("Unsupported tree type UnrankedPattern");
}
const ExactSubtreeMatchingAutomaton ExactSubtreeMatchingAutomaton::EXACT_SUBTREE_MATCHING_AUTOMATON;
   
} /* namespace exact */ } /* namespace exact */
   
......
...@@ -12,12 +12,13 @@ ...@@ -12,12 +12,13 @@
#include <automaton/PDA/InputDrivenNPDA.h> #include <automaton/PDA/InputDrivenNPDA.h>
#include <automaton/TA/NFTA.h> #include <automaton/TA/NFTA.h>
#include <tree/Tree.h> #include <tree/Tree.h>
#include <common/multipleDispatch.hpp>
   
namespace arbology { namespace arbology {
   
namespace exact { namespace exact {
   
class ExactSubtreeMatchingAutomaton : public tree::VisitableTreeBase::const_visitor_type { class ExactSubtreeMatchingAutomaton : public std::SingleDispatch<automaton::Automaton, tree::TreeBase> {
public: public:
ExactSubtreeMatchingAutomaton() {} ExactSubtreeMatchingAutomaton() {}
   
...@@ -29,17 +30,11 @@ public: ...@@ -29,17 +30,11 @@ public:
   
static automaton::InputDrivenNPDA construct(const tree::PrefixRankedTree& pattern); static automaton::InputDrivenNPDA construct(const tree::PrefixRankedTree& pattern);
static automaton::NFTA construct(const tree::RankedTree& pattern); static automaton::NFTA construct(const tree::RankedTree& pattern);
private:
void Visit(void*, const tree::RankedTree& pattern) const; static ExactSubtreeMatchingAutomaton& getInstance() {
void Visit(void*, const tree::RankedPattern& subject) const; static ExactSubtreeMatchingAutomaton res;
void Visit(void*, const tree::PrefixRankedTree& pattern) const; return res;
void Visit(void*, const tree::PrefixRankedBarTree& pattern) const; }
void Visit(void*, const tree::PrefixRankedPattern& pattern) const;
void Visit(void*, const tree::PrefixRankedBarPattern& pattern) const;
void Visit(void*, const tree::UnrankedTree& pattern) const;
void Visit(void*, const tree::UnrankedPattern& subject) const;
static const ExactSubtreeMatchingAutomaton EXACT_SUBTREE_MATCHING_AUTOMATON;
}; };
   
} /* namespace exact */ } /* namespace exact */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment