37 lines
944 B
C
37 lines
944 B
C
|
#ifndef IOCONTEXT_H
|
||
|
#define IOCONTEXT_H
|
||
|
|
||
|
#include "Singleton.h"
|
||
|
#include <boost/asio/io_context.hpp>
|
||
|
#include <thread>
|
||
|
|
||
|
class IoContext {
|
||
|
public:
|
||
|
enum class Mode {
|
||
|
Synchronous,
|
||
|
Asynchronous,
|
||
|
};
|
||
|
friend class Amass::Singleton<IoContext, Amass::LocalInstance>;
|
||
|
std::shared_ptr<boost::asio::io_context> ioContext() const { return m_ioContext; }
|
||
|
template <Mode mode = Mode::Asynchronous>
|
||
|
void run() {
|
||
|
if constexpr (mode == Mode::Asynchronous) {
|
||
|
m_thread = std::thread(&IoContext::runIoContext, this);
|
||
|
} else {
|
||
|
runIoContext();
|
||
|
}
|
||
|
}
|
||
|
~IoContext();
|
||
|
|
||
|
protected:
|
||
|
template <typename... Args>
|
||
|
IoContext(Args &&... args) : m_ioContext(std::make_shared<boost::asio::io_context>(std::forward<Args>(args)...)) {}
|
||
|
void runIoContext();
|
||
|
|
||
|
private:
|
||
|
std::thread m_thread;
|
||
|
std::shared_ptr<boost::asio::io_context> m_ioContext;
|
||
|
};
|
||
|
|
||
|
#endif // IOCONTEXT_H
|