#pragma once #include #include #include #include #include #include #ifdef _WIN32 #include #else #include #include #endif namespace readline { class Terminal { public: Terminal(); ~Terminal(); void set_raw_mode(); void unset_raw_mode(); bool is_raw_mode() const { return raw_mode_; } std::optional read(); std::optional try_read(); bool is_terminal(int fd); private: void io_loop(); #ifdef _WIN32 HANDLE input_handle_; HANDLE output_handle_; DWORD original_input_mode_; DWORD original_output_mode_; #else int fd_; struct termios original_termios_; #endif bool raw_mode_; std::thread io_thread_; std::queue char_queue_; std::mutex queue_mutex_; std::condition_variable queue_cv_; std::atomic stop_io_loop_; }; } // namespace readline