20 : buffer_(buffer), index_(buffer->next_index_) {
21 buffer_->receivers_.push_back(
this);
25 : buffer_(buffer), index_(
index) {
26 buffer_->receivers_.push_back(
this);
31 buffer_->RemoveReceiver(
this);
37 : buffer_(other.buffer_), index_(other.index_) {
38 other.buffer_ =
nullptr;
40 std::replace(buffer_->receivers_.begin(), buffer_->receivers_.end(),
49 buffer_->RemoveReceiver(
this);
51 buffer_ = other.buffer_;
52 index_ = other.index_;
53 other.buffer_ =
nullptr;
55 std::replace(buffer_->receivers_.begin(), buffer_->receivers_.end(),
62 bool Has()
const {
return buffer_ && index_ < buffer_->next_index_; }
68 T value = buffer_->Get(index_);
74 size_t index()
const {
return index_; }
83 return std::make_unique<Receiver>(
this);
87 return std::make_unique<Receiver>(
this, index);
91 values_.push_back(std::move(value));
96 void RemoveReceiver(
Receiver* receiver) {
98 std::remove(receivers_.begin(), receivers_.end(), receiver),
104 if (receivers_.empty()) {
106 start_index_ = next_index_;
109 size_t min_index = next_index_;
110 for (
auto* r : receivers_) {
111 min_index = std::min(min_index, r->index_);
113 while (start_index_ < min_index) {
119 T Get(
size_t index)
const {
return values_[index - start_index_]; }
121 std::deque<T> values_;
122 std::vector<Receiver*> receivers_;
123 size_t start_index_ = 0;
124 size_t next_index_ = 0;