#include "example.h"

Animal::Animal(const char* name) : name_(name)
{
}

Animal::~Animal()
{
}

/* Return the animal's name */
const char* Animal::get_name() const
{
	return name_.c_str();
}
	
Zoo::Zoo()
{
}

Zoo::~Zoo()
{
	IterType iter = this->animals.begin();
	IterType end = this->animals.end();

	for(; iter != end; ++iter)
	{
		Animal* animal = *iter;
		delete animal;
	}
}

/* Create a new animal. */
Animal* Zoo::create_animal(const char* name)
{
	return new Animal(name);
}

/* Add a new animal to the zoo. */
void Zoo::add_animal(Animal* animal)
{
	animals.push_back(animal);
}

Animal* Zoo::remove_animal(size_t i)
{
	/* Note a production implementation should check
	   for out of range errors. */
	Animal* result = this->animals[i];
	IterType iter = this->animals.begin();
	std::advance(iter, i);
	this->animals.erase(iter);

	return result;
}

/* Return the number of animals in the zoo. */
size_t Zoo::get_num_animals() const
{
	return animals.size();
}

/* Return a pointer to the ith animal */
Animal* Zoo::get_animal(size_t i) const
{
	return animals[i];
}
