| 425 | Buffer &get_buffer() override { return *buffer_; } |
| 426 | |
| 427 | void bind_buffer(Buffer *buffer) override { |
| 428 | Buffer *target = buffer == nullptr ? owned_buffer_.get() : buffer; |
| 429 | if (target == nullptr) { |
| 430 | if (buffer_ != nullptr) { |
| 431 | buffer_->input_stream_ = nullptr; |
| 432 | } |
| 433 | buffer_ = nullptr; |
| 434 | return; |
| 435 | } |
| 436 | |
| 437 | if (buffer_ == target) { |
| 438 | buffer_->data_ = data_.data(); |
| 439 | buffer_->own_data_ = false; |
| 440 | buffer_->wrapped_vector_ = nullptr; |
| 441 | buffer_->input_stream_ = this; |
| 442 | return; |
| 443 | } |
| 444 | |
| 445 | Buffer *source = buffer_; |
| 446 | if (source != nullptr) { |
| 447 | target->size_ = source->size_; |
| 448 | target->writer_index_ = source->writer_index_; |
| 449 | target->reader_index_ = source->reader_index_; |
| 450 | source->input_stream_ = nullptr; |
| 451 | } else { |
| 452 | target->size_ = 0; |
| 453 | target->writer_index_ = 0; |
| 454 | target->reader_index_ = 0; |
| 455 | } |
| 456 | |
| 457 | buffer_ = target; |
| 458 | buffer_->data_ = data_.data(); |
| 459 | buffer_->own_data_ = false; |
| 460 | buffer_->wrapped_vector_ = nullptr; |
| 461 | buffer_->input_stream_ = this; |
| 462 | } |
| 463 | |
| 464 | private: |
| 465 | Result<uint32_t, Error> recv_into(void *dst, uint32_t length) { |