// implementation file: CoderFactory.cpp
// description:         Factory function for Coder objects.
// variant:             1 simple
// author:              Karlheinz Hug
// creation date:       2012-07-05
// last update:         2012-08-06

#include <cstdlib>

#include "CoderFactory.hpp"
#include "Copier.hpp"
#include "Expander.hpp"
#include "Caesar.hpp"
#include "Vernam.hpp"
#include "Composite.hpp"

	Coder * CoderFactory::new_coder (char coder_type, const std::string & key)
	{
		switch (coder_type)
		{
			case 'e' :
				return new Expander();
			case 'c' :
				Caesar * caesar;
				caesar = new Caesar(); // Declaration + initialization can't be abbreviated!
				caesar->set_key(std::atoi(key.c_str()));
				return caesar;
			case 'C' :
				return new Composite(new_coder('e', ""), new_coder('c', key));
			case 'v' :
				Vernam * vernam;
				vernam = new Vernam();
				vernam->set_key(std::vector<char>(key.begin(), key.end()));
				return vernam;
			case 'V' :
				return new Composite(new_coder('e', ""), new_coder('v', key));
			default :
				return new Copier();
		}
	}

