/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: MemoryPageStorage.java * * Copyright (c) 2009 Sun Microsystems and Static Free Software * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Electric(tm) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */ package com.sun.electric.database.geometry.btree; /** A PageStorage that uses plain old memory. */ public class MemoryPageStorage extends CachingPageStorage { private CachedPageImpl[] pages; private int numpages; public MemoryPageStorage(int pagesize) { super(pagesize); this.numpages = 0; this.pages = new CachedPageImpl[1]; } public int getNumPages() { return numpages; } public int createPage() { if (numpages >= pages.length) { CachedPageImpl[] newpages = new CachedPageImpl[pages.length*2]; System.arraycopy(pages, 0, newpages, 0, pages.length); pages = newpages; } pages[numpages] = new CachedPageImpl(numpages); return numpages++; } /** no-op */ public void fsync(int pageid) { } /** no-op */ public void fsync() { } public void writePage(int pageid, byte[] buf, int ofs) { System.arraycopy(buf, ofs, pages[pageid].buf, 0, getPageSize()); } public void readPage(int pageid, byte[] buf, int ofs) { System.arraycopy(pages[pageid].buf, 0, buf, ofs, getPageSize()); } public synchronized void close() { pages = null; } public CachedPage getPage(int pageid, boolean readBytes) { return pages[pageid]; } private class CachedPageImpl extends CachedPage { private int pageid; private byte[] buf; private boolean dirty; public CachedPageImpl(int pageid) { this.pageid = pageid; this.buf = new byte[getPageSize()]; } public byte[] getBuf() { return buf; } public int getPageId() { return pageid; } public void touch() { } public void setDirty() { this.dirty = true; } public void flush() { this.dirty = false; } public boolean isDirty() { return dirty; } } }