// C RunTime Header Files
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <stdint.h>
#include <time.h>

// C++ Headers
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <algorithm>

// Windows Headers
#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
#include <windows.h>

// Project Headers
#include "Tweakables.h"



class ObservableData
{
public:
	std::vector<Observer*> m_observers;
};


Observable::Observable()
{
	m_data = new ObservableData;
}


Observable::~Observable()
{
	delete m_data;
}


void Observable::registerObserver(Observer& a_observer)
{
	m_data->m_observers.push_back(&a_observer);
}


void Observable::unregisterObserver(Observer& a_observer)
{
	std::vector<Observer*>& vec = m_data->m_observers;
	vec.erase(std::remove(vec.begin(), vec.end(), &a_observer), vec.end());
}


void Observable::notifyObservers(const char* a_message) const
{
	for (unsigned i = 0; i < m_data->m_observers.size(); ++i)
	{
		m_data->m_observers[i]->notify(*this, a_message);
	}
}

