Skip to content
Snippets Groups Projects
AutomatonNormalize.h 3.93 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include <alib/deque>
    #include <alib/vector>
    #include <alib/set>
    
    #include <alib/multiset>
    
    #include <alib/map>
    
    
    #include <regexp/unbounded/UnboundedRegExpStructure.h>
    
    #include <alphabet/common/SymbolNormalize.h>
    
    #include <regexp/common/RegExpNormalize.h>
    #include <rte/common/RTENormalizeVariant.h>
    
    #include <common/DefaultStateType.h>
    #include <common/DefaultSymbolType.h>
    
    #include <common/symbol_or_epsilon.hpp>
    
    namespace automaton {
    
    /**
     * This class contains methods to print XML representation of automata to the output stream.
     */
    class AutomatonNormalize {
    public:
    
    	template < class StateType >
    	static ext::multiset < DefaultStateType > normalizeStates ( ext::multiset < StateType > && states );
    
    
    	template < class StateType >
    
    	static ext::set < DefaultStateType > normalizeStates ( ext::set < StateType > && states );
    
    
    	template < class StateType >
    
    	static ext::vector < DefaultStateType > normalizeStates ( ext::vector < StateType > && states );
    
    
    	template < class StateType >
    	static DefaultStateType normalizeState ( StateType && state);
    
    
    	template < class SymbolType >
    	static common::symbol_or_epsilon < DefaultSymbolType > normalizeSymbolEpsilon ( common::symbol_or_epsilon < SymbolType > && symbol );
    
    
    	template < class SymbolType >
    	static regexp::UnboundedRegExpStructure < DefaultSymbolType > normalizeRegExp ( regexp::UnboundedRegExpStructure < SymbolType > && regexp );
    
    
    	template < class SymbolType, class StateType >
    	static rte::FormalRTEStructure < ext::variant < DefaultSymbolType, DefaultStateType > > normalizeRTE ( rte::FormalRTEStructure < ext::variant < SymbolType, StateType > > && rte );
    
    template < class StateType >
    ext::multiset < DefaultStateType > AutomatonNormalize::normalizeStates ( ext::multiset < StateType > && states ) {
    	ext::multiset < DefaultStateType > res;
    	for ( StateType && state : ext::make_mover ( states ) )
    		res.insert ( normalizeState ( std::move ( state ) ) );
    
    	return res;
    }
    
    
    template < class StateType >
    
    ext::set < DefaultStateType > AutomatonNormalize::normalizeStates ( ext::set < StateType > && states ) {
    	ext::set < DefaultStateType > res;
    
    	for ( StateType && state : ext::make_mover ( states ) )
    
    		res.insert ( normalizeState ( std::move ( state ) ) );
    
    	return res;
    }
    
    template < class StateType >
    
    ext::vector < DefaultStateType > AutomatonNormalize::normalizeStates ( ext::vector < StateType > && states ) {
    	ext::vector < DefaultStateType > res;
    
    	for ( StateType & state : states )
    
    		res.push_back ( normalizeState ( std::move ( state ) ) );
    
    	return res;
    }
    
    
    template < class StateType >
    DefaultStateType AutomatonNormalize::normalizeState ( StateType && state) {
    
    	return factory::NormalizeFactory::normalize < StateType > ( std::forward < StateType > ( state ) );
    
    template < class SymbolType >
    common::symbol_or_epsilon < DefaultSymbolType > AutomatonNormalize::normalizeSymbolEpsilon ( common::symbol_or_epsilon < SymbolType > && symbol ) {
    	if ( symbol.is_epsilon ( ) )
    		return common::symbol_or_epsilon < DefaultSymbolType > ( );
    
    		return common::symbol_or_epsilon < DefaultSymbolType > ( alphabet::SymbolNormalize::normalizeSymbol ( std::move ( symbol ).getSymbol ( ) ) );
    
    }
    
    template < class SymbolType >
    regexp::UnboundedRegExpStructure < DefaultSymbolType > AutomatonNormalize::normalizeRegExp ( regexp::UnboundedRegExpStructure < SymbolType > && regexp ) {
    
    	return regexp::UnboundedRegExpStructure < DefaultSymbolType > ( std::move ( * regexp::RegExpNormalize::normalize < SymbolType > ( std::move ( regexp ).getStructure ( ) ) ) );
    }
    
    template < class SymbolType, class StateType >
    rte::FormalRTEStructure < ext::variant < DefaultSymbolType, DefaultStateType > > AutomatonNormalize::normalizeRTE ( rte::FormalRTEStructure < ext::variant < SymbolType, StateType > > && rte ) {
    	return rte::FormalRTEStructure < ext::variant < DefaultSymbolType, DefaultStateType > > ( std::move ( * rte::RTENormalizeVariant::normalize < SymbolType, StateType > ( std::move ( rte ).getStructure ( ) ) ) );
    
    }
    
    } /* namespace automaton */