📄 gistfilecache.cpp
字号:
//--------------------------------------------------------------------// GiSTfileCache.cpp// -----------------//// GiST - Generalized Search Tree // June 2001 release, Aalborg University// // This file is a revised version of a part of the original // libGiST release (version 0.9beta1) // Copyright (c) 1996, Regents of the University of California//#include "GiSTfileCache.h"#include <string.h>//--------------------------------------------------------------------void GiSTfileCache::Reset(){ if (buffer) delete buffer; buffer = new char[DEF_FILECACHE_SIZE * PageSize()]; assert (buffer); lenPageNums = 0; for (int i = 0; i < DEF_FILECACHE_SIZE2; i++) lookUp[i] = -1; GiSTfile::Reset();}//--------------------------------------------------------------------void GiSTfileCache::Create(const char *filename){ Reset(); GiSTfile::Create(filename);}//--------------------------------------------------------------------void GiSTfileCache::Open (const char *filename){ Reset(); GiSTfile::Open(filename);}//--------------------------------------------------------------------void GiSTfileCache::Close (){ for (int i = 0; i < lenPageNums; i++) if (dirty[i]) GiSTfile::Write(pageNums[i], buffer + i * PageSize()); GiSTfile::Close(); }//--------------------------------------------------------------------void GiSTfileCache::Read (GiSTpage page, char *buf){ assert(page < DEF_FILECACHE_SIZE2); if (lookUp[page] != -1) { memcpy(buf, buffer + lookUp[page] * PageSize(), PageSize()); return; } GiSTfile::Read(page, buf); int ns = GetNewSlot(); lookUp[page] = ns; pageNums[ns] = page; dirty[ns] = 0; memcpy(buffer + ns * PageSize(), buf, PageSize());}//--------------------------------------------------------------------void GiSTfileCache::Write (GiSTpage page, const char *buf){ assert(page < DEF_FILECACHE_SIZE2); if (lookUp[page] != -1) { memcpy(buffer + lookUp[page] * PageSize(), buf, PageSize()); dirty[lookUp[page]] = 1; return; } int ns = GetNewSlot(); lookUp[page] = ns; pageNums[ns] = page; dirty[ns] = 1; memcpy(buffer + ns * PageSize(), buf, PageSize()); }//--------------------------------------------------------------------int GiSTfileCache::GetNewSlot(){ if (lenPageNums == DEF_FILECACHE_SIZE) { if (dirty[lenPageNums - 1]) GiSTfile::Write(pageNums[lenPageNums - 1], buffer + (lenPageNums - 1) * PageSize()); lookUp[pageNums[lenPageNums - 1]] = -1; return lenPageNums - 1; } return lenPageNums++;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -