Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
LegacyChunk.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <array>
6#include <cstddef>
7#include <cstdint>
8#include <expected>
9#include <span>
10#include <string>
11
12namespace monopoly::data
13{
28
29
31 {
33 std::size_t offset{};
34 std::string detail;
35 };
36
37
38 [[nodiscard]] std::string_view chunkErrorCodeName(
39 ChunkErrorCode code) noexcept;
40
41
42 struct ChunkInfo
43 {
44 std::uint8_t id{};
45 std::size_t headerOffset{};
46 std::size_t dataOffset{};
47 std::size_t dataSize{};
48 std::size_t endOffset{};
49 };
50
51
53 {
54 public:
55 static constexpr std::size_t PhysicalHeaderSize = 4;
56 static constexpr std::size_t MaximumLevels = 8;
57 static constexpr std::uint8_t NullStandardId = 0;
58 static constexpr std::uint8_t NullInContextId = 128;
59
60 // Le constructeur span est non-owning. Le constructeur SharedDataBytes
61 // conserve explicitement le payload DAT pendant toute la lecture.
62 explicit LegacyChunkReader(std::span<const std::byte> bytes) noexcept;
63 explicit LegacyChunkReader(SharedDataBytes bytes) noexcept;
64
65 // findId == 0 selectionne le prochain sibling et rejette alors les
66 // sentinelles 0/128. Une recherche precise peut les franchir, comme
67 // LE_CHUNK_Descend, mais les rejette si la sentinelle est selectionnee.
68 [[nodiscard]] std::expected<ChunkInfo, ChunkError>
69 descend(std::uint8_t findId = NullStandardId);
70
71 [[nodiscard]] std::expected<void, ChunkError> ascend();
72
73 [[nodiscard]] std::expected<std::span<const std::byte>, ChunkError>
74 map(std::size_t requestedBytes);
75
76 [[nodiscard]] std::expected<std::size_t, ChunkError>
77 read(std::span<std::byte> destination);
78
79 [[nodiscard]] std::expected<void, ChunkError>
80 seek(std::size_t absoluteOffset);
81
82 [[nodiscard]] std::size_t currentOffset() const noexcept;
83 [[nodiscard]] std::size_t level() const noexcept;
84 [[nodiscard]] std::uint8_t idForLevel(std::size_t level) const noexcept;
85 [[nodiscard]] std::size_t dataSizeForLevel(
86 std::size_t level) const noexcept;
87 [[nodiscard]] std::size_t dataStartForLevel(
88 std::size_t level) const noexcept;
89 [[nodiscard]] std::size_t remaining() const noexcept;
90
91 private:
92 struct LevelState
93 {
94 std::size_t dataStart{};
95 std::size_t end{};
96 std::uint8_t id{};
97 };
98
99 [[nodiscard]] ChunkError error(
100 ChunkErrorCode code,
101 std::string detail,
102 std::size_t offset) const;
103
104 SharedDataBytes owner_;
105 std::span<const std::byte> bytes_;
106 std::array<LevelState, MaximumLevels> levels_{};
107 std::size_t level_{};
108 std::size_t currentOffset_{};
109 };
110
111
112 // Equivalent RAII de LE_CHUNK_ReadFromDataID : verifie le type CNK,
113 // charge par le registre DATA et conserve la lease partagee dans le
114 // reader, y compris si la banque est ensuite demontee.
115 [[nodiscard]] std::expected<LegacyChunkReader, DataError>
117 const DataSource& source,
118 DataId id);
119}
std::size_t offset
std::vector< std::byte > bytes
std::shared_ptr< const data::HmdTextureImage > source
unsigned index
std::string error
std::expected< std::size_t, ChunkError > read(std::span< std::byte > destination)
std::uint8_t idForLevel(std::size_t level) const noexcept
std::size_t level() const noexcept
static constexpr std::uint8_t NullStandardId
std::expected< std::span< const std::byte >, ChunkError > map(std::size_t requestedBytes)
static constexpr std::size_t PhysicalHeaderSize
std::size_t dataSizeForLevel(std::size_t level) const noexcept
static constexpr std::uint8_t NullInContextId
std::size_t dataStartForLevel(std::size_t level) const noexcept
std::expected< void, ChunkError > ascend()
std::expected< ChunkInfo, ChunkError > descend(std::uint8_t findId=NullStandardId)
std::expected< void, ChunkError > seek(std::size_t absoluteOffset)
std::size_t remaining() const noexcept
static constexpr std::size_t MaximumLevels
std::size_t currentOffset() const noexcept
std::uint32_t DataId
Definition DataBanks.hpp:10
std::string_view chunkErrorCodeName(ChunkErrorCode code) noexcept
std::shared_ptr< const DataBytes > SharedDataBytes
std::expected< LegacyChunkReader, DataError > openLegacyChunkReader(const DataSource &source, DataId id)