לדלג לתוכן

1.7 - השאלה בלעדית משותפת וחוזרת - פתרון

פתרון חלוקה לטווחים זרים

נבדוק את המיקום לפני החלוקה. לאחר מכן הספרייה מספקת שתי פרוסות בלעדיות שאינן חופפות, והלולאות פועלות על הרשאות שונות.

fn transform(bytes: &mut [u8], middle: usize) -> bool {
    if middle > bytes.len() {
        return false;
    }
    let (left, right) = bytes.split_at_mut(middle);
    for byte in left {
        *byte = byte.wrapping_add(1);
    }
    right.fill(0);
    true
}

fn main() {
    let mut bytes = [255, 2, 3, 4];
    assert!(transform(&mut bytes, 2));
    assert_eq!(bytes, [0, 3, 0, 0]);
    let saved = bytes;
    assert!(!transform(&mut bytes, 5));
    assert_eq!(bytes, saved);
    assert!(transform(&mut bytes, 4));
    assert_eq!(bytes, [1, 4, 1, 1]);
    assert!(transform(&mut bytes, 0));
    assert_eq!(bytes, [0, 0, 0, 0]);
}

החיתוך בסוף יוצר צד ימני ריק, והחיתוך באפס יוצר צד שמאלי ריק. שני המצבים חוקיים. חיתוך מעבר לסוף אינו מתאר חלוקה של הפרוסה ולכן חייב להידחות לפני שינוי הנתונים.

בדוגמת ה־Vec אפשר להדפיס את first לפני push וכך לסיים את ההשאלה. לחלופין אפשר לכתוב let first = values[0], משום שהמספר מועתק לערך עצמאי. הגדלת הקיבולת מראש אינה משנה את החתימה של push ואת דרישתה לגישה בלעדית לאוסף.