docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
loop_provenance.h
Go to the documentation of this file.
1#pragma once
2
3#include <charconv>
4#include <optional>
5#include <stdexcept>
6#include <string>
7
8#include "sdfg/element.h"
9
10namespace sdfg::metadata {
11
12inline constexpr const char* SOURCE_LOOP_ID_METADATA_KEY = "sdfg.source_loop_id.v1";
13
14inline std::optional<ElementId> source_loop_id(const Element& element) {
15 const auto* serialized = element.metadata_if_exists(SOURCE_LOOP_ID_METADATA_KEY);
16 if (serialized == nullptr) {
17 return std::nullopt;
18 }
19 ElementId id = 0;
20 const auto [end, error] = std::from_chars(serialized->data(), serialized->data() + serialized->size(), id);
21 if (error != std::errc{} || end != serialized->data() + serialized->size() || id == 0) {
22 throw std::runtime_error("Invalid source loop ID element metadata");
23 }
24 return id;
25}
26
27inline void set_source_loop_id(Element& element, std::optional<ElementId> original_id) {
28 if (!original_id.has_value()) {
30 return;
31 }
32 if (original_id.value() == 0) {
33 throw std::invalid_argument("Source loop ID must be nonzero");
34 }
35 element.add_metadata(SOURCE_LOOP_ID_METADATA_KEY, std::to_string(original_id.value()));
36}
37
38} // namespace sdfg::metadata
Definition element.h:159
void remove_metadata(const std::string &key)
const std::string * metadata_if_exists(const std::string &key) const
void add_metadata(const std::string &key, const std::string &value)
Definition loop_provenance.h:10
std::optional< ElementId > source_loop_id(const Element &element)
Definition loop_provenance.h:14
constexpr const char * SOURCE_LOOP_ID_METADATA_KEY
Definition loop_provenance.h:12
void set_source_loop_id(Element &element, std::optional< ElementId > original_id)
Definition loop_provenance.h:27
size_t ElementId
Definition element.h:215