|
|
|
|
@ -39,16 +39,27 @@ public:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool empty() const {
|
|
|
|
|
return raw_.empty();
|
|
|
|
|
// Для входящих сообщений считаем "пустым" то, у которого
|
|
|
|
|
// больше не осталось непрочитанных данных во входном потоке.
|
|
|
|
|
//
|
|
|
|
|
// Для свежесозданного сообщения (ещё не инициализирован in_)
|
|
|
|
|
// поведение остаётся прежним: пусто == raw_.empty().
|
|
|
|
|
if (!in_initialized_) {
|
|
|
|
|
return raw_.empty();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Если поток уже инициализирован, смотрим, остались ли данные.
|
|
|
|
|
// peek() вернёт EOF, когда всё прочитано.
|
|
|
|
|
return in_.peek() == EOF;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::string raw_;
|
|
|
|
|
std::ostringstream out_;
|
|
|
|
|
std::istringstream in_;
|
|
|
|
|
bool in_initialized_{false};
|
|
|
|
|
mutable std::istringstream in_;
|
|
|
|
|
mutable bool in_initialized_{false};
|
|
|
|
|
|
|
|
|
|
void ensureInput() {
|
|
|
|
|
void ensureInput() const {
|
|
|
|
|
if (!in_initialized_) {
|
|
|
|
|
in_.str(raw_);
|
|
|
|
|
in_initialized_ = true;
|
|
|
|
|
|