5#include <BufferStream.h>
19RIFF::RIFF(std::vector<std::byte>&& riffData, uint32_t type_)
21 ,
data{std::move(riffData)} {
22 BufferStreamReadOnly stream{this->
data};
26 stream.set_big_endian(
true);
32 const auto fileLength = stream.read<uint32_t>();
33 if (stream.read<uint32_t>() != this->type) {
38 while (stream.tell() < fileLength) {
39 auto& [chunkType, chunkData] = this->chunks.emplace_back();
40 stream.read(chunkType).read(chunkData, stream.read<uint32_t>());
41 if (stream.tell() % 2) {
47RIFF::RIFF(std::span<const std::byte> riffData, uint32_t type_)
48 :
RIFF{std::vector<std::byte>{riffData.begin(), riffData.end()}, type_} {}
50RIFF::RIFF(
const std::filesystem::path& riffPath, uint32_t type_)
51 :
RIFF{
fs::readFileBuffer(riffPath), type_} {}
53RIFF::operator bool()
const {
65const std::vector<std::pair<uint32_t, std::span<std::byte>>>&
RIFF::getChunks()
const {
70 return std::ranges::find_if(this->
chunks, [chunkType](
const std::pair<uint32_t, std::span<std::byte>>& chunk) {
71 return chunk.first == chunkType;
76 if (
const auto it = std::ranges::find_if(this->
chunks, [chunkType](
const std::pair<uint32_t, std::span<std::byte>>& chunk) {
77 return chunk.first == chunkType;
78 }); it != this->
chunks.end()) {
79 return {it->second.begin(), it->second.end()};
86 return std::ranges::find_if(this->
chunks, [chunkType, n, &i](
const std::pair<uint32_t, std::span<std::byte>>& chunk) {
87 return chunk.first == chunkType && i++ == n;
93 if (
const auto it = std::ranges::find_if(this->
chunks, [chunkType, n, &i](
const std::pair<uint32_t, std::span<std::byte>>& chunk) {
94 return chunk.first == chunkType && i++ == n;
95 }); it != this->
chunks.end()) {
96 return {it->second.begin(), it->second.end()};
std::vector< std::byte > getFirstChunk(uint32_t chunkType) const
std::vector< std::byte > data
const std::vector< std::pair< uint32_t, std::span< std::byte > > > & getChunks() const
std::vector< std::byte > getNthChunk(uint32_t chunkType, uint32_t n) const
bool hasChunk(uint32_t chunkType) const
uint32_t getSignature() const
RIFF(uint32_t type, uint32_t signature=RIFF_SIGNATURE)
std::vector< std::pair< uint32_t, std::span< std::byte > > > chunks
bool hasNthChunk(uint32_t chunkType, uint32_t n) const
constexpr auto FFIR_SIGNATURE
constexpr auto RIFX_SIGNATURE
constexpr auto RIFF_SIGNATURE