⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 harray.h

📁 fastdb-2.92的源码
💻 H
字号:
//-< HARRAY.H >------------------------------------------------------*--------*// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *// (Main Memory Database Management System)                          *   /\|  *//                                                                   *  /  \  *//                          Created:     25-Mar-2003  K.A. Knizhnik  * / [] \ *//                          Last update: 25-Mar-2003  K.A. Knizhnik  * GARRET *//-------------------------------------------------------------------*--------*// Hierarchical array //-------------------------------------------------------------------*--------*#ifndef __HARRAY_H__#define __HARRAY_H__#include "fastdb.h"const size_t dbHArrayPageSize = dbPageSize / sizeof(oid_t);#ifdef HAS_TEMPLATE_FRIENDStemplate<class T>  class dbHArray : public dbAnyReference {   public:    enum {         leafPageSize = dbPageSize / sizeof(T),        maxArraySize = dbHArrayPageSize*dbHArrayPageSize*leafPageSize    };    void create(dbDatabase* db) {         db->beginTransaction(dbDatabase::dbExclusiveLock);        oid = db->allocateObject(dbHArrayPageMarker);        memset(db->get(oid), 0, dbPageSize);    }    T get(size_t i, dbDatabase* db) const {         assert (oid != 0 && i < maxArraySize);         db->beginTransaction(dbDatabase::dbSharedLock);        oid_t* page = (oid_t*)db->get(oid);        oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];        if (pageOid == 0) {             return 0;        }        page = (oid_t*)db->get(pageOid);        pageOid = page[i / leafPageSize % dbHArrayPageSize];        if (pageOid == 0) {             return 0;        }        T* leaf = (T*)db->get(pageOid);        return leaf[i % leafPageSize];    }    T& set(size_t i, dbDatabase* db) {         assert (oid != 0 && i < maxArraySize);        db->beginTransaction(dbDatabase::dbExclusiveLock);        oid_t* page = (oid_t*)db->get(oid);        oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];        if (pageOid == 0) {             pageOid = db->allocateObject(dbHArrayPageMarker);            page = (oid_t*)db->put(oid);            page[i / (dbHArrayPageSize*leafPageSize)] = pageOid;            page = (oid_t*)db->get(pageOid);            memset(page, 0, dbPageSize);        } else {             page = (oid_t*)db->get(pageOid);        }        oid_t leafPageOid = page[i / leafPageSize % dbHArrayPageSize];        T* leaf;        if (leafPageOid == 0) {             leafPageOid = db->allocateObject(dbHArrayPageMarker);            page = (oid_t*)db->put(pageOid);            page[i / leafPageSize % dbHArrayPageSize] = leafPageOid;            leaf = (T*)db->get(leafPageOid);            memset(leaf, 0, dbPageSize);        } else {             leaf = (T*)db->put(leafPageOid);        }        return leaf[i % leafPageSize];    }    void set(size_t i, T value, dbDatabase* db) {         set(i, db) = value;    }};#elseclass dbAnyHArray : public dbAnyReference {   public:    void create(dbDatabase* db) {         db->beginTransaction(dbDatabase::dbExclusiveLock);        oid = db->allocateObject(dbHArrayPageMarker);        memset(db->get(oid), 0, dbPageSize);    }    byte* get(size_t i, dbDatabase* db, const size_t maxArraySize, const size_t leafPageSize) const {         assert (oid != 0 && i < maxArraySize);         db->beginTransaction(dbDatabase::dbSharedLock);        oid_t* page = (oid_t*)db->get(oid);        oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];        if (pageOid == 0) {             return 0;        }        page = (oid_t*)db->get(pageOid);        pageOid = page[i / leafPageSize % dbHArrayPageSize];        if (pageOid == 0) {             return 0;        }        return db->get(pageOid);    }    byte* set(size_t i, dbDatabase* db, const size_t maxArraySize, const size_t leafPageSize) {         assert (oid != 0 && i < maxArraySize);        db->beginTransaction(dbDatabase::dbExclusiveLock);        oid_t* page = (oid_t*)db->get(oid);        oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];        if (pageOid == 0) {             pageOid = db->allocateObject(dbHArrayPageMarker);            page = (oid_t*)db->put(oid);            page[i / (dbHArrayPageSize*leafPageSize)] = pageOid;            page = (oid_t*)db->get(pageOid);            memset(page, 0, dbPageSize);        } else {             page = (oid_t*)db->get(pageOid);        }        oid_t leafPageOid = page[i / leafPageSize % dbHArrayPageSize];        byte* leaf;        if (leafPageOid == 0) {             leafPageOid = db->allocateObject(dbHArrayPageMarker);            page = (oid_t*)db->put(pageOid);            page[i / leafPageSize % dbHArrayPageSize] = leafPageOid;            leaf = db->get(leafPageOid);            memset(leaf, 0, dbPageSize);        } else {             leaf = db->put(leafPageOid);        }        return leaf;    }};template<class T>  class dbHArray : public dbAnyHArray {   public:    enum {         leafPageSize = dbPageSize / sizeof(T),        maxArraySize = dbHArrayPageSize*dbHArrayPageSize*leafPageSize    };    void set(size_t i, T value, dbDatabase* db) {         set(i, db) = value;    }    T get(size_t i, dbDatabase* db) const {         return ((T*)dbAnyHArray::get(i, db, maxArraySize, leafPageSize))[i % leafPageSize];    }    T& set(size_t i, dbDatabase* db) {         return ((T*)dbAnyHArray::set(i, db, maxArraySize, leafPageSize))[i % leafPageSize];    }};#endifclass dbBitmap : public dbHArray<int4> {     typedef dbHArray<int4> base;  public:    void create(dbDatabase* db) {         base::create(db);    }    bool get(size_t i, dbDatabase* db) const {         return (base::get(i >> 5, db) & (1 << (i & 31))) != 0;    }    void set(size_t i, bool value, dbDatabase* db) {        int4& mask = base::set(i >> 5, db);        if (value) {             mask |= 1 << (i & 31);        } else {             mask &= ~(1 << (i & 31));        }    }};         #endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -