18 void IROptimizer::process(
const std::vector<IR::Block>& pages,
const std::vector<std::string>& symbols,
const std::vector<ValTableElem>& values)
24 auto map = []<
typename T>(
const std::optional<T>& opt,
auto&& lambda) ->
decltype(std::optional(lambda(opt.value()))) {
26 return lambda(opt.value());
30 auto or_else = []<
typename T>(
const std::optional<T>& opt,
auto&& lambda) -> std::optional<T> {
36 for (
const auto& block : pages)
42 const std::size_t end = block.size();
46 std::optional<EntityWithOffset> maybe_compacted = std::nullopt;
49 maybe_compacted = map(
51 [](
const auto& entity) {
52 return std::make_optional<EntityWithOffset>(entity, 2);
55 maybe_compacted = or_else(
60 [](
const auto& entity) {
61 return std::make_optional<EntityWithOffset>(entity, 3);
65 if (maybe_compacted.has_value())
67 auto [entity, offset] = maybe_compacted.value();
68 current_block.emplace_back(entity);
73 current_block.emplace_back(block[i]);