3#include "check-bounds.hpp"
7namespace BspParser::Internal {
10 template <
typename T>
using ValueOffsetPair = std::pair<T, size_t>;
12 explicit OffsetDataView(std::span<const std::byte> data);
14 explicit OffsetDataView(
const OffsetDataView& from,
size_t newOffset);
16 ~OffsetDataView() =
default;
17 OffsetDataView(
const OffsetDataView&) =
delete;
18 OffsetDataView& operator=(
const OffsetDataView&) =
delete;
19 OffsetDataView(
const OffsetDataView&&) =
delete;
20 OffsetDataView& operator=(
const OffsetDataView&&) =
delete;
22 [[nodiscard]] OffsetDataView withRelativeOffset(
size_t newOffset)
const;
25 [[nodiscard]]
const T& parseStruct(
const size_t relativeOffset,
const char* errorMessage)
const {
26 const auto absoluteOffset = offset + relativeOffset;
27 checkBounds(absoluteOffset,
sizeof(T), data.size_bytes(), errorMessage);
29 return *
reinterpret_cast<const T*
>(&data[absoluteOffset]);
33 [[nodiscard]] std::span<const T> parseStructArray(
34 const size_t relativeOffset,
const size_t count,
const char* errorMessage
37 return std::span<const T>(
static_cast<const T*
>(
nullptr), 0);
40 const auto absoluteOffset = offset + relativeOffset;
41 checkBounds(absoluteOffset,
sizeof(T) * count, data.size_bytes(), errorMessage);
43 const T* first =
reinterpret_cast<const T*
>(&data[absoluteOffset]);
44 return std::span<const T>(first, count);
47 std::string parseString(
size_t relativeOffset,
const char* errorMessage)
const;
50 const std::span<const std::byte> data;