aboutsummaryrefslogtreecommitdiff
path: root/macros/src/syntax/optimize.rs
blob: 87a6258d21ac60a8acdd4627213fad95bbcf76e2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use std::collections::{BTreeSet, HashMap};

use crate::syntax::{ast::App, Settings};

pub fn app(app: &mut App, settings: &Settings) {
    // "compress" priorities
    // If the user specified, for example, task priorities of "1, 3, 6",
    // compress them into "1, 2, 3" as to leave no gaps
    if settings.optimize_priorities {
        // all task priorities ordered in ascending order
        let priorities = app
            .hardware_tasks
            .values()
            .map(|task| Some(task.args.priority))
            .chain(
                app.software_tasks
                    .values()
                    .map(|task| Some(task.args.priority)),
            )
            .collect::<BTreeSet<_>>();

        let map = priorities
            .iter()
            .cloned()
            .zip(1..)
            .collect::<HashMap<_, _>>();

        for task in app.hardware_tasks.values_mut() {
            task.args.priority = map[&Some(task.args.priority)];
        }

        for task in app.software_tasks.values_mut() {
            task.args.priority = map[&Some(task.args.priority)];
        }
    }
}