// // Created by aaronpo on 29/04/2026. // #ifndef BIERGARTEN_PIPELINE_INCLUDES_CONCURRENCY_BOUNDED_CHANNEL_H_ #define BIERGARTEN_PIPELINE_INCLUDES_CONCURRENCY_BOUNDED_CHANNEL_H_ #include #include #include #include #include /** * @file bounded_channel.h * @brief A thread-safe, bounded multi-producer/multi-consumer channel. */ // --------------------------------------------------------------------------- // BoundedChannel // // Models a synchronous channel with a fixed-capacity internal buffer. // Producers block when the buffer is full (backpressure). // Consumers block when the buffer be empty. // Calling close() unblocks all waiting threads and signals exhaustion. // --------------------------------------------------------------------------- template class BoundedChannel { // ------------------------------------------------------------------------- // Internal state — all access must be guarded by mutex_. // ------------------------------------------------------------------------- std::queue queue_; std::mutex mutex_; std::condition_variable not_full_; std::condition_variable not_empty_; std::size_t capacity_; bool closed_ = false; public: /** * @brief Construct a bounded channel with the given capacity. * @param capacity Maximum number of items the channel may hold. */ explicit BoundedChannel(std::size_t capacity) : capacity_(capacity) {} /** * @brief Send an item into the channel. Blocks when the channel is full. * @param item Move-only item to enqueue. */ void Send(T item); /** * @brief Receive an item from the channel. Blocks when the channel is * empty. * @return std::optional containing the item, or std::nullopt when the * channel is closed and drained. */ std::optional Receive(); /** * @brief Close the channel and unblock all waiting threads. Idempotent. */ void Close(); }; // Include the template implementation #include "bounded_channel.tcc" #endif // BIERGARTEN_PIPELINE_INCLUDES_CONCURRENCY_BOUNDED_CHANNEL_H_