FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
multi_receiver_buffer.hpp
Go to the documentation of this file.
1// Copyright 2025 Arthur Sonzogni. All rights reserved.
2// Use of this source code is governed by the MIT license that can be found in
3// the LICENSE file.
4#ifndef FTXUI_COMPONENT_MULTI_RECEIVER_BUFFER_HPP
5#define FTXUI_COMPONENT_MULTI_RECEIVER_BUFFER_HPP
6
7#include <algorithm> // for std::replace, std::min, std::remove
8#include <deque> // for deque
9#include <memory> // for unique_ptr, make_unique
10#include <vector> // for vector
11
12namespace ftxui {
13
14template <typename T>
16 public:
17 class Receiver {
18 public:
19 explicit Receiver(MultiReceiverBuffer* buffer)
20 : buffer_(buffer), index_(buffer->next_index_) {
21 buffer_->receivers_.push_back(this);
22 }
23
25 : buffer_(buffer), index_(index) {
26 buffer_->receivers_.push_back(this);
27 }
28
30 if (buffer_) {
31 buffer_->RemoveReceiver(this);
32 }
33 }
34
35 Receiver(const Receiver&) = delete;
36 Receiver(Receiver&& other) noexcept
37 : buffer_(other.buffer_), index_(other.index_) {
38 other.buffer_ = nullptr;
39 if (buffer_) {
40 std::replace(buffer_->receivers_.begin(), buffer_->receivers_.end(),
41 &other, this);
42 }
43 }
44
45 Receiver& operator=(const Receiver&) = delete;
46 Receiver& operator=(Receiver&& other) noexcept {
47 if (this != &other) {
48 if (buffer_) {
49 buffer_->RemoveReceiver(this);
50 }
51 buffer_ = other.buffer_;
52 index_ = other.index_;
53 other.buffer_ = nullptr;
54 if (buffer_) {
55 std::replace(buffer_->receivers_.begin(), buffer_->receivers_.end(),
56 &other, this);
57 }
58 }
59 return *this;
60 }
61
62 bool Has() const { return buffer_ && index_ < buffer_->next_index_; }
63
64 T Pop() {
65 if (!Has()) {
66 return {};
67 }
68 T value = buffer_->Get(index_);
69 index_++;
70 buffer_->Prune();
71 return value;
72 }
73
74 size_t index() const { return index_; }
75
76 private:
77 friend class MultiReceiverBuffer;
78 MultiReceiverBuffer* buffer_;
79 size_t index_;
80 };
81
82 std::unique_ptr<Receiver> CreateReceiver() {
83 return std::make_unique<Receiver>(this);
84 }
85
86 std::unique_ptr<Receiver> CreateReceiverAt(size_t index) {
87 return std::make_unique<Receiver>(this, index);
88 }
89
90 void Push(T value) {
91 values_.push_back(std::move(value));
92 next_index_++;
93 }
94
95 private:
96 void RemoveReceiver(Receiver* receiver) {
97 receivers_.erase(
98 std::remove(receivers_.begin(), receivers_.end(), receiver),
99 receivers_.end());
100 Prune();
101 }
102
103 void Prune() {
104 if (receivers_.empty()) {
105 values_.clear();
106 start_index_ = next_index_;
107 return;
108 }
109 size_t min_index = next_index_;
110 for (auto* r : receivers_) {
111 min_index = std::min(min_index, r->index_);
112 }
113 while (start_index_ < min_index) {
114 values_.pop_front();
115 start_index_++;
116 }
117 }
118
119 T Get(size_t index) const { return values_[index - start_index_]; }
120
121 std::deque<T> values_;
122 std::vector<Receiver*> receivers_;
123 size_t start_index_ = 0;
124 size_t next_index_ = 0;
125};
126
127} // namespace ftxui
128
129#endif /* end of include guard: FTXUI_COMPONENT_MULTI_RECEIVER_BUFFER_HPP */
Receiver(MultiReceiverBuffer *buffer, size_t index)
Receiver(const Receiver &)=delete
Receiver & operator=(const Receiver &)=delete
Receiver & operator=(Receiver &&other) noexcept
std::unique_ptr< Receiver > CreateReceiver()
std::unique_ptr< Receiver > CreateReceiverAt(size_t index)
The FTXUI ftxui:: namespace.
Definition animation.hpp:10
std::unique_ptr< ReceiverImpl< T > > Receiver
Definition receiver.hpp:54