From 80a6aae34ce9635b6492cd37959ceb91d8b15b70 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Wed, 29 Jul 2015 09:04:05 +0200 Subject: [PATCH] refactor next label --- alib2data/src/alphabet/NextSymbol.cpp | 5 +- alib2data/src/automaton/Automaton.cpp | 3 +- alib2data/src/common/wrapper.hpp | 4 + alib2data/src/label/HexavigesimalLabel.cpp | 9 ++ alib2data/src/label/HexavigesimalLabel.h | 3 + alib2data/src/label/Label.cpp | 10 +++ alib2data/src/label/Label.h | 4 + alib2data/src/label/LabelBase.h | 3 + alib2data/src/label/LabelPairLabel.cpp | 9 ++ alib2data/src/label/LabelPairLabel.h | 3 + alib2data/src/label/LabelSetLabel.cpp | 9 ++ alib2data/src/label/LabelSetLabel.h | 3 + alib2data/src/label/NextLabel.cpp | 99 ---------------------- alib2data/src/label/NextLabel.h | 55 ------------ alib2data/src/label/ObjectLabel.cpp | 9 ++ alib2data/src/label/ObjectLabel.h | 3 + alib2data/src/label/PrimitiveLabel.cpp | 10 +++ alib2data/src/label/PrimitiveLabel.h | 3 + alib2data/src/label/UniqueLabel.cpp | 9 ++ alib2data/src/label/UniqueLabel.h | 3 + 20 files changed, 97 insertions(+), 159 deletions(-) delete mode 100644 alib2data/src/label/NextLabel.cpp delete mode 100644 alib2data/src/label/NextLabel.h diff --git a/alib2data/src/alphabet/NextSymbol.cpp b/alib2data/src/alphabet/NextSymbol.cpp index b4e58180ec..6b371c4b87 100644 --- a/alib2data/src/alphabet/NextSymbol.cpp +++ b/alib2data/src/alphabet/NextSymbol.cpp @@ -6,7 +6,6 @@ */ #include "NextSymbol.h" -#include "../label/NextLabel.h" #include "LabeledSymbol.h" #include "RankedSymbol.h" #include "SymbolPairSymbol.h" @@ -25,11 +24,11 @@ namespace alphabet { void NextSymbol::Visit(void* userData, const LabeledSymbol& symbol) const { Symbol* &out = *((Symbol**) userData); - out = new Symbol(LabeledSymbol(label::NextLabel::nextLabel(symbol.getLabel()))); + out = new Symbol(LabeledSymbol(symbol.getLabel().next())); } void NextSymbol::Visit(void*, LabeledSymbol& symbol) const { - label::NextLabel::nextLabel(symbol.getLabel()); + symbol.getLabel().inc(); } void NextSymbol::Visit(void* userData, const BlankSymbol& symbol) const { diff --git a/alib2data/src/automaton/Automaton.cpp b/alib2data/src/automaton/Automaton.cpp index 4485dc10a0..44c46338ba 100644 --- a/alib2data/src/automaton/Automaton.cpp +++ b/alib2data/src/automaton/Automaton.cpp @@ -7,7 +7,6 @@ #include "Automaton.h" #include "common/State.h" -#include "../label/NextLabel.h" #include <climits> #include "AutomatonException.h" @@ -16,7 +15,7 @@ namespace automaton { State createUniqueState(State nextState, const std::set<State>& other) { int i = 0; do { - label::NextLabel::nextLabel(nextState.getName()); + nextState.getName().inc(); if(other.count(nextState) == 0) return std::move(nextState); } while(++i < INT_MAX); diff --git a/alib2data/src/common/wrapper.hpp b/alib2data/src/common/wrapper.hpp index 66ed1d4afe..a6874ac07e 100644 --- a/alib2data/src/common/wrapper.hpp +++ b/alib2data/src/common/wrapper.hpp @@ -39,6 +39,10 @@ public: return *data; } + void setData(T* data) { + this->data = std::cow_shared_ptr<T>(data); + } + void setData(const T& data) { this->data = std::cow_shared_ptr<T>(data.clone()); } diff --git a/alib2data/src/label/HexavigesimalLabel.cpp b/alib2data/src/label/HexavigesimalLabel.cpp index c5f6c00e89..272fa1a7df 100644 --- a/alib2data/src/label/HexavigesimalLabel.cpp +++ b/alib2data/src/label/HexavigesimalLabel.cpp @@ -60,6 +60,15 @@ void HexavigesimalLabel::compose(std::deque<sax::Token>& out) const { out.emplace_back(HexavigesimalLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +LabelBase* HexavigesimalLabel::next() const { + return new HexavigesimalLabel(hexavigesimal + 1); +} + +LabelBase* HexavigesimalLabel::inc() && { + hexavigesimal++; + return NULL; +} + } /* namespace label */ namespace alib { diff --git a/alib2data/src/label/HexavigesimalLabel.h b/alib2data/src/label/HexavigesimalLabel.h index b39da67ceb..097379a99a 100644 --- a/alib2data/src/label/HexavigesimalLabel.h +++ b/alib2data/src/label/HexavigesimalLabel.h @@ -58,6 +58,9 @@ public: static HexavigesimalLabel parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual LabelBase* next() const; + virtual LabelBase* inc() &&; }; } /* namespace label */ diff --git a/alib2data/src/label/Label.cpp b/alib2data/src/label/Label.cpp index e1e82ab841..ca4688e80e 100644 --- a/alib2data/src/label/Label.cpp +++ b/alib2data/src/label/Label.cpp @@ -12,6 +12,16 @@ namespace label { +Label Label::next() const { + return Label(this->getData().next()); +} + +void Label::inc() { + LabelBase* res = std::move(this->getData()).inc(); + if(res == NULL) return; + this->setData(res); +} + label::Label labelFrom(int number) { return label::Label { label::PrimitiveLabel { primitive::primitiveFrom (number) } }; } diff --git a/alib2data/src/label/Label.h b/alib2data/src/label/Label.h index 0a9b7b66a2..4b0a0a61e1 100644 --- a/alib2data/src/label/Label.h +++ b/alib2data/src/label/Label.h @@ -19,6 +19,10 @@ namespace label { */ class Label : public alib::wrapper<LabelBase>, public alib::WrapperBase { using alib::wrapper<LabelBase>::wrapper; + +public: + Label next() const; + void inc(); }; label::Label labelFrom(int number); diff --git a/alib2data/src/label/LabelBase.h b/alib2data/src/label/LabelBase.h index c5030f0fa5..0f06d2cec1 100644 --- a/alib2data/src/label/LabelBase.h +++ b/alib2data/src/label/LabelBase.h @@ -41,6 +41,9 @@ public: virtual LabelBase* clone() const = 0; virtual LabelBase* plunder() && = 0; + + virtual LabelBase* next() const = 0; + virtual LabelBase* inc() && = 0; }; } /* namespace label */ diff --git a/alib2data/src/label/LabelPairLabel.cpp b/alib2data/src/label/LabelPairLabel.cpp index ef71bb9a58..424cfd5bee 100644 --- a/alib2data/src/label/LabelPairLabel.cpp +++ b/alib2data/src/label/LabelPairLabel.cpp @@ -11,6 +11,7 @@ #include "Label.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueLabel.h" namespace label { @@ -70,6 +71,14 @@ void LabelPairLabel::compose(std::deque<sax::Token>& out) const { out.emplace_back(LabelPairLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +LabelBase* LabelPairLabel::next() const { + return new UniqueLabel(Label(*this), primitive::Integer(0)); +} + +LabelBase* LabelPairLabel::inc() && { + return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0)); +} + } /* namespace label */ namespace alib { diff --git a/alib2data/src/label/LabelPairLabel.h b/alib2data/src/label/LabelPairLabel.h index e3e07477b3..e6bb8c3fad 100644 --- a/alib2data/src/label/LabelPairLabel.h +++ b/alib2data/src/label/LabelPairLabel.h @@ -55,6 +55,9 @@ public: static LabelPairLabel parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual LabelBase* next() const; + virtual LabelBase* inc() &&; }; } /* namespace label */ diff --git a/alib2data/src/label/LabelSetLabel.cpp b/alib2data/src/label/LabelSetLabel.cpp index 3964755e62..cdc5277786 100644 --- a/alib2data/src/label/LabelSetLabel.cpp +++ b/alib2data/src/label/LabelSetLabel.cpp @@ -11,6 +11,7 @@ #include "Label.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueLabel.h" namespace label { @@ -75,6 +76,14 @@ void LabelSetLabel::compose(std::deque<sax::Token>& out) const { out.emplace_back(LabelSetLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +LabelBase* LabelSetLabel::next() const { + return new UniqueLabel(Label(*this), primitive::Integer(0)); +} + +LabelBase* LabelSetLabel::inc() && { + return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0)); +} + } /* namespace label */ namespace alib { diff --git a/alib2data/src/label/LabelSetLabel.h b/alib2data/src/label/LabelSetLabel.h index 11e047d51f..55bf621eff 100644 --- a/alib2data/src/label/LabelSetLabel.h +++ b/alib2data/src/label/LabelSetLabel.h @@ -55,6 +55,9 @@ public: static LabelSetLabel parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual LabelBase* next() const; + virtual LabelBase* inc() &&; }; } /* namespace label */ diff --git a/alib2data/src/label/NextLabel.cpp b/alib2data/src/label/NextLabel.cpp deleted file mode 100644 index 30fede9afc..0000000000 --- a/alib2data/src/label/NextLabel.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - * NextLabel.cpp - * - * Created on: Nov 23, 2013 - * Author: Jan Travnicek - */ - -#include "NextLabel.h" -#include "PrimitiveLabel.h" -#include "HexavigesimalLabel.h" -#include "LabelSetLabel.h" -#include "ObjectLabel.h" -#include "LabelPairLabel.h" -#include "UniqueLabel.h" - -namespace label { - -void NextLabel::Visit(void* userData, const PrimitiveLabel& label) const { - Label* &out = *((Label**) userData); - - out = new Label(PrimitiveLabel(label.getData().next())); -} - -void NextLabel::Visit(void*, PrimitiveLabel& label) const { - label.getData().inc(); -} - -void NextLabel::Visit(void* userData, const HexavigesimalLabel& label) const { - Label* &out = *((Label**) userData); - - out = new Label(HexavigesimalLabel(label.getData() + 1)); -} - -void NextLabel::Visit(void*, HexavigesimalLabel& label) const { - label.setData(label.getData() + 1); -} - -void NextLabel::Visit(void* userData, const ObjectLabel& label) const { - Label* &out = *((Label**) userData); - - out = new Label(UniqueLabel(Label(label), primitive::Integer(0))); -} - -void NextLabel::Visit(void* userData, ObjectLabel&) const { - Label &out = *((Label*) userData); - - out = Label(UniqueLabel(std::move(out), primitive::Integer(0))); -} - -void NextLabel::Visit(void* userData, const LabelSetLabel& label) const { - Label* &out = *((Label**) userData); - - out = new Label(UniqueLabel(Label(label), primitive::Integer(0))); -} - -void NextLabel::Visit(void* userData, LabelSetLabel&) const { - Label &out = *((Label*) userData); - - out = Label(UniqueLabel(std::move(out), primitive::Integer(0))); -} - -void NextLabel::Visit(void* userData, const LabelPairLabel& label) const { - Label* &out = *((Label**) userData); - - out = new Label(UniqueLabel(Label(label), primitive::Integer(0))); -} - -void NextLabel::Visit(void* userData, LabelPairLabel&) const { - Label &out = *((Label*) userData); - - out = Label(UniqueLabel(std::move(out), primitive::Integer(0))); -} - -void NextLabel::Visit(void* userData, const UniqueLabel& label) const { - Label* &out = *((Label**) userData); - - out = new Label(UniqueLabel(label.getLabel(), primitive::Integer(label.getId().getData() + 1))); -} - -void NextLabel::Visit(void*, UniqueLabel& label) const { - label.getId().setData(label.getId().getData() + 1); -} - -Label NextLabel::nextLabel(const Label& label) { - Label* out; - label.getData().Accept((void*) &out, NextLabel::NEXT_LABEL); - - Label nextLabel(std::move(*out)); - delete out; - return std::move(nextLabel); -} - -void NextLabel::nextLabel(Label& label) { - label.getData().Accept((void*) &label, NextLabel::NEXT_LABEL); -} - -const NextLabel NextLabel::NEXT_LABEL; - -} /* namespace label */ diff --git a/alib2data/src/label/NextLabel.h b/alib2data/src/label/NextLabel.h deleted file mode 100644 index d72a33f8c7..0000000000 --- a/alib2data/src/label/NextLabel.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * NextLabel.h - * - * Created on: Nov 23, 2013 - * Author: Jan Travnciek - */ - -#ifndef NEXT_LABEL_H_ -#define NEXT_LABEL_H_ - -#include "LabelFeatures.h" -#include "LabelBase.h" - -namespace label { - -/** - * This class contains methods to print XML representation of string to the output stream. - */ -class NextLabel : public VisitableLabelBase::const_visitor_type, public VisitableLabelBase::visitor_type { - void Visit(void*, const PrimitiveLabel& label) const; - void Visit(void*, PrimitiveLabel& label) const; - - void Visit(void*, const HexavigesimalLabel& label) const; - void Visit(void*, HexavigesimalLabel& label) const; - - void Visit(void*, const ObjectLabel& label) const; - void Visit(void*, ObjectLabel& label) const; - - void Visit(void*, const LabelSetLabel& label) const; - void Visit(void*, LabelSetLabel& label) const; - - void Visit(void*, const LabelPairLabel& label) const; - void Visit(void*, LabelPairLabel& label) const; - - void Visit(void*, const UniqueLabel& label) const; - void Visit(void*, UniqueLabel& label) const; - -public: - NextLabel() {} - - /** - * Prints XML representation of String to the output stream. - * @param string String to print - * @param out output stream to which print the String - */ - static Label nextLabel(const Label& label); - - static void nextLabel(Label& label); - - static const NextLabel NEXT_LABEL; -}; - -} /* namespace label */ - -#endif /* NEXT_LABEL_H_ */ diff --git a/alib2data/src/label/ObjectLabel.cpp b/alib2data/src/label/ObjectLabel.cpp index 5419423141..5d40ef75a4 100644 --- a/alib2data/src/label/ObjectLabel.cpp +++ b/alib2data/src/label/ObjectLabel.cpp @@ -10,6 +10,7 @@ #include "Label.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueLabel.h" namespace label { @@ -56,6 +57,14 @@ void ObjectLabel::compose(std::deque<sax::Token>& out) const { out.emplace_back(ObjectLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +LabelBase* ObjectLabel::next() const { + return new UniqueLabel(Label(*this), primitive::Integer(0)); +} + +LabelBase* ObjectLabel::inc() && { + return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0)); +} + } /* namespace label */ namespace alib { diff --git a/alib2data/src/label/ObjectLabel.h b/alib2data/src/label/ObjectLabel.h index 769004aec9..7dd0711c8f 100644 --- a/alib2data/src/label/ObjectLabel.h +++ b/alib2data/src/label/ObjectLabel.h @@ -56,6 +56,9 @@ public: static ObjectLabel parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual LabelBase* next() const; + virtual LabelBase* inc() &&; }; } /* namespace label */ diff --git a/alib2data/src/label/PrimitiveLabel.cpp b/alib2data/src/label/PrimitiveLabel.cpp index 1133ea0b79..a895a07b84 100644 --- a/alib2data/src/label/PrimitiveLabel.cpp +++ b/alib2data/src/label/PrimitiveLabel.cpp @@ -10,6 +10,7 @@ #include "Label.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueLabel.h" namespace label { @@ -60,6 +61,15 @@ void PrimitiveLabel::compose(std::deque<sax::Token>& out) const { out.emplace_back(PrimitiveLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +LabelBase* PrimitiveLabel::next() const { + return new PrimitiveLabel(primitive.next()); +} + +LabelBase* PrimitiveLabel::inc() && { + primitive.inc(); + return NULL; +} + } /* namespace label */ namespace alib { diff --git a/alib2data/src/label/PrimitiveLabel.h b/alib2data/src/label/PrimitiveLabel.h index 0207928a77..c1eda1b881 100644 --- a/alib2data/src/label/PrimitiveLabel.h +++ b/alib2data/src/label/PrimitiveLabel.h @@ -58,6 +58,9 @@ public: static PrimitiveLabel parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual LabelBase* next() const; + virtual LabelBase* inc() &&; }; } /* namespace label */ diff --git a/alib2data/src/label/UniqueLabel.cpp b/alib2data/src/label/UniqueLabel.cpp index 39130c8b17..eb5c4e378a 100644 --- a/alib2data/src/label/UniqueLabel.cpp +++ b/alib2data/src/label/UniqueLabel.cpp @@ -78,6 +78,15 @@ void UniqueLabel::compose(std::deque<sax::Token>& out) const { out.emplace_back(UniqueLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +LabelBase* UniqueLabel::next() const { + return new UniqueLabel(label, id.next()); +} + +LabelBase* UniqueLabel::inc() && { + id.inc(); + return NULL; +} + } /* namespace label */ namespace alib { diff --git a/alib2data/src/label/UniqueLabel.h b/alib2data/src/label/UniqueLabel.h index 87e196a049..4ac916e929 100644 --- a/alib2data/src/label/UniqueLabel.h +++ b/alib2data/src/label/UniqueLabel.h @@ -60,6 +60,9 @@ public: static UniqueLabel parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual LabelBase* next() const; + virtual LabelBase* inc() &&; }; } /* namespace label */ -- GitLab