#include <iostream>
#include <string>
using namespace std;

template<class T, class U=char>
class SensorData{
	public:
		T value;
		U unit;
		SensorData(T v, U u){
			value=v;
			unit=u;
		}
};

template<typename T>
T myMax(T x, T y){
	return (x>y) ? x : y;
}

class CentralLogger{
	private:
		CentralLogger(){
			cout<<"[SYSTEM] The central logger was created (ONLY ONCE)!"<<endl;
		}
		CentralLogger(const CentralLogger&)=delete;
		CentralLogger& operator=(const CentralLogger&)=delete;
		static CentralLogger* instance;
	public:
		static CentralLogger* getInstance(){
			if(instance==nullptr){
				instance=new CentralLogger();
			}
			return instance;
		}
		template<typename Type>
		void log(string message, Type data){
			cout<<"[LOG]: "<<message<<" -> "<<data<<endl;
		}
};

CentralLogger* CentralLogger::instance=nullptr;

int main(){
	CentralLogger* logger1=CentralLogger::getInstance();
	logger1->log("System","Active");
	SensorData<double, char> tempSensor(36.6, 'C');
	SensorData<int, string> pressureSensor(1013, "hPa");
	logger1->log("Temperature", tempSensor.value);
	logger1->log("Pressure", pressureSensor.value);
	cout<<"Max between 5.5 and 3.2: "<<myMax<double>(5.5,3.2)<<endl;
	CentralLogger* logger2=CentralLogger::getInstance();
	if(logger1==logger2){
		cout<<"Success! logger1 and logger2 point in the same memory space!"<<endl;
	}
	return 0;
}


