לדלג לתוכן

פתרון פרויקט ספריית משאבים ונתונים

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

הparser אינו מבצע reinterpret_cast של header מהקלט. הוא קורא bytes לרוחבים מפורשים ובודק קודם שהשדה כולו קיים. אם הרשומה חוצה buffer, הוא שומר progress או מעתיק header קטן לאחסון ביניים; הוא אינו מניח שכל chunk הוא הודעה.

הallocator הלימודי מחזיק מונה של ניסיונות הקצאה ומספר ניסיון שבו עליו להיכשל. כל הרצה מתחילה מאותו קלט ומאותו מצב. כשכשל מוזרק לפני commit, המצב הישן נשאר ניתן לקריאה והמונה של allocations חיים חוזר לערכו הקודם. אם API הוגדר עם basic guarantee בלבד, משווים invariant במקום לדרוש שוויון מלא.

הבדיקה של view מפנה אל owner חי. כדי למנוע שימוש אחרי move או החלפת האחסון אפשר לבחור interface שמחזיק reference משותף לאחסון בלתי משתנה, או להגביל במפורש את חיי view. לא נותנים למשתמש לחשוב שspan מחזיק את הנתונים בעצמו.

הbackend הראשון יכול לאחסן את כל bytes ברצף, והשני יכול לשמור chunks עם טבלת offsets. ההשוואה מודדת אותו קלט ואותן שאילתות, כולל מספר הקצאות וגודל retained memory. אסור להשוות backend שמעתיק נתונים מול אחר שמסתמך על קלט שכבר שוחרר.

הבדיקות השליליות בקומפילציה מוודאות שאין copy של owner שאמור להיות move-only ושאין המרה משתיקה שגיאה. הבדיקות בריצה כוללות רשומה באורך אפס, אורך מרבי, overflow, קלט שנקטע בכל byte ונתונים נוספים אחרי סוף הפורמט. התוצאה הנכונה היא חוזה שנשמר בכל המקרים, ולא רק parser שמצליח על הקובץ הראשון.