diff --git a/alib2data/src/alphabet/BarSymbol.cpp b/alib2data/src/alphabet/BarSymbol.cpp index bf5aab78a903e436962c401ee4c4db26278ed31a..0034c9926058bd72cc14c0861618305faa5f7c50 100644 --- a/alib2data/src/alphabet/BarSymbol.cpp +++ b/alib2data/src/alphabet/BarSymbol.cpp @@ -10,6 +10,7 @@ #include "Symbol.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueSymbol.h" namespace alphabet { @@ -52,6 +53,14 @@ void BarSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(BarSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* BarSymbol::next() const { + return new UniqueSymbol(Symbol(*this), primitive::Integer(0)); +} + +SymbolBase* BarSymbol::inc() && { + return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0)); +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/BarSymbol.h b/alib2data/src/alphabet/BarSymbol.h index 583e837c8888f0770e284f89be07f5a68936ff29..8c5351e1f0d9d08a907ec8cd22a83556a29cb249 100644 --- a/alib2data/src/alphabet/BarSymbol.h +++ b/alib2data/src/alphabet/BarSymbol.h @@ -47,6 +47,9 @@ public: static BarSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/BlankSymbol.cpp b/alib2data/src/alphabet/BlankSymbol.cpp index 34e4e0f10759f715e326c103c9d28ba7f0cb024f..1cdb3c1caac35574a538c32bc8663c2d7cb4602f 100644 --- a/alib2data/src/alphabet/BlankSymbol.cpp +++ b/alib2data/src/alphabet/BlankSymbol.cpp @@ -10,6 +10,7 @@ #include "Symbol.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueSymbol.h" namespace alphabet { @@ -52,6 +53,14 @@ void BlankSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(BlankSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* BlankSymbol::next() const { + return new UniqueSymbol(Symbol(*this), primitive::Integer(0)); +} + +SymbolBase* BlankSymbol::inc() && { + return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0)); +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/BlankSymbol.h b/alib2data/src/alphabet/BlankSymbol.h index b6a75a4301367dd5529a3d1a0a34029bf61bbb82..697898b9e6036a9db6deb008dcd22a815b10e295 100644 --- a/alib2data/src/alphabet/BlankSymbol.h +++ b/alib2data/src/alphabet/BlankSymbol.h @@ -47,6 +47,9 @@ public: static BlankSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp b/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp index ba80fc1b08af54146d3e58b3345abcc5c83cf4b2..ac67c6caed265e107d4f29a7904d10fa45d7b319 100644 --- a/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp +++ b/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp @@ -10,6 +10,7 @@ #include "Symbol.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueSymbol.h" namespace alphabet { @@ -52,6 +53,14 @@ void BottomOfTheStackSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(BottomOfTheStackSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* BottomOfTheStackSymbol::next() const { + return new UniqueSymbol(Symbol(*this), primitive::Integer(0)); +} + +SymbolBase* BottomOfTheStackSymbol::inc() && { + return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0)); +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/BottomOfTheStackSymbol.h b/alib2data/src/alphabet/BottomOfTheStackSymbol.h index 8b468c37758f56f3a8290f5b514cb441adb403a3..f78466c47dac2d9fcae2de07f25f39a2f08f4ae7 100644 --- a/alib2data/src/alphabet/BottomOfTheStackSymbol.h +++ b/alib2data/src/alphabet/BottomOfTheStackSymbol.h @@ -47,6 +47,9 @@ public: static BottomOfTheStackSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/EndSymbol.cpp b/alib2data/src/alphabet/EndSymbol.cpp index 4b3c9949f7390894425b773d0b72a5e9663921cb..33bc477708756c709cde8722078b01c564d1caa8 100644 --- a/alib2data/src/alphabet/EndSymbol.cpp +++ b/alib2data/src/alphabet/EndSymbol.cpp @@ -10,6 +10,7 @@ #include "Symbol.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueSymbol.h" namespace alphabet { @@ -52,6 +53,14 @@ void EndSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(EndSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* EndSymbol::next() const { + return new UniqueSymbol(Symbol(*this), primitive::Integer(0)); +} + +SymbolBase* EndSymbol::inc() && { + return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0)); +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/EndSymbol.h b/alib2data/src/alphabet/EndSymbol.h index 88bd0bca19282cba77894be0204fa8c8a50df042..eff07cbd0e94a1e8e17e4256a1b08ed8ea36c85a 100644 --- a/alib2data/src/alphabet/EndSymbol.h +++ b/alib2data/src/alphabet/EndSymbol.h @@ -47,6 +47,9 @@ public: static EndSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/LabeledSymbol.cpp b/alib2data/src/alphabet/LabeledSymbol.cpp index eef5c9924ca98bd31630898a8230b94741a54238..2c7fba541de55de80289a9cee072c98137777607 100644 --- a/alib2data/src/alphabet/LabeledSymbol.cpp +++ b/alib2data/src/alphabet/LabeledSymbol.cpp @@ -72,6 +72,15 @@ void LabeledSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(LabeledSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* LabeledSymbol::next() const { + return new LabeledSymbol(label.next()); +} + +SymbolBase* LabeledSymbol::inc() && { + label.inc(); + return NULL; +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/LabeledSymbol.h b/alib2data/src/alphabet/LabeledSymbol.h index 59a1f623623f2bac360fe040337e145345756e6b..0f3b5e30b3693289fdc9ed59122e22263667cb9d 100644 --- a/alib2data/src/alphabet/LabeledSymbol.h +++ b/alib2data/src/alphabet/LabeledSymbol.h @@ -60,6 +60,9 @@ public: static LabeledSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/NextSymbol.cpp b/alib2data/src/alphabet/NextSymbol.cpp deleted file mode 100644 index 6b371c4b876dab81d1f72ecbbcfcdc4090edc183..0000000000000000000000000000000000000000 --- a/alib2data/src/alphabet/NextSymbol.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/* - * NextSymbol.cpp - * - * Created on: Nov 23, 2013 - * Author: Jan Travnicek - */ - -#include "NextSymbol.h" -#include "LabeledSymbol.h" -#include "RankedSymbol.h" -#include "SymbolPairSymbol.h" -#include "SymbolSetSymbol.h" -#include "UniqueSymbol.h" -#include "BlankSymbol.h" -#include "BottomOfTheStackSymbol.h" -#include "EndSymbol.h" -#include "StartSymbol.h" -#include "BarSymbol.h" -#include "VariablesBarSymbol.h" -#include "SubtreeWildcardSymbol.h" - -namespace alphabet { - -void NextSymbol::Visit(void* userData, const LabeledSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(LabeledSymbol(symbol.getLabel().next())); -} - -void NextSymbol::Visit(void*, LabeledSymbol& symbol) const { - symbol.getLabel().inc(); -} - -void NextSymbol::Visit(void* userData, const BlankSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, BlankSymbol&) const { - Symbol &out = *((Symbol*) userData); - - out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, const BottomOfTheStackSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, BottomOfTheStackSymbol&) const { - Symbol &out = *((Symbol*) userData); - - out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, const EndSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, EndSymbol&) const { - Symbol &out = *((Symbol*) userData); - - out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, const StartSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, StartSymbol&) const { - Symbol &out = *((Symbol*) userData); - - out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, const RankedSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, RankedSymbol&) const { - Symbol &out = *((Symbol*) userData); - - out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, const BarSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, BarSymbol&) const { - Symbol &out = *((Symbol*) userData); - - out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, const VariablesBarSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, VariablesBarSymbol&) const { - Symbol &out = *((Symbol*) userData); - - out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, const SubtreeWildcardSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, SubtreeWildcardSymbol&) const { - Symbol &out = *((Symbol*) userData); - - out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, const SymbolPairSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, SymbolPairSymbol&) const { - Symbol &out = *((Symbol*) userData); - - out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, const SymbolSetSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, SymbolSetSymbol&) const { - Symbol &out = *((Symbol*) userData); - - out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0))); -} - -void NextSymbol::Visit(void* userData, const UniqueSymbol& symbol) const { - Symbol* &out = *((Symbol**) userData); - - out = new Symbol(UniqueSymbol(symbol.getSymbol(), symbol.getId().next())); -} - -void NextSymbol::Visit(void*, UniqueSymbol& symbol) const { - symbol.getId().setData(symbol.getId().getData() + 1); -} - -Symbol NextSymbol::nextSymbol(const Symbol& symbol) { - Symbol* out; - symbol.getData().Accept((void*) &out, NextSymbol::NEXT_SYMBOL); - - Symbol nextSymbol(std::move(*out)); - delete out; - return std::move(nextSymbol); -} - -void NextSymbol::nextSymbol(Symbol& symbol) { - symbol.getData().Accept((void*) &symbol, NextSymbol::NEXT_SYMBOL); -} - -const NextSymbol NextSymbol::NEXT_SYMBOL; - -} /* namespace alphabet */ diff --git a/alib2data/src/alphabet/NextSymbol.h b/alib2data/src/alphabet/NextSymbol.h deleted file mode 100644 index b9170192704e1b7ac974dfecc3a960047ff17bfe..0000000000000000000000000000000000000000 --- a/alib2data/src/alphabet/NextSymbol.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * NextSymbol.h - * - * Created on: Nov 23, 2013 - * Author: Jan Travnciek - */ - -#ifndef NEXT_SYMBOL_H_ -#define NEXT_SYMBOL_H_ - -#include "SymbolFeatures.h" -#include "SymbolBase.h" - -namespace alphabet { - -/** - * This class contains methods to print XML representation of string to the output stream. - */ -class NextSymbol : public VisitableSymbolBase::const_visitor_type, public VisitableSymbolBase::visitor_type { - void Visit(void*, const LabeledSymbol& symbol) const; - void Visit(void*, LabeledSymbol& symbol) const; - - void Visit(void*, const BlankSymbol& symbol) const; - void Visit(void*, BlankSymbol& symbol) const; - - void Visit(void*, const BottomOfTheStackSymbol& symbol) const; - void Visit(void*, BottomOfTheStackSymbol& symbol) const; - - void Visit(void*, const EndSymbol& symbol) const; - void Visit(void*, EndSymbol& symbol) const; - - void Visit(void*, const StartSymbol& symbol) const; - void Visit(void*, StartSymbol& symbol) const; - - void Visit(void*, const RankedSymbol& symbol) const; - void Visit(void*, RankedSymbol& symbol) const; - - void Visit(void*, const BarSymbol& symbol) const; - void Visit(void*, BarSymbol& symbol) const; - - void Visit(void*, const VariablesBarSymbol& symbol) const; - void Visit(void*, VariablesBarSymbol& symbol) const; - - void Visit(void*, const SubtreeWildcardSymbol& symbol) const; - void Visit(void*, SubtreeWildcardSymbol& symbol) const; - - void Visit(void*, const SymbolPairSymbol& symbol) const; - void Visit(void*, SymbolPairSymbol& symbol) const; - - void Visit(void*, const SymbolSetSymbol& symbol) const; - void Visit(void*, SymbolSetSymbol& symbol) const; - - void Visit(void*, const UniqueSymbol& symbol) const; - void Visit(void*, UniqueSymbol& symbol) const; - -public: - NextSymbol() {} - - /** - * Prints XML representation of String to the output stream. - * @param string String to print - * @param out output stream to which print the String - */ - static Symbol nextSymbol(const Symbol& symbol); - static void nextSymbol(Symbol& symbol); - - static const NextSymbol NEXT_SYMBOL; -}; - -} /* namespace alphabet */ - -#endif /* NEXT_SYMBOL_H_ */ diff --git a/alib2data/src/alphabet/RankedSymbol.cpp b/alib2data/src/alphabet/RankedSymbol.cpp index 5388b2776de3e76dd74582e82c6b19a0c9cc00db..b01754fa706a0ccf5c1127813a85bd1b364e69f1 100644 --- a/alib2data/src/alphabet/RankedSymbol.cpp +++ b/alib2data/src/alphabet/RankedSymbol.cpp @@ -80,6 +80,15 @@ void RankedSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(RankedSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* RankedSymbol::next() const { + return new RankedSymbol(symbol.next(), rank); +} + +SymbolBase* RankedSymbol::inc() && { + symbol.inc(); + return NULL; +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h index ba973d7a5d130b3aa4bf4af951f5ccd268fe409d..570e62804005a2ea8d7e953fd8b2b85e78f258b9 100644 --- a/alib2data/src/alphabet/RankedSymbol.h +++ b/alib2data/src/alphabet/RankedSymbol.h @@ -66,6 +66,9 @@ public: static RankedSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/StartSymbol.cpp b/alib2data/src/alphabet/StartSymbol.cpp index 12a0555bb3c56ed9a65fcb3fa835d31f2c0331f6..2809d1d671d9723ea0b37744824cc8494396d5c4 100644 --- a/alib2data/src/alphabet/StartSymbol.cpp +++ b/alib2data/src/alphabet/StartSymbol.cpp @@ -10,6 +10,7 @@ #include "Symbol.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueSymbol.h" namespace alphabet { @@ -52,6 +53,14 @@ void StartSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(StartSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* StartSymbol::next() const { + return new UniqueSymbol(Symbol(*this), primitive::Integer(0)); +} + +SymbolBase* StartSymbol::inc() && { + return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0)); +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/StartSymbol.h b/alib2data/src/alphabet/StartSymbol.h index 284cebe1fb263d52d107c9cdc4decbb0024f5801..6b953c67662bbd125e8123fd3b67897c01bbbc09 100644 --- a/alib2data/src/alphabet/StartSymbol.h +++ b/alib2data/src/alphabet/StartSymbol.h @@ -47,6 +47,9 @@ public: static StartSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp b/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp index 0b39fd401d5436154edaea636d1a32d2698a47fc..48066a997fc037b069646b747812d1ed989cb986 100644 --- a/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp +++ b/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp @@ -10,6 +10,7 @@ #include "Symbol.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueSymbol.h" namespace alphabet { @@ -52,6 +53,14 @@ void SubtreeWildcardSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(SubtreeWildcardSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* SubtreeWildcardSymbol::next() const { + return new UniqueSymbol(Symbol(*this), primitive::Integer(0)); +} + +SymbolBase* SubtreeWildcardSymbol::inc() && { + return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0)); +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/SubtreeWildcardSymbol.h b/alib2data/src/alphabet/SubtreeWildcardSymbol.h index b3a218a8f632e58b1acdda8d7d00210f39d1697c..8a171f25cfe43b0b6b9f39e513b5f27c02da5eaa 100644 --- a/alib2data/src/alphabet/SubtreeWildcardSymbol.h +++ b/alib2data/src/alphabet/SubtreeWildcardSymbol.h @@ -47,6 +47,9 @@ public: static SubtreeWildcardSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/Symbol.cpp b/alib2data/src/alphabet/Symbol.cpp index 6a8377d69da48b654285549c48615f55f899a079..aa807a8540c84ec6a47ed96714b3327cfebe4da9 100644 --- a/alib2data/src/alphabet/Symbol.cpp +++ b/alib2data/src/alphabet/Symbol.cpp @@ -6,17 +6,26 @@ */ #include "Symbol.h" -#include "NextSymbol.h" #include "LabeledSymbol.h" #include <climits> #include "../exception/AlibException.h" namespace alphabet { +Symbol Symbol::next() const { + return Symbol(this->getData().next()); +} + +void Symbol::inc() { + SymbolBase* res = std::move(this->getData()).inc(); + if(res == NULL) return; + this->setData(res); +} + alphabet::Symbol createUniqueSymbol(alphabet::Symbol attempt, const std::set<alphabet::Symbol>& terminalAlphabet, const std::set<alphabet::Symbol>& nonterminalAlphabet) { int i = 0; do { - NextSymbol::nextSymbol(attempt); + attempt.inc(); if(terminalAlphabet.count(attempt) == 0 && nonterminalAlphabet.count(attempt) == 0) return attempt; } while(++i < INT_MAX); diff --git a/alib2data/src/alphabet/Symbol.h b/alib2data/src/alphabet/Symbol.h index a2bee2e591b03e38131ac8fadad60ed3abf26113..0d6dc592561d9d2a8c13df8621ea766503145d5b 100644 --- a/alib2data/src/alphabet/Symbol.h +++ b/alib2data/src/alphabet/Symbol.h @@ -22,6 +22,10 @@ namespace alphabet { */ class Symbol : public alib::wrapper<SymbolBase>, public alib::WrapperBase { using alib::wrapper<SymbolBase>::wrapper; + +public: + Symbol next() const; + void inc(); }; /** diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h index 3847a3aef9805a2d5c0f9c9230b7cbfec53082cb..6678117536c00729cebfc26d4a1393f6a1426954 100644 --- a/alib2data/src/alphabet/SymbolBase.h +++ b/alib2data/src/alphabet/SymbolBase.h @@ -41,6 +41,9 @@ public: virtual SymbolBase* clone() const = 0; virtual SymbolBase* plunder() && = 0; + + virtual SymbolBase* next() const = 0; + virtual SymbolBase* inc() && = 0; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolPairSymbol.cpp b/alib2data/src/alphabet/SymbolPairSymbol.cpp index beee6b3120515013e74e93e3442da42658bf01ee..7115f47487ff0ee10cd54a3e92197f9472e5ecc1 100644 --- a/alib2data/src/alphabet/SymbolPairSymbol.cpp +++ b/alib2data/src/alphabet/SymbolPairSymbol.cpp @@ -11,6 +11,7 @@ #include "Symbol.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueSymbol.h" namespace alphabet { @@ -70,6 +71,14 @@ void SymbolPairSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(SymbolPairSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* SymbolPairSymbol::next() const { + return new UniqueSymbol(Symbol(*this), primitive::Integer(0)); +} + +SymbolBase* SymbolPairSymbol::inc() && { + return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0)); +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/SymbolPairSymbol.h b/alib2data/src/alphabet/SymbolPairSymbol.h index 64324ef1615d2a8bb9196073c6fe87804da28a50..45de96964f8f9e8b7f7cb38d069d72e77d0da05d 100644 --- a/alib2data/src/alphabet/SymbolPairSymbol.h +++ b/alib2data/src/alphabet/SymbolPairSymbol.h @@ -55,6 +55,9 @@ public: static SymbolPairSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolSetSymbol.cpp b/alib2data/src/alphabet/SymbolSetSymbol.cpp index a3cbdb5a8d82aed8db5d8afab806d46525ff3084..14ce18816c00120f99248143425f9f438e9deb2c 100644 --- a/alib2data/src/alphabet/SymbolSetSymbol.cpp +++ b/alib2data/src/alphabet/SymbolSetSymbol.cpp @@ -10,6 +10,7 @@ #include "../sax/FromXMLParserHelper.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueSymbol.h" namespace alphabet { @@ -74,6 +75,14 @@ void SymbolSetSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(SymbolSetSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* SymbolSetSymbol::next() const { + return new UniqueSymbol(Symbol(*this), primitive::Integer(0)); +} + +SymbolBase* SymbolSetSymbol::inc() && { + return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0)); +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/SymbolSetSymbol.h b/alib2data/src/alphabet/SymbolSetSymbol.h index 201871b8ea3b072a8457403162fd42f603f8faa7..b5a59ef07587e3af4b44dac0c0b1a97adae92980 100644 --- a/alib2data/src/alphabet/SymbolSetSymbol.h +++ b/alib2data/src/alphabet/SymbolSetSymbol.h @@ -55,6 +55,9 @@ public: static SymbolSetSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/UniqueSymbol.cpp b/alib2data/src/alphabet/UniqueSymbol.cpp index 3d2ab7c31429a8b563d83af59badb4487cf02aed..9c2917a8db909a1ff4b8f5fa5ca49fbddede5e75 100644 --- a/alib2data/src/alphabet/UniqueSymbol.cpp +++ b/alib2data/src/alphabet/UniqueSymbol.cpp @@ -78,6 +78,15 @@ void UniqueSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(UniqueSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* UniqueSymbol::next() const { + return new UniqueSymbol(symbol, id.next()); +} + +SymbolBase* UniqueSymbol::inc() && { + id.inc(); + return NULL; +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/UniqueSymbol.h b/alib2data/src/alphabet/UniqueSymbol.h index c7b66ceb1aa2489ce23b66cdd67453ee480ad4fc..ebf2b294342923fc4d241c8f94089b9a704b9741 100644 --- a/alib2data/src/alphabet/UniqueSymbol.h +++ b/alib2data/src/alphabet/UniqueSymbol.h @@ -60,6 +60,9 @@ public: static UniqueSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/VariablesBarSymbol.cpp b/alib2data/src/alphabet/VariablesBarSymbol.cpp index 0d36d3a2df4f844b6cd36552174938f3d68ca4bb..53318373a285cd6c203afd315db9ee85bdcc21db 100644 --- a/alib2data/src/alphabet/VariablesBarSymbol.cpp +++ b/alib2data/src/alphabet/VariablesBarSymbol.cpp @@ -10,6 +10,7 @@ #include "Symbol.h" #include "../object/Object.h" #include "../XmlApi.hpp" +#include "UniqueSymbol.h" namespace alphabet { @@ -52,6 +53,14 @@ void VariablesBarSymbol::compose(std::deque<sax::Token>& out) const { out.emplace_back(VariablesBarSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); } +SymbolBase* VariablesBarSymbol::next() const { + return new UniqueSymbol(Symbol(*this), primitive::Integer(0)); +} + +SymbolBase* VariablesBarSymbol::inc() && { + return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0)); +} + } /* namespace alphabet */ namespace alib { diff --git a/alib2data/src/alphabet/VariablesBarSymbol.h b/alib2data/src/alphabet/VariablesBarSymbol.h index 9baccc7789c40b520e039ea29a78b6d7dd6dff82..c8c639f882c0341b4b7f55565adb65aaf4e18998 100644 --- a/alib2data/src/alphabet/VariablesBarSymbol.h +++ b/alib2data/src/alphabet/VariablesBarSymbol.h @@ -47,6 +47,9 @@ public: static VariablesBarSymbol parse(std::deque<sax::Token>::iterator& input); void compose(std::deque<sax::Token>& out) const; + + virtual SymbolBase* next() const; + virtual SymbolBase* inc() &&; }; } /* namespace alphabet */