hibana 0.9.4

Session-typed choreographic programming for no_std Rust protocols, inspired by affine MPST
Documentation
use super::super::{MAX_LOCAL_STEP_LANES, PackedRollScopeRow, RoleLaneScratch, ScopeKind};
use crate::global::const_dsl::EffList;

impl RoleLaneScratch {
    pub(super) const fn push_roll_scope_rows(&mut self, eff_list: &EffList, role: u8) {
        let markers = eff_list.scope_markers();
        if !Self::scope_markers_contain_kind(markers, ScopeKind::Roll) {
            return;
        }
        let mut marker_idx = 0usize;
        while marker_idx < markers.len() {
            let marker = markers[marker_idx];
            if Self::first_enter_for_scope(markers, marker_idx)
                && matches!(marker.scope_id.kind(), Some(ScopeKind::Roll))
            {
                let end_eff = Self::scope_segment_end(markers, marker_idx, eff_list.len());
                let row =
                    Self::local_step_range_for_eff_range(eff_list, marker.offset(), end_eff, role);
                if !row.is_absent_or_zero_len() {
                    let idx = self.roll_scope_row_len as usize;
                    if idx >= MAX_LOCAL_STEP_LANES {
                        panic!("roll scope row overflow");
                    }
                    self.roll_scope_rows[idx] = PackedRollScopeRow::new(marker.scope_id, row);
                    self.roll_scope_row_len += 1;
                }
            }
            marker_idx += 1;
        }
    }
}