1 #include <condition_variable>
9 #define LRDB_IOSTREAM_PREFIX "lrdb_stream_message:"
15 : end_(
false), istream_(in), ostream_(out) {
16 thread_ = std::thread([&] { read_thread(); });
22 std::unique_lock<std::mutex> lk(mutex_);
27 if (thread_.joinable()) {
31 std::function<void(
const std::string& data)> on_data;
32 std::function<void()> on_connection;
33 std::function<void()> on_close;
34 std::function<void(
const std::string&)> on_error;
36 bool is_open()
const {
return true; }
38 std::string msg = pop_message();
44 std::string msg = wait_message();
49 void wait_for_connection() {}
52 bool send_message(
const std::string& message) {
53 ostream_ << (LRDB_IOSTREAM_PREFIX + message +
"\r\n");
58 std::string pop_message() {
59 std::unique_lock<std::mutex> lk(mutex_);
60 if (command_buffer_.empty()) {
64 std::string message = std::move(command_buffer_.front());
65 command_buffer_.pop_front();
68 std::string wait_message() {
69 std::unique_lock<std::mutex> lk(mutex_);
70 while (command_buffer_.empty() && !end_) {
73 if (command_buffer_.empty()) {
76 std::string message = std::move(command_buffer_.front());
77 command_buffer_.pop_front();
80 void push_message(std::string message) {
81 std::unique_lock<std::mutex> lk(mutex_);
82 command_buffer_.push_back(std::move(message));
87 std::unique_lock<std::mutex> lk(mutex_);
91 std::getline(istream_, msg);
92 if (msg.find(LRDB_IOSTREAM_PREFIX) == 0) {
93 push_message(msg.substr(
sizeof(LRDB_IOSTREAM_PREFIX)));
100 std::istream& istream_;
101 std::ostream& ostream_;
102 std::deque<std::string> command_buffer_;
104 std::condition_variable cond_;
Definition: stdstream.hpp:12