#pragma once #include #include #include #include #include namespace clap { namespace helpers { #ifdef CLAP_HAS_CXX20 template concept UpdatableValue = requires(T &a, const T &b) { // update a with b, b being newer than a { a.update(b) }; }; #endif // TODO: when switching to C++20 // template template class ReducingParamQueue { public: using key_type = K; using value_type = V; using queue_type = std::unordered_map; using consumer_type = const std::function; ReducingParamQueue(); void setCapacity(size_t capacity); void set(const key_type &key, const value_type &value); void setOrUpdate(const key_type &key, const value_type &value); void producerDone(); void consume(const consumer_type &consumer); void reset(); private: queue_type _queues[2]; std::atomic _free = nullptr; std::atomic _producer = nullptr; std::atomic _consumer = nullptr; }; }} // namespace clap::helpers