11 std::size_t
offset)
noexcept
15 (std::to_integer<std::uint32_t>(
bytes[
offset + 1]) << 8U) |
16 (std::to_integer<std::uint32_t>(
bytes[
offset + 2]) << 16U) |
17 (std::to_integer<std::uint32_t>(
bytes[
offset + 3]) << 24U);
21 std::size_t
offset)
noexcept
23 return static_cast<std::uint16_t
>(
25 (std::to_integer<std::uint8_t>(
bytes[
offset + 1]) << 8U));
29 std::size_t
offset)
noexcept
31 const auto value =
static_cast<std::uint16_t
>(
33 (std::to_integer<std::uint8_t>(
bytes[
offset + 1]) << 8U));
34 return static_cast<std::int16_t
>(
value);
39 const auto value =
static_cast<std::int32_t
>(
word & 0x00FF'FFFFU);
44 std::size_t
offset)
noexcept
85 return "InvalidSequenceErrorCode";
88 std::expected<LegacySequenceAttributes, SequenceError>
99 part.error().
offset,
"cannot enter sequence attribute",
part.error()});
111 part->headerOffset,
"sequence attribute count exceeds configured limit", {}});
115 if (
part->id >= 20 &&
part->id <= 24)
117 if (
part->dataSize > 4096)
121 "sequence external filename exceeds 4096 bytes", {}});
127 "cannot map sequence external filename",
128 bytes ? std::optional<ChunkError>{}
129 : std::optional<ChunkError>{
bytes.error()}});
130 std::string fileName;
131 fileName.reserve(
bytes->size());
132 for (
const auto byte : *
bytes)
134 const auto value = std::to_integer<std::uint8_t>(
byte);
135 if (
value == 0)
break;
136 fileName.push_back(
static_cast<char>(
value));
141 static_cast<std::uint8_t
>(
part->id - 19),
142 std::move(fileName)});
173 part->dataOffset,
"private sequence attribute is shorter than its fixed record", {}});
177 part->dataOffset,
"cannot map private sequence attribute",
bytes ?
178 std::optional<ChunkError>{} : std::optional<ChunkError>{
bytes.error()}});
184 const auto value = std::to_integer<std::uint8_t>((*
bytes)[0]);
187 part->dataOffset,
"sequence dimensionality must be 0, 2 or 3", {}});
241 for (std::size_t point = 0; point <
value.points.size(); ++point)
258 *
part, std::to_integer<std::uint8_t>((*
bytes)[0])});
266 *
part, std::to_integer<std::uint8_t>((*
bytes)[0])});
270 *
part,
static_cast<std::int8_t
>(
271 std::to_integer<std::uint8_t>((*
bytes)[0]))});
282 std::expected<LegacySequenceHeader, SequenceError>
289 "sequence common header requires three little-endian 32-bit words",
299 static_cast<std::uint8_t
>(
first >> 24U),
301 static_cast<std::uint8_t
>((second >> 24U) & 0x3FU),
302 (second & 0x4000'0000U) != 0,
303 (second & 0x8000'0000U) != 0,
304 static_cast<std::uint8_t
>(
third & 0x07U),
305 (
third & 0x08U) != 0,
306 (
third & 0x10U) != 0,
311 std::expected<LegacySequenceRecord, SequenceError>
322 "cannot enter the next sequence chunk", chunk.error() });
330 "sequence fixed record decoder does not support chunk ID " +
331 std::to_string(chunk->id), std::nullopt });
337 "chunk payload is shorter than its sequence fixed record",
346 "cannot map the sequence fixed record",
mapped.error() });
352 error.offset += chunk->dataOffset;
353 return std::unexpected(std::move(
error));
376 std::to_integer<std::uint8_t>((*
mapped)[12]) != 0,
377 std::to_integer<std::uint8_t>((*
mapped)[13]) != 0,
378 std::to_integer<std::uint8_t>((*
mapped)[14]),
379 std::to_integer<std::uint8_t>((*
mapped)[15]) != 0,
380 std::to_integer<std::uint8_t>((*
mapped)[16]) != 0,
381 std::to_integer<std::uint8_t>((*
mapped)[17]) != 0,
382 std::to_integer<std::uint8_t>((*
mapped)[18]) != 0,
383 static_cast<std::int8_t
>(
384 std::to_integer<std::uint8_t>((*
mapped)[19])),
385 static_cast<std::int8_t
>(
386 std::to_integer<std::uint8_t>((*
mapped)[20])),
387 static_cast<std::int8_t
>(
388 std::to_integer<std::uint8_t>((*
mapped)[21]))};
402 std::to_integer<std::uint8_t>((*
mapped)[12]) };
std::vector< std::byte > bytes
std::expected< ChunkInfo, ChunkError > descend(std::uint8_t findId=NullStandardId)
std::expected< LegacySequenceAttributes, SequenceError > readLegacySequenceAttributes(const LegacyChunkReader &reader, std::size_t maximumAttributes)
std::expected< LegacySequenceHeader, SequenceError > decodeLegacySequenceHeader(std::span< const std::byte > bytes)
constexpr std::size_t LegacySequenceHeaderSize
std::expected< LegacySequenceRecord, SequenceError > readLegacySequenceRecord(LegacyChunkReader &reader)
std::string_view sequenceErrorCodeName(SequenceErrorCode code) noexcept
std::optional< std::size_t > firstChildAttributeIndex
std::vector< LegacySequenceAttribute > values
std::array< float, 9 > values
std::array< std::array< float, 3 >, 8 > points
std::array< float, 16 > values