// implementation file: Composite.cpp
// description:         Coding by combination of two codings.
// variant:             1 simple
// author:              Karlheinz Hug
// creation date:       2012-07-06
// last update:         2012-08-06

#include <cassert>

#include "Composite.hpp"

	Composite::Composite (Coder * const new_first, Coder * const new_second) :
		Coder(),
		first (new_first),
		second (new_second)
	{
		assert(new_first);  // precondition
		assert(new_second); // precondition
		assert(first);      // implementation invariant
		assert(second);     // implementation invariant
	}

	Composite::~Composite ()
	{
		delete first;
		delete second;
	}

	void Composite::encode (const std::vector<char> & source_buffer, std::vector<char> & target_buffer)
	{
		assert(first);      // invariant
		assert(second);     // invariant

		std::vector<char> interim_buffer;
		first->encode(source_buffer, interim_buffer);
		a_result = first->result();
		if (a_result != done) return;

		second->encode(interim_buffer, target_buffer);
		a_result = second->result();
	}

	void Composite::decode (const std::vector<char> & source_buffer, std::vector<char> & target_buffer)
	{
		assert(first);      // invariant
		assert(second);     // invariant

		std::vector<char> interim_buffer;
		second->decode(source_buffer, interim_buffer);
		a_result = second->result();
		if (a_result != done) return;

		first->decode(interim_buffer, target_buffer);
		a_result = first->result();
	}
