StormByte-Buffer 2.0.0
C++26 buffer module of the StormByte suite
 
Loading...
Searching...
No Matches
hopper.hxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024-2026 David C. Manuelda (StormBytePP)
3 *
4 * This file is part of StormByte-Buffer.
5 *
6 * StormByte-Buffer original source is dual-licensed:
7 *
8 * 1. GNU Lesser General Public License v3.0 (or later)
9 * You may redistribute and/or modify this file under the terms of the
10 * GNU Lesser General Public License as published by the Free Software
11 * Foundation, either version 3 of the License, or (at your option)
12 * any later version.
13 *
14 * 2. Commercial license
15 * Alternatively, this file may be used under the terms of a commercial
16 * license agreement with the copyright holder
17 * (David C. Manuelda <StormByte@gmail.com>).
18 *
19 * Both licenses apply only to original StormByte-Buffer source in this
20 * repository. They do not cover other StormByte modules or any third-party
21 * material shipped with this repository (including everything under
22 * thirdparty/, and in particular the bundled StormByte-Logger tree and
23 * the rest of the StormByte suite it vendors), which remains under its own
24 * license.
25 *
26 * Neither license grants any patent rights. Any patent licenses required
27 * to use this software or third-party components must be obtained separately
28 * from the patent holders.
29 *
30 * StormByte-Buffer is distributed in the hope that it will be useful,
31 * but WITHOUT ANY WARRANTY; without even the implied warranty of
32 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33 * GNU Lesser General Public License for more details.
34 *
35 * You should have received a copy of the GNU Lesser General Public License
36 * version 3 along with StormByte-Buffer. If not, see
37 * <https://www.gnu.org/licenses/lgpl-3.0.html>.
38 *
39 * SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-StormByte-Commercial
40 */
41
42#pragma once
43
44#include <StormByte/size.hxx>
46
47#include <concepts>
48#include <condition_variable>
49#include <cstddef>
50#include <memory>
51#include <utility>
52
53namespace StormByte::Buffer {
54 template<Type::MoveConstructible T> class Sink;
55
75 template<Type::MoveConstructible T>
76 class Hopper {
77 public:
86 Hopper() noexcept;
87
92 explicit Hopper(StormByte::Size capacity) noexcept;
93
97 Hopper(const Hopper&) = delete;
98
102 Hopper(Hopper&&) noexcept = delete;
103
107 ~Hopper() noexcept;
108
112 Hopper& operator=(const Hopper&) = delete;
113
117 Hopper& operator=(Hopper&&) noexcept = delete;
118
132 StormByte::Size Capacity() const noexcept;
133
141 void Capacity(StormByte::Size capacity) noexcept;
142
147 StormByte::Size Size() const noexcept;
148
153 bool Full() const noexcept;
154
159 unsigned Writers() const noexcept;
160
177 void Push(T item) noexcept;
178
184 Hopper& operator<<(T item) noexcept;
185
191 void Eof() noexcept;
192
209 T Pop() noexcept;
210
218 T Front() const noexcept requires std::copy_constructible<T>;
219
225 Hopper& operator>>(T& item) noexcept;
226
231 bool EoF() const noexcept;
232
237 bool Empty() const noexcept;
238
243 bool Ready() const noexcept;
244
262 void Notify(std::condition_variable& wake) noexcept;
263
271 void Unnotify() noexcept;
272
286 friend Hopper& operator>>(T& item, Hopper& hopper) noexcept {
287 hopper << std::move(item);
288 return hopper;
289 }
290
297 friend Hopper& operator>>(T&& item, Hopper& hopper) noexcept {
298 hopper << std::move(item);
299 return hopper;
300 }
301
302 private:
303 friend class Sink<T>;
304
305 void AddWriter() noexcept;
306 void CloseWriter() noexcept;
307
312 class Implementation;
313
314 std::unique_ptr<Implementation> m_io;
315 };
316}
317
318#include <StormByte/buffer/hopper.txx>
Single-producer single-consumer (SPSC) typed item queue.
Definition hopper.hxx:76
void Notify(std::condition_variable &wake) noexcept
Registers the consumer condition variable to notify on Push or Eof.
StormByte::Size Capacity() const noexcept
Gets the current capacity ceiling.
bool Empty() const noexcept
Checks whether the queue has no pending items.
T Front() const noexcept
Copy of the next item without dequeuing.
bool Ready() const noexcept
Whether Pop can return an item or production is finished.
void Eof() noexcept
Marks end of production and wakes waiters.
T Pop() noexcept
Pops one item from the bucket, or returns default-constructed T if dry.
unsigned Writers() const noexcept
Live writers attached to this hopper.
void Unnotify() noexcept
Drops the pointer set by Notify.
Hopper() noexcept
Constructs an empty unbounded Hopper.
bool EoF() const noexcept
Checks whether Eof was called by a producer.
friend Hopper & operator>>(T &&item, Hopper &hopper) noexcept
Write: rvalue item flows into hopper.
Definition hopper.hxx:297
bool Full() const noexcept
Checks whether a bounded bucket cannot accept another Push without waiting.
void Push(T item) noexcept
Enqueues one item and signals the consumer if Notify was configured.
Set of Hopper buckets keyed by an integer.
Definition sink.hxx:79
Buffer module of the StormByte suite.
Root namespace of the StormByte C++ suite.
STL namespace.