/*
 * StringApi.cpp
 *
 * Created on: Apr 1, 2013
 * Author: Jan Travnicek
 */

#include "StringApi.hpp"

#include "exception/AlibException.h"

namespace alib {

const label::LabelFromStringParser FromStringParsers::labelParser;
const alphabet::SymbolFromStringParser FromStringParsers::symbolParser;
const regexp::RegExpFromStringParser FromStringParsers::regexpParser;
const string::StringFromStringParser FromStringParsers::stringParser;
const automaton::AutomatonFromStringParser FromStringParsers::automatonParser;
const grammar::GrammarFromStringParser FromStringParsers::grammarParser;
const graph::GraphFromStringParser FromStringParsers::graphParser;
const primitive::PrimitiveFromStringParser FromStringParsers::primitiveParser;
const tree::TreeFromStringParser FromStringParsers::treeParser;

alphabet::Symbol stringApi < alphabet::Symbol >::parse ( std::istream & input ) {
	return FromStringParsers::symbolParser.parseSymbol ( input );
}

void stringApi < alphabet::Symbol >::compose ( std::ostream & output, const alphabet::Symbol & data ) {
	return alphabet::SymbolToStringComposer::compose ( output, data );
}

automaton::Automaton stringApi < automaton::Automaton >::parse ( std::istream & input ) {
	return FromStringParsers::automatonParser.parseAutomaton ( input );
}

void stringApi < automaton::Automaton >::compose ( std::ostream & output, const automaton::Automaton & data ) {
	return automaton::AutomatonToStringComposer::compose ( output, data );
}

grammar::Grammar stringApi < grammar::Grammar >::parse ( std::istream & input ) {
	return FromStringParsers::grammarParser.parseGrammar ( input );
}

void stringApi < grammar::Grammar >::compose ( std::ostream & output, const grammar::Grammar & data ) {
	return grammar::GrammarToStringComposer::compose ( output, data );
}

graph::Graph stringApi < graph::Graph >::parse ( std::istream & input ) {
	return FromStringParsers::graphParser.parseGraph ( input );
}

void stringApi < graph::Graph >::compose ( std::ostream & output, const graph::Graph & data ) {
	return graph::GraphToStringComposer::compose ( output, data );
}

label::Label stringApi < label::Label >::parse ( std::istream & input ) {
	return FromStringParsers::labelParser.parseLabel ( input );
}

void stringApi < label::Label >::compose ( std::ostream & output, const label::Label & data ) {
	return label::LabelToStringComposer::compose ( output, data );
}

regexp::RegExp stringApi < regexp::RegExp >::parse ( std::istream & input ) {
	return FromStringParsers::regexpParser.parseRegExp ( input );
}

void stringApi < regexp::RegExp >::compose ( std::ostream & output, const regexp::RegExp & data ) {
	return regexp::RegExpToStringComposer::compose ( output, data );
}

string::String stringApi < string::String >::parse ( std::istream & input ) {
	return FromStringParsers::stringParser.parseString ( input );
}

void stringApi < string::String >::compose ( std::ostream & output, const string::String & data ) {
	return string::StringToStringComposer::compose ( output, data );
}

primitive::Primitive stringApi < primitive::Primitive >::parse ( std::istream & input ) {
	return FromStringParsers::primitiveParser.parsePrimitive ( input );
}

void stringApi < primitive::Primitive >::compose ( std::ostream & output, const primitive::Primitive & data ) {
	return primitive::PrimitiveToStringComposer::compose ( output, data );
}

tree::Tree stringApi < tree::Tree >::parse ( std::istream & input ) {
	return FromStringParsers::treeParser.parseTree ( input );
}

void stringApi < tree::Tree >::compose ( std::ostream & output, const tree::Tree & data ) {
	return tree::TreeToStringComposer::compose ( output, data );
}

} /* namespace alib */