From d8ff315e99fafa1f909ffd0c0c1c0b4418254202 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Fri, 1 Dec 2017 09:53:17 +0100 Subject: [PATCH] move string xml api code to seperate files --- alib2data/src/PrimitiveRegistrator.cpp | 4 +- alib2data/src/string/CyclicString.cpp | 9 --- alib2data/src/string/CyclicString.h | 24 -------- alib2data/src/string/Epsilon.cpp | 10 --- alib2data/src/string/Epsilon.h | 22 ------- alib2data/src/string/LinearString.cpp | 10 --- alib2data/src/string/LinearString.h | 27 +------- alib2data/src/string/StringBase.h | 26 -------- .../src/string/common/StringFromXMLParser.h | 55 ----------------- .../src/string/common/StringToXMLComposer.h | 50 --------------- alib2data/src/string/xml/CyclicString.cpp | 23 +++++++ alib2data/src/string/xml/CyclicString.h | 58 ++++++++++++++++++ alib2data/src/string/xml/Epsilon.cpp | 23 +++++++ alib2data/src/string/xml/Epsilon.h | 56 +++++++++++++++++ alib2data/src/string/xml/LinearString.cpp | 23 +++++++ alib2data/src/string/xml/LinearString.h | 58 ++++++++++++++++++ .../xml/common/StringFromXmlParserCommon.h | 61 +++++++++++++++++++ .../xml/common/StringToXmlComposerCommon.h | 52 ++++++++++++++++ alib2data/test-src/string/StringTest.cpp | 3 + .../string/LinearStringTerminatingSymbol.cpp | 48 +++++++++------ .../string/LinearStringTerminatingSymbol.h | 36 +++++------ 21 files changed, 410 insertions(+), 268 deletions(-) delete mode 100644 alib2data/src/string/common/StringFromXMLParser.h delete mode 100644 alib2data/src/string/common/StringToXMLComposer.h create mode 100644 alib2data/src/string/xml/CyclicString.cpp create mode 100644 alib2data/src/string/xml/CyclicString.h create mode 100644 alib2data/src/string/xml/Epsilon.cpp create mode 100644 alib2data/src/string/xml/Epsilon.h create mode 100644 alib2data/src/string/xml/LinearString.cpp create mode 100644 alib2data/src/string/xml/LinearString.h create mode 100644 alib2data/src/string/xml/common/StringFromXmlParserCommon.h create mode 100644 alib2data/src/string/xml/common/StringToXmlComposerCommon.h diff --git a/alib2data/src/PrimitiveRegistrator.cpp b/alib2data/src/PrimitiveRegistrator.cpp index daf566c8df..61c5be8abe 100644 --- a/alib2data/src/PrimitiveRegistrator.cpp +++ b/alib2data/src/PrimitiveRegistrator.cpp @@ -37,8 +37,8 @@ #include <alphabet/xml/RankedSymbol.h> #include <alphabet/xml/BottomOfTheStackSymbol.h> -#include <string/LinearString.h> -#include <string/Epsilon.h> +#include <string/xml/LinearString.h> +#include <string/xml/Epsilon.h> namespace { diff --git a/alib2data/src/string/CyclicString.cpp b/alib2data/src/string/CyclicString.cpp index 904bcaf1db..e6fb06edec 100644 --- a/alib2data/src/string/CyclicString.cpp +++ b/alib2data/src/string/CyclicString.cpp @@ -6,11 +6,8 @@ */ #include "CyclicString.h" -#include <string/String.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> #include <registration/CastRegistration.hpp> namespace { @@ -19,10 +16,4 @@ static auto CyclicStringFromEpsilon = registration::CastRegister < string::Cycli static auto valuePrinter = registration::ValuePrinterRegister < string::CyclicString < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < string::String, string::CyclicString < > > ( ); -static auto xmlWrite2 = registration::XmlWriterRegister < alib::Object, string::CyclicString < > > ( ); - -static auto xmlReader = registration::XmlReaderRegister < string::String, string::CyclicString < > > ( ); -static auto xmlReaded2 = registration::XmlReaderRegister < alib::Object, string::CyclicString < > > ( ); - } /* namespace */ diff --git a/alib2data/src/string/CyclicString.h b/alib2data/src/string/CyclicString.h index 78b2677d06..1c30d9fa29 100644 --- a/alib2data/src/string/CyclicString.h +++ b/alib2data/src/string/CyclicString.h @@ -14,13 +14,10 @@ #include <algorithm> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "StringBase.h" #include "StringFeatures.h" -#include "common/StringFromXMLParser.h" -#include "common/StringToXMLComposer.h" #include <exception/CommonException.h> #include <alphabet/common/SymbolNormalize.h> @@ -93,10 +90,6 @@ public: return xmlTagName; } - static CyclicString parse ( ext::deque < sax::Token >::iterator & input ); - - static void compose ( ext::deque < sax::Token > & out, const CyclicString & string ); - virtual alib::ObjectBase * inc ( ) &&; typedef CyclicString < > normalized_type; @@ -198,23 +191,6 @@ CyclicString < SymbolType >::operator std::string () const { return std::move(ss).str(); } -template < class SymbolType > -CyclicString < SymbolType > CyclicString < SymbolType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, CyclicString < >::getXmlTagName()); - ext::set<SymbolType> alphabet = StringFromXMLParser::parseAlphabet < SymbolType > (input); - ext::vector<SymbolType> content = StringFromXMLParser::parseContent < SymbolType > (input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, CyclicString < >::getXmlTagName()); - return CyclicString < SymbolType > ( std::move ( alphabet ), std::move ( content ) ); -} - -template < class SymbolType > -void CyclicString < SymbolType >::compose(ext::deque<sax::Token>& out, const CyclicString & string ) { - out.emplace_back(CyclicString::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - StringToXMLComposer::compose(out, string.getAlphabet()); - StringToXMLComposer::compose(out, string.m_Data); - out.emplace_back(CyclicString::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - template < class SymbolType > alib::ObjectBase* CyclicString < SymbolType >::inc() && { return new alib::UniqueObject(alib::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/string/Epsilon.cpp b/alib2data/src/string/Epsilon.cpp index bf9d6e745e..275ce6af7f 100644 --- a/alib2data/src/string/Epsilon.cpp +++ b/alib2data/src/string/Epsilon.cpp @@ -7,21 +7,11 @@ #include "Epsilon.h" -#include <string/String.h> -#include <object/Object.h> - #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> #include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < string::Epsilon < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < string::String, string::Epsilon < > > ( ); -static auto xmlWrite2 = registration::XmlWriterRegister < alib::Object, string::Epsilon < > > ( ); - -static auto xmlReader = registration::XmlReaderRegister < string::String, string::Epsilon < > > ( ); -static auto xmlReaded2 = registration::XmlReaderRegister < alib::Object, string::Epsilon < > > ( ); - } /* namespace */ diff --git a/alib2data/src/string/Epsilon.h b/alib2data/src/string/Epsilon.h index 05d080a99b..3947e1f3fd 100644 --- a/alib2data/src/string/Epsilon.h +++ b/alib2data/src/string/Epsilon.h @@ -11,14 +11,11 @@ #include <set> #include <vector> -#include <sax/FromXMLParserHelper.h> #include <core/components.hpp> #include <object/UniqueObject.h> #include "StringBase.h" #include "StringFeatures.h" -#include "common/StringFromXMLParser.h" -#include "common/StringToXMLComposer.h" #include <alphabet/common/SymbolNormalize.h> #include <core/normalize.hpp> @@ -85,10 +82,6 @@ public: return xmlTagName; } - static Epsilon parse ( ext::deque < sax::Token >::iterator & input ); - - static void compose ( ext::deque < sax::Token > & out, const Epsilon & epsilon ); - virtual alib::ObjectBase * inc ( ) &&; typedef Epsilon < > normalized_type; @@ -144,21 +137,6 @@ Epsilon < SymbolType > Epsilon < SymbolType >::EPSILON = Epsilon < SymbolType >( template < class SymbolType > const ext::vector<SymbolType> Epsilon < SymbolType >::content; -template < class SymbolType > -Epsilon < SymbolType > Epsilon < SymbolType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, Epsilon::getXmlTagName()); - ext::set<SymbolType> alphabet = StringFromXMLParser::parseAlphabet < SymbolType > (input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, Epsilon::getXmlTagName()); - return Epsilon < SymbolType > (alphabet); -} - -template < class SymbolType > -void Epsilon < SymbolType >::compose(ext::deque<sax::Token>& out, const Epsilon & epsilon ) { - out.emplace_back(Epsilon::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - StringToXMLComposer::compose(out, epsilon.getAlphabet()); - out.emplace_back(Epsilon::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - template < class SymbolType > alib::ObjectBase* Epsilon < SymbolType >::inc() && { return new alib::UniqueObject(alib::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/string/LinearString.cpp b/alib2data/src/string/LinearString.cpp index 9ea07ef435..9951a60cf0 100644 --- a/alib2data/src/string/LinearString.cpp +++ b/alib2data/src/string/LinearString.cpp @@ -7,11 +7,7 @@ #include "LinearString.h" -#include <string/String.h> -#include <object/Object.h> - #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> #include <registration/CastRegistration.hpp> #include <registration/SetRegistration.hpp> #include <registration/ComponentRegistration.hpp> @@ -39,10 +35,4 @@ static auto LinearStringSet = registration::SetRegister < string::LinearString < static auto valuePrinter = registration::ValuePrinterRegister < string::LinearString < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < string::String, string::LinearString < > > ( ); -static auto xmlWrite2 = registration::XmlWriterRegister < alib::Object, string::LinearString < > > ( ); - -static auto xmlReader = registration::XmlReaderRegister < string::String, string::LinearString < > > ( ); -static auto xmlReaded2 = registration::XmlReaderRegister < alib::Object, string::LinearString < > > ( ); - } /* namespace */ diff --git a/alib2data/src/string/LinearString.h b/alib2data/src/string/LinearString.h index 6c37e603d7..21d48e7d1f 100644 --- a/alib2data/src/string/LinearString.h +++ b/alib2data/src/string/LinearString.h @@ -13,18 +13,15 @@ #include <sstream> #include <algorithm> -#include <sax/FromXMLParserHelper.h> #include <core/components.hpp> #include <object/UniqueObject.h> #include "StringBase.h" #include "StringFeatures.h" -#include "common/StringFromXMLParser.h" -#include "common/StringToXMLComposer.h" #include <exception/CommonException.h> #include <alphabet/common/SymbolNormalize.h> -#include "../tree/TreeFeatures.h" +#include <tree/TreeFeatures.h> #include <core/normalize.hpp> @@ -119,10 +116,6 @@ public: return xmlTagName; } - static LinearString parse ( ext::deque < sax::Token >::iterator & input ); - - static void compose ( ext::deque < sax::Token > & out, const LinearString & string ); - virtual alib::ObjectBase * inc ( ) &&; typedef LinearString < > normalized_type; @@ -287,24 +280,6 @@ LinearString < SymbolType >::operator std::string ( ) const { return std::move ( ss ).str ( ); } -template < class SymbolType > -LinearString < SymbolType > LinearString < SymbolType >::parse ( ext::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, LinearString::getXmlTagName() ); - ext::set < SymbolType > alphabet = StringFromXMLParser::parseAlphabet < SymbolType > ( input ); - ext::vector < SymbolType > content = StringFromXMLParser::parseContent < SymbolType > ( input ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, LinearString::getXmlTagName() ); - - return LinearString < SymbolType > ( alphabet, content ); -} - -template < class SymbolType > -void LinearString < SymbolType >::compose ( ext::deque < sax::Token > & out, const LinearString & string ) { - out.emplace_back ( LinearString::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - StringToXMLComposer::compose ( out, string.getAlphabet() ); - StringToXMLComposer::compose ( out, string.m_Data ); - out.emplace_back ( LinearString::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); -} - template < class SymbolType > alib::ObjectBase* LinearString < SymbolType >::inc() && { return new alib::UniqueObject(alib::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/string/StringBase.h b/alib2data/src/string/StringBase.h index 5d6098657b..5f5493388a 100644 --- a/alib2data/src/string/StringBase.h +++ b/alib2data/src/string/StringBase.h @@ -10,8 +10,6 @@ #include <object/ObjectBase.h> -#include <core/xmlApi.hpp> - namespace string { /** @@ -25,28 +23,4 @@ public: } /* namespace string */ -namespace alib { - -template < typename Type > -struct xmlApi < Type, typename std::enable_if < std::is_base_of < string::StringBase, Type >::value >::type > { - static Type parse ( ext::deque < sax::Token >::iterator & input ) { - return Type::parse ( input ); - } - - static bool first ( const ext::deque < sax::Token >::const_iterator & input ) { - return sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName() ); - } - - static std::string xmlTagName ( ) { - return Type::getXmlTagName(); - } - - static void compose ( ext::deque < sax::Token > & output, const Type & data ) { - Type::compose ( output, data ); - } - -}; - -} /* namespace alib */ - #endif /* STRING_BASE_H_ */ diff --git a/alib2data/src/string/common/StringFromXMLParser.h b/alib2data/src/string/common/StringFromXMLParser.h deleted file mode 100644 index 75bdf0911c..0000000000 --- a/alib2data/src/string/common/StringFromXMLParser.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * StringFromXMLParser.h - * - * Created on: Nov 23, 2013 - * Author: Jan Travnicek - */ - -#ifndef STRING_FROM_XML_PARSER_H_ -#define STRING_FROM_XML_PARSER_H_ - -#include <vector> -#include <set> -#include <deque> -#include <sax/Token.h> -#include <sax/FromXMLParserHelper.h> -#include <core/xmlApi.hpp> - -namespace string { - -/** - * Parser used to get String from XML parsed into list of tokens. - */ -class StringFromXMLParser { -public: - template < class SymbolType > - static ext::vector<SymbolType> parseContent(ext::deque<sax::Token>::iterator& input); - template < class SymbolType > - static ext::set<SymbolType> parseAlphabet(ext::deque<sax::Token>::iterator& input); -}; - -template < class SymbolType > -ext::set<SymbolType> StringFromXMLParser::parseAlphabet(ext::deque<sax::Token>::iterator& input) { - ext::set<SymbolType> alphabet; - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet"); - while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - alphabet.insert(alib::xmlApi<SymbolType>::parse(input)); - } - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "alphabet"); - return alphabet; -} - -template < class SymbolType > -ext::vector<SymbolType> StringFromXMLParser::parseContent(ext::deque<sax::Token>::iterator& input) { - ext::vector<SymbolType> data; - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "content"); - while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - data.push_back(alib::xmlApi<SymbolType>::parse(input)); - } - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "content"); - return data; -} - -} /* namespace string */ - -#endif /* STRING_FROM_XML_PARSER_H_ */ diff --git a/alib2data/src/string/common/StringToXMLComposer.h b/alib2data/src/string/common/StringToXMLComposer.h deleted file mode 100644 index 6dfcdad298..0000000000 --- a/alib2data/src/string/common/StringToXMLComposer.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * StringToXMLComposer.h - * - * Created on: Nov 23, 2013 - * Author: Jan Travnciek - */ - -#ifndef STRING_TO_XML_COMPOSER_H_ -#define STRING_TO_XML_COMPOSER_H_ - -#include <deque> -#include <sax/Token.h> -#include <set> -#include <vector> -#include <core/xmlApi.hpp> - -namespace string { - -/** - * This class contains methods to print XML representation of string to the output stream. - */ -class StringToXMLComposer { -public: - template < class SymbolType > - static void compose(ext::deque<sax::Token>& out, const ext::set<SymbolType>& alphabet); - template < class SymbolType > - static void compose(ext::deque<sax::Token>& out, const ext::vector<SymbolType>& content); -}; - -template < class SymbolType > -void StringToXMLComposer::compose(ext::deque<sax::Token>& out, const ext::set<SymbolType>& alphabet) { - out.emplace_back("alphabet", sax::Token::TokenType::START_ELEMENT); - for (const auto& symbol : alphabet) { - alib::xmlApi<SymbolType>::compose(out, symbol); - } - out.emplace_back("alphabet", sax::Token::TokenType::END_ELEMENT); -} - -template < class SymbolType > -void StringToXMLComposer::compose(ext::deque<sax::Token>& out, const ext::vector<SymbolType>& content) { - out.emplace_back("content", sax::Token::TokenType::START_ELEMENT); - for(const auto& symbol : content) { - alib::xmlApi<SymbolType>::compose(out, symbol); - } - out.emplace_back("content", sax::Token::TokenType::END_ELEMENT); -} - -} /* namespace string */ - -#endif /* STRING_TO_XML_COMPOSER_H_ */ diff --git a/alib2data/src/string/xml/CyclicString.cpp b/alib2data/src/string/xml/CyclicString.cpp new file mode 100644 index 0000000000..543756a51d --- /dev/null +++ b/alib2data/src/string/xml/CyclicString.cpp @@ -0,0 +1,23 @@ +/* + * CyclicString.cpp + * + * Created on: Nov 23, 2013 + * Author: Jan Travnicek + */ + +#include "CyclicString.h" + +#include <string/String.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < string::String, string::CyclicString < > > ( ); +static auto xmlWrite2 = registration::XmlWriterRegister < alib::Object, string::CyclicString < > > ( ); + +static auto xmlReader = registration::XmlReaderRegister < string::String, string::CyclicString < > > ( ); +static auto xmlReaded2 = registration::XmlReaderRegister < alib::Object, string::CyclicString < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/string/xml/CyclicString.h b/alib2data/src/string/xml/CyclicString.h new file mode 100644 index 0000000000..d68a923856 --- /dev/null +++ b/alib2data/src/string/xml/CyclicString.h @@ -0,0 +1,58 @@ +/* + * CyclicString.h + * + * Created on: Dec 1, 2017 + * Author: Jan Travnicek + */ + +#ifndef _XML_CYCLIC_STRING_H_ +#define _XML_CYCLIC_STRING_H_ + +#include <string/CyclicString.h> +#include <core/xmlApi.hpp> + +#include <string/xml/common/StringFromXmlParserCommon.h> +#include <string/xml/common/StringToXmlComposerCommon.h> + +namespace alib { + +template < typename SymbolType > +struct xmlApi < string::CyclicString < SymbolType > > { + static string::CyclicString < SymbolType > parse ( ext::deque < sax::Token >::iterator & input ); + static bool first ( const ext::deque < sax::Token >::const_iterator & input ); + static const std::string & xmlTagName ( ); + static void compose ( ext::deque < sax::Token > & output, const string::CyclicString < SymbolType > & data ); +}; + +template < typename SymbolType > +string::CyclicString < SymbolType > xmlApi < string::CyclicString < SymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + ext::set<SymbolType> alphabet = string::StringFromXmlParserCommon::parseAlphabet < SymbolType > ( input ); + ext::vector<SymbolType> content = string::StringFromXmlParserCommon::parseContent < SymbolType > ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return string::CyclicString < SymbolType > ( std::move ( alphabet ), std::move ( content ) ); +} + +template < typename SymbolType > +bool xmlApi < string::CyclicString < SymbolType > >::first ( const ext::deque < sax::Token >::const_iterator & input ) { + return sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); +} + +template < typename SymbolType > +const std::string & xmlApi < string::CyclicString < SymbolType > >::xmlTagName ( ) { + static std::string xmlTagName = "CyclicString"; + + return xmlTagName; +} + +template < typename SymbolType > +void xmlApi < string::CyclicString < SymbolType > >::compose ( ext::deque < sax::Token > & output, const string::CyclicString < SymbolType > & input ) { + output.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + string::StringToXmlComposerCommon::compose ( output, input.getAlphabet ( ) ); + string::StringToXmlComposerCommon::compose ( output, input.getContent ( ) ); + output.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace alib */ + +#endif /* _XML_CYCLIC_STRING_H_ */ diff --git a/alib2data/src/string/xml/Epsilon.cpp b/alib2data/src/string/xml/Epsilon.cpp new file mode 100644 index 0000000000..93dbd07e0d --- /dev/null +++ b/alib2data/src/string/xml/Epsilon.cpp @@ -0,0 +1,23 @@ +/* + * Epsilon.cpp + * + * Created on: Jan 30, 2014 + * Author: Jan Travnicek + */ + +#include "Epsilon.h" + +#include <string/String.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < string::String, string::Epsilon < > > ( ); +static auto xmlWrite2 = registration::XmlWriterRegister < alib::Object, string::Epsilon < > > ( ); + +static auto xmlReader = registration::XmlReaderRegister < string::String, string::Epsilon < > > ( ); +static auto xmlReaded2 = registration::XmlReaderRegister < alib::Object, string::Epsilon < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/string/xml/Epsilon.h b/alib2data/src/string/xml/Epsilon.h new file mode 100644 index 0000000000..8431330213 --- /dev/null +++ b/alib2data/src/string/xml/Epsilon.h @@ -0,0 +1,56 @@ +/* + * Epsilon.h + * + * Created on: Dec 1, 2017 + * Author: Jan Travnicek + */ + +#ifndef _XML_EPSILON_H_ +#define _XML_EPSILON_H_ + +#include <string/Epsilon.h> +#include <core/xmlApi.hpp> + +#include <string/xml/common/StringFromXmlParserCommon.h> +#include <string/xml/common/StringToXmlComposerCommon.h> + +namespace alib { + +template < typename SymbolType > +struct xmlApi < string::Epsilon < SymbolType > > { + static string::Epsilon < SymbolType > parse ( ext::deque < sax::Token >::iterator & input ); + static bool first ( const ext::deque < sax::Token >::const_iterator & input ); + static const std::string & xmlTagName ( ); + static void compose ( ext::deque < sax::Token > & output, const string::Epsilon < SymbolType > & data ); +}; + +template < typename SymbolType > +string::Epsilon < SymbolType > xmlApi < string::Epsilon < SymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + ext::set < SymbolType > alphabet = string::StringFromXmlParserCommon::parseAlphabet < SymbolType > ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return string::Epsilon < SymbolType > ( std::move ( alphabet ) ); +} + +template < typename SymbolType > +bool xmlApi < string::Epsilon < SymbolType > >::first ( const ext::deque < sax::Token >::const_iterator & input ) { + return sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); +} + +template < typename SymbolType > +const std::string & xmlApi < string::Epsilon < SymbolType > >::xmlTagName ( ) { + static std::string xmlTagName = "Epsilon"; + + return xmlTagName; +} + +template < typename SymbolType > +void xmlApi < string::Epsilon < SymbolType > >::compose ( ext::deque < sax::Token > & output, const string::Epsilon < SymbolType > & input ) { + output.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + string::StringToXmlComposerCommon::compose ( output, input.getAlphabet ( ) ); + output.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace alib */ + +#endif /* _XML_EPSILON_H_ */ diff --git a/alib2data/src/string/xml/LinearString.cpp b/alib2data/src/string/xml/LinearString.cpp new file mode 100644 index 0000000000..ec90955889 --- /dev/null +++ b/alib2data/src/string/xml/LinearString.cpp @@ -0,0 +1,23 @@ +/* + * LinearString.cpp + * + * Created on: Nov 23, 2013 + * Author: Jan Travnicek + */ + +#include "LinearString.h" + +#include <string/String.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < string::String, string::LinearString < > > ( ); +static auto xmlWrite2 = registration::XmlWriterRegister < alib::Object, string::LinearString < > > ( ); + +static auto xmlReader = registration::XmlReaderRegister < string::String, string::LinearString < > > ( ); +static auto xmlReaded2 = registration::XmlReaderRegister < alib::Object, string::LinearString < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/string/xml/LinearString.h b/alib2data/src/string/xml/LinearString.h new file mode 100644 index 0000000000..490383ce40 --- /dev/null +++ b/alib2data/src/string/xml/LinearString.h @@ -0,0 +1,58 @@ +/* + * LinearString.h + * + * Created on: Dec 1, 2017 + * Author: Jan Travnicek + */ + +#ifndef _XML_LINEAR_STRING_H_ +#define _XML_LINEAR_STRING_H_ + +#include <string/LinearString.h> +#include <core/xmlApi.hpp> + +#include <string/xml/common/StringFromXmlParserCommon.h> +#include <string/xml/common/StringToXmlComposerCommon.h> + +namespace alib { + +template < typename SymbolType > +struct xmlApi < string::LinearString < SymbolType > > { + static string::LinearString < SymbolType > parse ( ext::deque < sax::Token >::iterator & input ); + static bool first ( const ext::deque < sax::Token >::const_iterator & input ); + static const std::string & xmlTagName ( ); + static void compose ( ext::deque < sax::Token > & output, const string::LinearString < SymbolType > & data ); +}; + +template < typename SymbolType > +string::LinearString < SymbolType > xmlApi < string::LinearString < SymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + ext::set<SymbolType> alphabet = string::StringFromXmlParserCommon::parseAlphabet < SymbolType > ( input ); + ext::vector<SymbolType> content = string::StringFromXmlParserCommon::parseContent < SymbolType > ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return string::LinearString < SymbolType > ( std::move ( alphabet ), std::move ( content ) ); +} + +template < typename SymbolType > +bool xmlApi < string::LinearString < SymbolType > >::first ( const ext::deque < sax::Token >::const_iterator & input ) { + return sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); +} + +template < typename SymbolType > +const std::string & xmlApi < string::LinearString < SymbolType > >::xmlTagName ( ) { + static std::string xmlTagName = "LinearString"; + + return xmlTagName; +} + +template < typename SymbolType > +void xmlApi < string::LinearString < SymbolType > >::compose ( ext::deque < sax::Token > & output, const string::LinearString < SymbolType > & input ) { + output.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + string::StringToXmlComposerCommon::compose ( output, input.getAlphabet ( ) ); + string::StringToXmlComposerCommon::compose ( output, input.getContent ( ) ); + output.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace alib */ + +#endif /* _XML_LINEAR_STRING_H_ */ diff --git a/alib2data/src/string/xml/common/StringFromXmlParserCommon.h b/alib2data/src/string/xml/common/StringFromXmlParserCommon.h new file mode 100644 index 0000000000..fc021708c1 --- /dev/null +++ b/alib2data/src/string/xml/common/StringFromXmlParserCommon.h @@ -0,0 +1,61 @@ +/* + * StringFromXmlParserCommon.h + * + * Created on: Nov 23, 2013 + * Author: Jan Travnicek + */ + +#ifndef STRING_FROM_XML_PARSER_COMMON_H_ +#define STRING_FROM_XML_PARSER_COMMON_H_ + +#include <vector> +#include <set> +#include <deque> +#include <sax/Token.h> +#include <sax/FromXMLParserHelper.h> +#include <core/xmlApi.hpp> + +namespace string { + +/** + * Parser used to get String from Xml parsed into list of tokens. + */ +class StringFromXmlParserCommon { +public: + template < class SymbolType > + static ext::vector < SymbolType > parseContent ( ext::deque < sax::Token >::iterator & input ); + template < class SymbolType > + static ext::set < SymbolType > parseAlphabet ( ext::deque < sax::Token >::iterator & input ); +}; + +template < class SymbolType > +ext::set < SymbolType > StringFromXmlParserCommon::parseAlphabet ( ext::deque < sax::Token >::iterator & input ) { + ext::set < SymbolType > alphabet; + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "alphabet" ); + + while ( sax::FromXMLParserHelper::isTokenType ( input, sax::Token::TokenType::START_ELEMENT ) ) + alphabet.insert ( alib::xmlApi < SymbolType >::parse ( input ) ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "alphabet" ); + + return alphabet; +} + +template < class SymbolType > +ext::vector < SymbolType > StringFromXmlParserCommon::parseContent ( ext::deque < sax::Token >::iterator & input ) { + ext::vector < SymbolType > data; + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "content" ); + + while ( sax::FromXMLParserHelper::isTokenType ( input, sax::Token::TokenType::START_ELEMENT ) ) + data.push_back ( alib::xmlApi < SymbolType >::parse ( input ) ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "content" ); + + return data; +} + +} /* namespace string */ + +#endif /* STRING_FROM_XML_PARSER_COMMON_H_ */ diff --git a/alib2data/src/string/xml/common/StringToXmlComposerCommon.h b/alib2data/src/string/xml/common/StringToXmlComposerCommon.h new file mode 100644 index 0000000000..7fd88b0f15 --- /dev/null +++ b/alib2data/src/string/xml/common/StringToXmlComposerCommon.h @@ -0,0 +1,52 @@ +/* + * StringToXmlComposerCommon.h + * + * Created on: Nov 23, 2013 + * Author: Jan Travnciek + */ + +#ifndef STRING_TO_XML_COMPOSER_COMMON_H_ +#define STRING_TO_XML_COMPOSER_COMMON_H_ + +#include <deque> +#include <sax/Token.h> +#include <set> +#include <vector> +#include <core/xmlApi.hpp> + +namespace string { + +/** + * This class contains methods to print Xml representation of string to the output stream. + */ +class StringToXmlComposerCommon { +public: + template < class SymbolType > + static void compose ( ext::deque < sax::Token > & out, const ext::set < SymbolType > & alphabet ); + template < class SymbolType > + static void compose ( ext::deque < sax::Token > & out, const ext::vector < SymbolType > & content ); +}; + +template < class SymbolType > +void StringToXmlComposerCommon::compose ( ext::deque < sax::Token > & out, const ext::set < SymbolType > & alphabet ) { + out.emplace_back ( "alphabet", sax::Token::TokenType::START_ELEMENT ); + + for ( const SymbolType & symbol : alphabet ) + alib::xmlApi < SymbolType >::compose ( out, symbol ); + + out.emplace_back ( "alphabet", sax::Token::TokenType::END_ELEMENT ); +} + +template < class SymbolType > +void StringToXmlComposerCommon::compose(ext::deque<sax::Token>& out, const ext::vector<SymbolType>& content) { + out.emplace_back ( "content", sax::Token::TokenType::START_ELEMENT ); + + for ( const SymbolType & symbol : content ) + alib::xmlApi < SymbolType >::compose ( out, symbol ); + + out.emplace_back ( "content", sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace string */ + +#endif /* STRING_TO_XML_COMPOSER_COMMON_H_ */ diff --git a/alib2data/test-src/string/StringTest.cpp b/alib2data/test-src/string/StringTest.cpp index e5b09557fd..3ba87b1d20 100644 --- a/alib2data/test-src/string/StringTest.cpp +++ b/alib2data/test-src/string/StringTest.cpp @@ -7,8 +7,11 @@ #include "string/String.h" #include "string/LinearString.h" +#include "string/xml/LinearString.h" #include "string/CyclicString.h" +#include "string/xml/CyclicString.h" #include "string/Epsilon.h" +#include "string/xml/Epsilon.h" #include "factory/XmlDataFactory.hpp" diff --git a/alib2data_experimental/src/string/LinearStringTerminatingSymbol.cpp b/alib2data_experimental/src/string/LinearStringTerminatingSymbol.cpp index 0542dcd2f4..57e0789a57 100644 --- a/alib2data_experimental/src/string/LinearStringTerminatingSymbol.cpp +++ b/alib2data_experimental/src/string/LinearStringTerminatingSymbol.cpp @@ -13,8 +13,8 @@ #include <algorithm> #include <sax/FromXMLParserHelper.h> -#include <string/common/StringFromXMLParser.h> -#include <string/common/StringToXMLComposer.h> +#include <string/xml/common/StringFromXmlParserCommon.h> +#include <string/xml/common/StringToXmlComposerCommon.h> #include <string/String.h> #include <object/Object.h> #include <object/UniqueObject.h> @@ -100,29 +100,43 @@ LinearStringTerminatingSymbol::operator std::string ( ) const { return std::move ( ss ).str ( ); } -LinearStringTerminatingSymbol LinearStringTerminatingSymbol::parse ( ext::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, LinearStringTerminatingSymbol::getXmlTagName() ); - ext::set < DefaultSymbolType > alphabet = StringFromXMLParser::parseAlphabet < DefaultSymbolType > ( input ); +alib::ObjectBase* LinearStringTerminatingSymbol::inc() && { + return new alib::UniqueObject(alib::Object(std::move(*this)), primitive::Integer(0)); +} + +} /* namespace string */ + +namespace alib { + +string::LinearStringTerminatingSymbol xmlApi < string::LinearStringTerminatingSymbol >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + ext::set < DefaultSymbolType > alphabet = string::StringFromXmlParserCommon::parseAlphabet < DefaultSymbolType > ( input ); DefaultSymbolType terminatingSymbol = alib::xmlApi < DefaultSymbolType >::parse ( input ); - ext::vector < DefaultSymbolType > content = StringFromXMLParser::parseContent < DefaultSymbolType > ( input ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, LinearStringTerminatingSymbol::getXmlTagName() ); + ext::vector < DefaultSymbolType > content = string::StringFromXmlParserCommon::parseContent < DefaultSymbolType > ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); - return LinearStringTerminatingSymbol ( alphabet, terminatingSymbol, content ); + return string::LinearStringTerminatingSymbol ( alphabet, terminatingSymbol, content ); } -void LinearStringTerminatingSymbol::compose ( ext::deque < sax::Token > & out, const LinearStringTerminatingSymbol & string ) { - out.emplace_back ( LinearStringTerminatingSymbol::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - StringToXMLComposer::compose ( out, string.getAlphabet() ); - alib::xmlApi < DefaultSymbolType >::compose ( out, string.getTerminatingSymbol ( ) ); - StringToXMLComposer::compose ( out, string.m_Data ); - out.emplace_back ( LinearStringTerminatingSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); +bool xmlApi < string::LinearStringTerminatingSymbol >::first ( const ext::deque < sax::Token >::const_iterator & input ) { + return sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); } -alib::ObjectBase* LinearStringTerminatingSymbol::inc() && { - return new alib::UniqueObject(alib::Object(std::move(*this)), primitive::Integer(0)); +const std::string & xmlApi < string::LinearStringTerminatingSymbol >::xmlTagName ( ) { + static std::string xmlTagName = "LinearStringTerminatingSymbol"; + + return xmlTagName; } -} /* namespace string */ +void xmlApi < string::LinearStringTerminatingSymbol >::compose ( ext::deque < sax::Token > & output, const string::LinearStringTerminatingSymbol & data ) { + output.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + string::StringToXmlComposerCommon::compose ( output, data.getAlphabet() ); + alib::xmlApi < DefaultSymbolType >::compose ( output, data.getTerminatingSymbol ( ) ); + string::StringToXmlComposerCommon::compose ( output, data.getContent ( ) ); + output.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace alib */ namespace { diff --git a/alib2data_experimental/src/string/LinearStringTerminatingSymbol.h b/alib2data_experimental/src/string/LinearStringTerminatingSymbol.h index 353fc281e0..cf56b29512 100644 --- a/alib2data_experimental/src/string/LinearStringTerminatingSymbol.h +++ b/alib2data_experimental/src/string/LinearStringTerminatingSymbol.h @@ -11,6 +11,7 @@ #include <iostream> #include <set> #include <vector> +#include <deque> #include <string/StringBase.h> #include <string/StringFeatures.h> @@ -18,6 +19,9 @@ #include <alphabet/Symbol.h> #include <core/components.hpp> +#include <sax/Token.h> +#include <core/xmlApi.hpp> + namespace string { class GeneralAlphabet; @@ -80,16 +84,6 @@ public: virtual explicit operator std::string ( ) const; - static const std::string & getXmlTagName() { - static std::string xmlTagName = "LinearStringTerminatingSymbol"; - - return xmlTagName; - } - - static LinearStringTerminatingSymbol parse ( ext::deque < sax::Token >::iterator & input ); - - static void compose ( ext::deque < sax::Token > & out, const LinearStringTerminatingSymbol & string ); - virtual alib::ObjectBase * inc ( ) &&; typedef LinearStringTerminatingSymbol normalized_type; @@ -100,29 +94,37 @@ public: namespace alib { template < > -class SetConstraint< ::string::LinearStringTerminatingSymbol, DefaultSymbolType, ::string::GeneralAlphabet > { +struct xmlApi < string::LinearStringTerminatingSymbol > { + static string::LinearStringTerminatingSymbol parse ( ext::deque < sax::Token >::iterator & input ); + static bool first ( const ext::deque < sax::Token >::const_iterator & input ); + static const std::string & xmlTagName ( ); + static void compose ( ext::deque < sax::Token > & output, const string::LinearStringTerminatingSymbol & data ); +}; + +template < > +class SetConstraint< string::LinearStringTerminatingSymbol, DefaultSymbolType, string::GeneralAlphabet > { public: - static bool used ( const ::string::LinearStringTerminatingSymbol & str, const DefaultSymbolType & symbol ) { + static bool used ( const string::LinearStringTerminatingSymbol & str, const DefaultSymbolType & symbol ) { const ext::vector<DefaultSymbolType>& content = str.getContent ( ); return std::find(content.begin(), content.end(), symbol) != content.end(); } - static bool available ( const ::string::LinearStringTerminatingSymbol &, const DefaultSymbolType & ) { + static bool available ( const string::LinearStringTerminatingSymbol &, const DefaultSymbolType & ) { return true; } - static void valid ( const ::string::LinearStringTerminatingSymbol &, const DefaultSymbolType & ) { + static void valid ( const string::LinearStringTerminatingSymbol &, const DefaultSymbolType & ) { } }; template < > -class ElementConstraint< ::string::LinearStringTerminatingSymbol, DefaultSymbolType, ::string::TerminatingSymbol > { +class ElementConstraint< string::LinearStringTerminatingSymbol, DefaultSymbolType, string::TerminatingSymbol > { public: - static bool available ( const ::string::LinearStringTerminatingSymbol & str, const DefaultSymbolType & symbol ) { + static bool available ( const string::LinearStringTerminatingSymbol & str, const DefaultSymbolType & symbol ) { return str.getAlphabet ( ).count ( symbol ); } - static void valid ( const ::string::LinearStringTerminatingSymbol &, const DefaultSymbolType & ) { + static void valid ( const string::LinearStringTerminatingSymbol &, const DefaultSymbolType & ) { } }; -- GitLab