void SplitPage(int page_idx, int offset) { var bufs = SplitBuf(page_table[page_idx].data, offset); page_table[page_idx] = new Page(bufs.Item1); ; page_table.Insert(page_idx + 1, new Page(bufs.Item2)); }
/* public int FindPageIdx(Page p) { for (int i = 0; i < page_table.Count; i++) { if (page_table[i] == p) return i; } return -1; }*/ void CachePageAtOffset(int offset) { int page_idx = 0; int page_offset = 0; foreach (Page p in page_table) { if (offset < page_offset + p.size) page_offset += p.size; else { cur_page = p; cur_page_offset = page_offset; cur_page_idx = page_idx; return; } ++page_idx; } Debug.Assert(false); }
// TODO: get rid of size and use buf.Length instead? // Note: @size is the total size of buf Page[] PagesFromData(byte[] buf, int offset, int size) { size = size - offset; Debug.Assert(size > 0); int n = PagesForSize(size); Page[] pages = new Page[n]; int cur_page = 0; while (size > 0) { pages[cur_page].data = PageDataFromBuf(buf, ref size, ref offset); } return pages; }
public void InvalidateCache() { cur_page = null; }