#pragma once

#include <atomic>
#include <thread>
#include <vector>


class console
{
private:
	std::atomic_bool *const terminate   { nullptr };

	std::thread            *th          { nullptr };

	std::vector<char>       buffer;

protected:
	virtual int wait_for_char(const int timeout) = 0;

public:
	console(std::atomic_bool *const terminate);
	virtual ~console();

	bool    poll_char();

	uint8_t get_char();

	virtual void put_char(const char c) = 0;

	virtual void resize_terminal() = 0;

	void    operator()();
};