diff --git a/alib2data/src/rte/formal/FormalRTE.cpp b/alib2data/src/rte/formal/FormalRTE.cpp index dcbe1144122b509a2fce5dfa92976439a547b194..15a944696ad0dececa28050386ac28c656811dea 100644 --- a/alib2data/src/rte/formal/FormalRTE.cpp +++ b/alib2data/src/rte/formal/FormalRTE.cpp @@ -1,5 +1,4 @@ #include "FormalRTE.h" -#include <exception/CommonException.h> #include "FormalRTEEmpty.h" #include "FormalRTESymbol.h" @@ -19,7 +18,7 @@ namespace rte { -FormalRTE::FormalRTE ( std::set < alphabet::RankedSymbol > alphabetF, std::set < alphabet::RankedSymbol > alphabetK, FormalRTEElement && rte ) : std::Components < FormalRTE, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, ConstantAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabetF ), std::move ( alphabetK ) ), std::tuple < > ( ) ), rte ( NULL ) { +FormalRTE::FormalRTE ( std::set < alphabet::RankedSymbol > alphabetF, std::set < alphabet::RankedSymbol > alphabetK, FormalRTEElement && rte ) : std::Components2 < FormalRTE, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, ConstantAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabetF ), std::move ( alphabetK ) ), std::tuple < > ( ) ), rte ( NULL ) { setRTE ( std::move ( rte ) ); } @@ -51,11 +50,11 @@ FormalRTE::FormalRTE ( const FormalRTEElement & rte ) : FormalRTE ( rte.computeM FormalRTE::FormalRTE ( FormalRTEElement && rte ) : FormalRTE ( rte.computeMinimalAlphabets ( ), rte ) { } -FormalRTE::FormalRTE ( const FormalRTE & other ) : std::Components < FormalRTE, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, ConstantAlphabet >, std::tuple < > > ( std::make_tuple ( other.getAlphabet ( ), other.getConstantAlphabet ( ) ), std::tuple < > ( ) ), rte ( other.rte ) { +FormalRTE::FormalRTE ( const FormalRTE & other ) : std::Components2 < FormalRTE, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, ConstantAlphabet >, std::tuple < > > ( std::make_tuple ( other.getAlphabet ( ), other.getConstantAlphabet ( ) ), std::tuple < > ( ) ), rte ( other.rte ) { this->rte->attachRTE ( this ); } -FormalRTE::FormalRTE ( FormalRTE && other ) noexcept : std::Components < FormalRTE, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, ConstantAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ), std::move ( other.accessComponent < ConstantAlphabet > ( ).get ( ) ) ), std::tuple < > ( ) ), rte ( std::move ( other.rte ) ) { +FormalRTE::FormalRTE ( FormalRTE && other ) noexcept : std::Components2 < FormalRTE, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, ConstantAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ), std::move ( other.accessComponent < ConstantAlphabet > ( ).get ( ) ) ), std::tuple < > ( ) ), rte ( std::move ( other.rte ) ) { this->rte->attachRTE ( this ); } @@ -145,46 +144,6 @@ void FormalRTE::compose ( std::deque < sax::Token > & out ) const { } /* namespace rte */ -namespace std { - -template < > -bool rte::FormalRTE::Component < rte::FormalRTE, alphabet::RankedSymbol, rte::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const { - return static_cast < const rte::FormalRTE * > ( this )->getRTE ( ).testSymbol ( symbol ); -} - -template < > -bool rte::FormalRTE::Component < rte::FormalRTE, alphabet::RankedSymbol, rte::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const { - return true; -} - -template < > -void rte::FormalRTE::Component < rte::FormalRTE, alphabet::RankedSymbol, rte::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & symbol ) const { - const rte::FormalRTE * rte = static_cast < const rte::FormalRTE * > ( this ); - - if ( rte->accessComponent < rte::ConstantAlphabet > ( ).get ( ).count ( symbol ) ) - throw ::exception::CommonException ( "Symbol " + ( std::string ) symbol + "cannot be in general alphabet since it is already in constant alphabet" ); -} - -template < > -bool rte::FormalRTE::Component < rte::FormalRTE, alphabet::RankedSymbol, rte::ConstantAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const { - return static_cast < const rte::FormalRTE * > ( this )->getRTE ( ).testSymbol ( symbol ); -} - -template < > -bool rte::FormalRTE::Component < rte::FormalRTE, alphabet::RankedSymbol, rte::ConstantAlphabet >::available ( const alphabet::RankedSymbol & ) const { - return true; -} - -template < > -void rte::FormalRTE::Component < rte::FormalRTE, alphabet::RankedSymbol, rte::ConstantAlphabet >::valid ( const alphabet::RankedSymbol & symbol ) const { - const rte::FormalRTE * rte = static_cast < const rte::FormalRTE * > ( this ); - - if ( rte->accessComponent < rte::GeneralAlphabet > ( ).get ( ).count ( symbol ) ) - throw ::exception::CommonException ( "Symbol " + ( std::string ) symbol + "cannot be in constant alphabet since it is already in general alphabet" ); -} - -} /* namespace std */ - namespace alib { auto formalRTEParserRegister = xmlApi < rte::RTE >::ParserRegister < rte::FormalRTE > ( ); diff --git a/alib2data/src/rte/formal/FormalRTE.h b/alib2data/src/rte/formal/FormalRTE.h index 5e4ae0ad86d3d9ac14d1c21af73dd3829852963e..a2fbdeeb2613b8e3a699cf79c3b002993a4cd45f 100644 --- a/alib2data/src/rte/formal/FormalRTE.h +++ b/alib2data/src/rte/formal/FormalRTE.h @@ -3,9 +3,10 @@ #include <string> #include <set> +#include <exception/CommonException.h> #include "FormalRTEElement.h" #include "../RTEBase.h" -#include <core/components.hpp> +#include <core/components2.hpp> namespace rte { @@ -19,7 +20,7 @@ class ConstantAlphabet; * Represents regular tree expression parsed from the XML. Regular tree expression is stored * as a tree of RTEElement elements. */ -class FormalRTE : public RTEBase, public std::Components < FormalRTE, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, ConstantAlphabet >, std::tuple < > > { +class FormalRTE : public RTEBase, public std::Components2 < FormalRTE, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, ConstantAlphabet >, std::tuple < > > { protected: std::smart_ptr < FormalRTEElement > rte; @@ -146,4 +147,42 @@ public: } /* namespace rte */ +namespace std { + +template < > +class ComponentConstraint2< rte::FormalRTE, alphabet::RankedSymbol, rte::GeneralAlphabet > { +public: + static bool used ( const rte::FormalRTE & rte, const alphabet::RankedSymbol & symbol ) { + return rte.getRTE ( ).testSymbol ( symbol ); + } + + static bool available ( const rte::FormalRTE &, const alphabet::RankedSymbol & ) { + return true; + } + + static void valid ( const rte::FormalRTE & rte, const alphabet::RankedSymbol & symbol ) { + if ( rte.accessComponent < rte::ConstantAlphabet > ( ).get ( ).count ( symbol ) ) + throw ::exception::CommonException ( "Symbol " + ( std::string ) symbol + "cannot be in general alphabet since it is already in constant alphabet" ); + } +}; + +template < > +class ComponentConstraint2< rte::FormalRTE, alphabet::RankedSymbol, rte::ConstantAlphabet > { +public: + static bool used ( const rte::FormalRTE & rte, const alphabet::RankedSymbol & symbol ) { + return rte.getRTE ( ).testSymbol ( symbol ); + } + + static bool available ( const rte::FormalRTE &, const alphabet::RankedSymbol & ) { + return true; + } + + static void valid ( const rte::FormalRTE & rte, const alphabet::RankedSymbol & symbol ) { + if ( rte.accessComponent < rte::GeneralAlphabet > ( ).get ( ).count ( symbol ) ) + throw ::exception::CommonException ( "Symbol " + ( std::string ) symbol + "cannot be in constant alphabet since it is already in general alphabet" ); + } +}; + +} /* namespace std */ + #endif /* FORMAL_RTE_H_ */