diff --git a/src/audio/wav.cpp b/src/audio/wav.cpp index 31f3a0468..751c87b41 100644 --- a/src/audio/wav.cpp +++ b/src/audio/wav.cpp @@ -13,6 +13,8 @@ #include #include +#include "../cxxutil.hpp" + using namespace srb2; using srb2::audio::Wav; @@ -130,14 +132,6 @@ std::vector read_int16_samples_from_stream(io::SpanStream& stream, std: return samples; } -template -struct OverloadVisitor : Ts... { - using Ts::operator()...; -}; - -template -OverloadVisitor(Ts...) -> OverloadVisitor; - } // namespace Wav::Wav() = default; @@ -171,7 +165,7 @@ Wav::Wav(tcb::span data) { throw std::runtime_error("WAVE tag length exceeds stream length"); } - auto tag_visitor = OverloadVisitor { + auto tag_visitor = srb2::Overload { [&](const FmtTag& fmt) { if (read_fmt) { throw std::runtime_error("WAVE has multiple 'fmt' tags"); @@ -248,7 +242,7 @@ std::size_t read_samples(std::size_t channels, } // namespace std::size_t Wav::get_samples(std::size_t offset, tcb::span> buffer) const noexcept { - auto samples_visitor = OverloadVisitor { + auto samples_visitor = srb2::Overload { [&](const std::vector& samples) { return read_samples(channels(), offset, samples, buffer); }, [&](const std::vector& samples) { return read_samples(channels(), offset, samples, buffer); @@ -258,7 +252,7 @@ std::size_t Wav::get_samples(std::size_t offset, tcb::span> buf } std::size_t Wav::interleaved_length() const noexcept { - auto samples_visitor = OverloadVisitor {[](const std::vector& samples) { return samples.size(); }, - [](const std::vector& samples) { return samples.size(); }}; + auto samples_visitor = srb2::Overload {[](const std::vector& samples) { return samples.size(); }, + [](const std::vector& samples) { return samples.size(); }}; return std::visit(samples_visitor, interleaved_samples_); } diff --git a/src/cxxutil.hpp b/src/cxxutil.hpp index 74349a0ff..82131768a 100644 --- a/src/cxxutil.hpp +++ b/src/cxxutil.hpp @@ -147,6 +147,17 @@ public: template NotNull(T) -> NotNull; +/// @brief Utility struct for combining several Callables (e.g. lambdas) into a single Callable with the call operator +/// overloaded. Use it to build a visitor for calling std::visit on variants. +/// @tparam ...Ts callable types +template +struct Overload : Ts... { + using Ts::operator()...; +}; + +template +Overload(Ts...) -> Overload; + } // namespace srb2 #endif // __SRB2_CXXUTIL_HPP__