Newer
Older
#pragma once
#include <alib/deque>
#include <alib/vector>
#include <alib/set>
#include <alib/multiset>
#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 );
static ext::set < DefaultStateType > normalizeStates ( ext::set < StateType > && states );
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;
}
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;
res.push_back ( normalizeState ( std::move ( state ) ) );
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 ( ) ) ) );