diff --git a/alib2data/src/alphabet/common/SymbolNormalize.h b/alib2data/src/alphabet/common/SymbolNormalize.h index 996090ca3b488d4796b8145df76eee9f6403e602..685989cdd25a107318fee6991f2c6e2b54d065a6 100644 --- a/alib2data/src/alphabet/common/SymbolNormalize.h +++ b/alib2data/src/alphabet/common/SymbolNormalize.h @@ -21,6 +21,12 @@ namespace alphabet { * This class contains methods to print XML representation of automata to the output stream. */ class SymbolNormalize { + template < class SymbolType > + static DefaultSymbolType normalizeSymbolInternal ( typename std::enable_if < std::is_constructible < DefaultSymbolType, SymbolType >::value, SymbolType && >::type symbol ); + + template < class SymbolType > + static DefaultSymbolType normalizeSymbolInternal ( typename std::enable_if < ! std::is_constructible < DefaultSymbolType, SymbolType >::value, SymbolType && >::type symbol ); + public: template < class SymbolType > static std::set < DefaultSymbolType > normalizeAlphabet ( std::set < SymbolType > && symbols ); @@ -60,13 +66,23 @@ std::set < std::ranked_symbol < DefaultSymbolType, DefaultRankType > > SymbolNor } template < class SymbolType > -DefaultSymbolType SymbolNormalize::normalizeSymbol ( SymbolType && symbol ) { +DefaultSymbolType SymbolNormalize::normalizeSymbolInternal ( typename std::enable_if < std::is_constructible < DefaultSymbolType, SymbolType >::value, SymbolType && >::type symbol ) { + return DefaultSymbolType ( std::move ( symbol ) ); +} + +template < class SymbolType > +DefaultSymbolType SymbolNormalize::normalizeSymbolInternal ( typename std::enable_if < ! std::is_constructible < DefaultSymbolType, SymbolType >::value, SymbolType && >::type symbol ) { return DefaultSymbolType ( alib::AnyObject < SymbolType > ( std::move ( symbol ) ) ); } +template < class SymbolType > +DefaultSymbolType SymbolNormalize::normalizeSymbol ( SymbolType && symbol ) { + return SymbolNormalize::normalizeSymbolInternal < SymbolType > ( std::move ( symbol ) ); +} + template < class SymbolType, class RankType > std::ranked_symbol < DefaultSymbolType, DefaultRankType > SymbolNormalize::normalizeRankedSymbol ( std::ranked_symbol < SymbolType, RankType > && symbol ) { - return std::ranked_symbol < DefaultSymbolType, DefaultRankType > ( DefaultSymbolType ( alib::AnyObject < SymbolType > ( std::move ( symbol.getSymbol ( ) ) ) ), DefaultRankType ( std::move ( symbol.getRank ( ) ) ) ); + return std::ranked_symbol < DefaultSymbolType, DefaultRankType > ( normalizeSymbol ( std::move ( symbol.getSymbol ( ) ) ), DefaultRankType ( std::move ( symbol.getRank ( ) ) ) ); } template < class SymbolType >