Port FluidSim core and scenarios to C++20
This commit is contained in:
35
include/FluidSim/SimulationRingBuffer.hpp
Normal file
35
include/FluidSim/SimulationRingBuffer.hpp
Normal file
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include <atomic>
|
||||
#include <condition_variable>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <mutex>
|
||||
#include <span>
|
||||
#include <stop_token>
|
||||
#include <vector>
|
||||
|
||||
namespace fluidsim::port {
|
||||
|
||||
class SimulationRingBuffer {
|
||||
public:
|
||||
explicit SimulationRingBuffer(std::size_t capacity);
|
||||
std::size_t available_samples() const;
|
||||
std::size_t free_space() const;
|
||||
bool write(float left, float right, std::stop_token stop = {});
|
||||
bool wait_for_space(std::size_t target_fill, std::stop_token stop);
|
||||
void reset_consumer();
|
||||
std::size_t read_interpolated(std::span<float> left, std::span<float> right, double speed);
|
||||
|
||||
private:
|
||||
std::vector<float> left_, right_;
|
||||
std::size_t mask_{};
|
||||
std::atomic<std::uint64_t> write_head_{};
|
||||
std::atomic<std::uint64_t> read_head_{};
|
||||
double read_position_{};
|
||||
bool consumer_initialized_{};
|
||||
mutable std::mutex wait_mutex_;
|
||||
std::condition_variable space_available_;
|
||||
};
|
||||
|
||||
} // namespace fluidsim::port
|
||||
Reference in New Issue
Block a user