void Entry::parseFromAddressIntoTagMap()

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
    }
  }
}