Build from grouped equivalence classes carrying `(KId, &KConst)` pairs. Mirrors `MutConst::ctx` (`src/ix/mutual.rs:177-192`): - All members of class `j` get index `j`. - Ctor offsets start at `classes.len()` and advance by `max_ctors` per class so ctor addresses across classes don't collide.
(
classes: &[Vec<(KId<M>, &KConst<M>)>],
)
| 98 | /// - Ctor offsets start at `classes.len()` and advance by `max_ctors` |
| 99 | /// per class so ctor addresses across classes don't collide. |
| 100 | pub fn from_id_classes<M: KernelMode>( |
| 101 | classes: &[Vec<(KId<M>, &KConst<M>)>], |
| 102 | ) -> Self { |
| 103 | let mut map: FxHashMap<Address, usize> = FxHashMap::default(); |
| 104 | let mut i = classes.len(); |
| 105 | for (j, class) in classes.iter().enumerate() { |
| 106 | let mut max_ctors = 0usize; |
| 107 | for (id, cnst) in class { |
| 108 | map.insert(id.addr.clone(), j); |
| 109 | let ctor_ids = cnst_ctors::<M>(cnst); |
| 110 | max_ctors = max_ctors.max(ctor_ids.len()); |
| 111 | for (cidx, cid) in ctor_ids.iter().enumerate() { |
| 112 | map.insert(cid.addr.clone(), i + cidx); |
| 113 | } |
| 114 | } |
| 115 | i += max_ctors; |
| 116 | } |
| 117 | KMutCtx { map } |
| 118 | } |
| 119 | } |
| 120 | |
| 121 | // =========================================================================== |