לדלג לתוכן

פתרון מחזור חריצים

המתודה הבאה מצטרפת ל־impl Pool<T> ושומרת על אותו תנאי תקפות כמו get.

fn get_mut(&mut self, key: Key) -> Option<&mut T> {
    let slot = self.slots.get_mut(key.index)?;
    if slot.generation != key.generation { return None; }
    slot.value.as_mut()
}

בבדיקת קצה אפשר ליצור מאגר עם חריץ יחיד שדורו u64::MAX, להסיר את הערך ולבדוק שרשימת הפנויים ריקה. הוספה חדשה צריכה ליצור חריץ אחר. קריאה חוזרת של remove מחזירה None משום שאין עוד ערך, ואינה מוסיפה את אותו אינדקס לרשימת הפנויים פעמיים.

זהות מאגר יכולה להיות חלק מהמפתח ולהיבדק בכל פעולה, אבל גם לה נדרש חוזה ייחודיות. חלופה מתקדמת היא API שמקשר את המפתחות למותג חיים שאינו ניתן לערבוב בקוד בטוח. הבחירה תלויה בשאלה אם המפתחות צריכים להישמר בקובץ, לעבור בין רכיבים או להישאר בתוך scope מקומי.