diff --git a/alib2data/src/alphabet/NonlinearVariableSymbol.cpp b/alib2data/src/alphabet/NonlinearVariableSymbol.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f58bea6d8c8d94a33ab07d59fd0000258e1d3bcf --- /dev/null +++ b/alib2data/src/alphabet/NonlinearVariableSymbol.cpp @@ -0,0 +1,80 @@ +/* + * NonlinearVariableSymbol.cpp + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#include "NonlinearVariableSymbol.h" +#include <sax/FromXMLParserHelper.h> +#include "Symbol.h" +#include <object/Object.h> +#include <XmlApi.hpp> +#include "UniqueSymbol.h" + +namespace alphabet { + +NonlinearVariableSymbol::NonlinearVariableSymbol ( int number ) : symbol ( alphabet::symbolFrom ( number ) ) { +} + +NonlinearVariableSymbol::NonlinearVariableSymbol ( char character ) : symbol ( alphabet::symbolFrom ( character ) ) { +} + +NonlinearVariableSymbol::NonlinearVariableSymbol ( std::string symbol ) : symbol ( alphabet::symbolFrom ( std::move ( symbol ) ) ) { +} + +NonlinearVariableSymbol::NonlinearVariableSymbol ( alphabet::Symbol symbol ) : symbol ( std::move ( symbol ) ) { +} + +SymbolBase * NonlinearVariableSymbol::clone ( ) const { + return new NonlinearVariableSymbol ( * this ); +} + +SymbolBase * NonlinearVariableSymbol::plunder ( ) && { + return new NonlinearVariableSymbol ( std::move ( * this ) ); +} + +int NonlinearVariableSymbol::compare ( const NonlinearVariableSymbol & other ) const { + return this->symbol.getData ( ).compare ( other.symbol.getData ( ) ); +} + +void NonlinearVariableSymbol::operator >>( std::ostream & out ) const { + out << "(NonlinearVariableSymbol " << symbol << ")"; +} + +NonlinearVariableSymbol::operator std::string ( ) const { + return "$" + ( std::string ) symbol; +} + +const std::string NonlinearVariableSymbol::XML_TAG_NAME = "NonlinearVariableSymbol"; + +NonlinearVariableSymbol NonlinearVariableSymbol::parse ( std::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, NonlinearVariableSymbol::XML_TAG_NAME ); + alphabet::Symbol data = alib::xmlApi < alphabet::Symbol >::parse ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, NonlinearVariableSymbol::XML_TAG_NAME ); + + return NonlinearVariableSymbol ( data ); +} + +void NonlinearVariableSymbol::compose ( std::deque < sax::Token > & out ) const { + out.emplace_back ( NonlinearVariableSymbol::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); + alib::xmlApi < alphabet::Symbol >::compose ( out, symbol ); + out.emplace_back ( NonlinearVariableSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); +} + +SymbolBase * NonlinearVariableSymbol::next ( ) const { + return new UniqueSymbol ( Symbol ( * this ), primitive::Integer ( 0 ) ); +} + +SymbolBase * NonlinearVariableSymbol::inc ( ) && { + return new UniqueSymbol ( Symbol ( std::move ( * this ) ), primitive::Integer ( 0 ) ); +} + +} /* namespace alphabet */ + +namespace alib { + +auto nonlinearVariableSymbolParserRegister = xmlApi < alphabet::Symbol >::ParserRegister < alphabet::NonlinearVariableSymbol > ( ); +auto nonlinearVariableSymbolParserRegister2 = xmlApi < alib::Object >::ParserRegister < alphabet::NonlinearVariableSymbol > ( ); + +} /* namespace alib */ diff --git a/alib2data/src/alphabet/NonlinearVariableSymbol.h b/alib2data/src/alphabet/NonlinearVariableSymbol.h new file mode 100644 index 0000000000000000000000000000000000000000..6a34fe0817f0ac7832be36edddeae1da20e85011 --- /dev/null +++ b/alib2data/src/alphabet/NonlinearVariableSymbol.h @@ -0,0 +1,72 @@ +/* + * NonlinearVariableSymbol.h + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#ifndef NONLINEAR_VARIABLE_SYMBOL_H_ +#define NONLINEAR_VARIABLE_SYMBOL_H_ + +#include "Symbol.h" + +namespace alphabet { + +/** + * Represents subtreeWildcard symbol for tree linearization. + */ +class NonlinearVariableSymbol : public SymbolBase { + alphabet::Symbol symbol; + +public: + explicit NonlinearVariableSymbol ( int number ); + explicit NonlinearVariableSymbol ( char character ); + explicit NonlinearVariableSymbol ( std::string symbol ); + explicit NonlinearVariableSymbol ( alphabet::Symbol symbol ); + + /** + * Creates a subtreeWildcard symbol. + * @param symbol name of the symbol + */ + explicit NonlinearVariableSymbol ( ); + + virtual SymbolBase * clone ( ) const; + virtual SymbolBase * plunder ( ) &&; + + virtual int compare ( const ObjectBase & other ) const { + if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other ); + + return std::type_index ( typeid ( * this ) ) - std::type_index ( typeid ( other ) ); + } + + virtual int compare ( const NonlinearVariableSymbol & other ) const; + + virtual void operator >>( std::ostream & out ) const; + + virtual explicit operator std::string ( ) const; + + const static std::string XML_TAG_NAME; + + static NonlinearVariableSymbol parse ( std::deque < sax::Token >::iterator & input ); + + void compose ( std::deque < sax::Token > & out ) const; + + virtual SymbolBase * next ( ) const; + virtual SymbolBase * inc ( ) &&; +}; + +} /* namespace alphabet */ + +namespace std { + +template < > +struct compare < alphabet::NonlinearVariableSymbol > { + int operator ()( const alphabet::NonlinearVariableSymbol & first, const alphabet::NonlinearVariableSymbol & second ) const { + return first.compare ( second ); + } + +}; + +} /* namespace std */ + +#endif /* NONLINEAR_VARIABLE_SYMBOL_H_ */