/*
 * RegExpOptimize.cpp
 *
 *  Created on: 20. 1. 2014
 *	  Author: Tomas Pecka
 */

#include "RegExpOptimize.h"

#include "../properties/RegExpEpsilon.h"
#include <exception/CommonException.h>

#include <cassert>
#include <iostream>
#include <iostream>

namespace regexp {

namespace simplify {

regexp::RegExp RegExpOptimize::optimize(const regexp::RegExp& regexp) {
	return dispatch(regexp.getData());
}

FormalRegExp < > RegExpOptimize::optimize( const FormalRegExp < > & regexp ) {
	return regexp::FormalRegExp < > ( RegExpOptimize::optimize ( regexp.getRegExp ( ) ) );
}

auto RegExpOptimizeFormalRegExp = RegExpOptimize::RegistratorWrapper<FormalRegExp < >, FormalRegExp < > >(RegExpOptimize::optimize);

FormalRegExpStructure < alphabet::Symbol > RegExpOptimize::optimize( const FormalRegExpStructure < alphabet::Symbol > & regexp ) {
	FormalRegExpElement < alphabet::Symbol > * optimized = optimizeInner( regexp.getStructure ( ) );

	return regexp::FormalRegExpStructure < alphabet::Symbol > ( std::manage_move ( optimized ) );
}

UnboundedRegExp < > RegExpOptimize::optimize( const UnboundedRegExp < > & regexp ) {
	return regexp::UnboundedRegExp < > ( RegExpOptimize::optimize ( regexp.getRegExp ( ) ) );
}

auto RegExpOptimizeUnboundedRegExp = RegExpOptimize::RegistratorWrapper<UnboundedRegExp < >, UnboundedRegExp < > >(RegExpOptimize::optimize);

UnboundedRegExpStructure < alphabet::Symbol > RegExpOptimize::optimize( const UnboundedRegExpStructure < alphabet::Symbol > & regexp ) {
	UnboundedRegExpElement < alphabet::Symbol > * optimized = optimizeInner( regexp.getStructure( ) );

	return regexp::UnboundedRegExpStructure < alphabet::Symbol > ( std::manage_move ( optimized ) );
}

} /* namespace regexp */

} /* namespace simplify */

#include "RegExpOptimizeUnboundedPart.cxx"
#include "RegExpOptimizeFormalPart.cxx"