#pragma once


#define DECLARE_SINGLETON(class_name) \
private: \
	class_name(); \
	static class_name* instance_for_singleton_; \
	static std::mutex mutex_for_singleton_; \
public: \
	static class_name* get_instance() { \
		std::lock_guard<std::mutex> lock(mutex_for_singleton_); \
		if (instance_for_singleton_ == nullptr) { \
			instance_for_singleton_ = new class_name(); \
		} \
		return instance_for_singleton_; \
	} \
	static void release_singleton_object()() { \
		if (instance_for_singleton_) { delete instance_for_singleton_; instance_for_singleton_ = nullptr; } \
	}



#define IMPLEMENT_SINGLETON(class_name) \
	class_name* class_name::instance_for_singleton_ = nullptr; \
	std::mutex class_name::mutex_for_singleton_;