in cpp/spectrum/image/metadata/Entry.cpp [331:368]
void Entry::parseFromAddressIntoTagMap(
const ReadContext& context,
const std::uint8_t* const begin,
TagMap& entriesDestination) {
SPECTRUM_ERROR_IF(
begin + sizeof(std::uint16_t) > context.dataEnd,
error::DataNotLargeEnough);
const auto countOfEntriesAddress =
reinterpret_cast<const std::uint16_t*>(begin);
const auto countOfEntries = core::utils::convertValueToNativeByteOrder(
*countOfEntriesAddress, context.isLittleEndianEncoded);
SPECTRUM_ERROR_IF(
begin + sizeof(std::uint16_t) + (countOfEntries * sizeof(MemoryLayout)) >
context.dataEnd,
error::DataNotLargeEnough);
const MemoryLayout* entriesLayout =
reinterpret_cast<const MemoryLayout*>(countOfEntriesAddress + 1);
for (std::uint16_t i = 0; i < countOfEntries; ++i) {
const auto tag =
static_cast<Tag>(core::utils::convertValueToNativeByteOrder(
entriesLayout[i].tag, context.isLittleEndianEncoded));
const auto type =
static_cast<Type>(core::utils::convertValueToNativeByteOrder(
entriesLayout[i].type, context.isLittleEndianEncoded));
const auto count = core::utils::convertValueToNativeByteOrder(
entriesLayout[i].count, context.isLittleEndianEncoded);
try {
entriesDestination.insert(std::make_pair(
tag,
Entry(tag, type, count, entriesLayout[i].extractValue(context))));
} catch (const SpectrumException& e) {
// TODO T30954248: WARN
}
}
}