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

📄 harray_8h-source.html

📁 FastDb是高效的内存数据库系统
💻 HTML
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>FastDB: harray.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.5 --><div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a></div><h1>harray.h</h1><div class="fragment"><pre>00001 <span class="comment">//-&lt; HARRAY.H &gt;------------------------------------------------------*--------*</span>00002 <span class="comment">// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *</span>00003 <span class="comment">// (Main Memory Database Management System)                          *   /\|  *</span>00004 <span class="comment">//                                                                   *  /  \  *</span>00005 <span class="comment">//                          Created:     25-Mar-2003  K.A. Knizhnik  * / [] \ *</span>00006 <span class="comment">//                          Last update: 25-Mar-2003  K.A. Knizhnik  * GARRET *</span>00007 <span class="comment">//-------------------------------------------------------------------*--------*</span>00008 <span class="comment">// Hierarchical array </span>00009 <span class="comment">//-------------------------------------------------------------------*--------*</span>00010 00011 <span class="preprocessor">#ifndef __HARRAY_H__</span>00012 <span class="preprocessor"></span><span class="preprocessor">#define __HARRAY_H__</span>00013 <span class="preprocessor"></span>00014 <span class="preprocessor">#include "fastdb.h"</span>00015 00016 <span class="keyword">const</span> size_t dbHArrayPageSize = dbPageSize / <span class="keyword">sizeof</span>(oid_t);00017 00018 <span class="preprocessor">#ifdef HAS_TEMPLATE_FRIENDS</span>00019 <span class="preprocessor"></span><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;  00020 <span class="keyword">class </span>dbHArray : <span class="keyword">public</span> <a class="code" href="classdbAnyReference.html">dbAnyReference</a> { 00021   <span class="keyword">public</span>:00022     <span class="keyword">enum</span> { 00023         leafPageSize = dbPageSize / <span class="keyword">sizeof</span>(T),00024         maxArraySize = dbHArrayPageSize*dbHArrayPageSize*leafPageSize00025     };00026 00027     <span class="keywordtype">void</span> create(<a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 00028         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb32">beginTransaction</a>(dbDatabase::dbExclusiveLock);00029         oid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb27">allocateObject</a>(dbHArrayPageMarker);00030         memset(db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(oid), 0, dbPageSize);00031     }00032 00033     T get(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db)<span class="keyword"> const </span>{ 00034         assert (oid != 0 &amp;&amp; i &lt; maxArraySize); 00035         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb32">beginTransaction</a>(dbDatabase::dbSharedLock);00036         oid_t* page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(oid);00037         oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];00038         <span class="keywordflow">if</span> (pageOid == 0) { 00039             <span class="keywordflow">return</span> 0;00040         }00041         page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(pageOid);00042         pageOid = page[i / leafPageSize % dbHArrayPageSize];00043         <span class="keywordflow">if</span> (pageOid == 0) { 00044             <span class="keywordflow">return</span> 0;00045         }00046         T* leaf = (T*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(pageOid);00047         <span class="keywordflow">return</span> leaf[i % leafPageSize];00048     }00049 00050     T&amp; set(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 00051         assert (oid != 0 &amp;&amp; i &lt; maxArraySize);00052         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb32">beginTransaction</a>(dbDatabase::dbExclusiveLock);00053         oid_t* page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(oid);00054         oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];00055         <span class="keywordflow">if</span> (pageOid == 0) { 00056             pageOid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb27">allocateObject</a>(dbHArrayPageMarker);00057             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb8">put</a>(oid);00058             page[i / (dbHArrayPageSize*leafPageSize)] = pageOid;00059             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(pageOid);00060             memset(page, 0, dbPageSize);00061         } <span class="keywordflow">else</span> { 00062             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(pageOid);00063         }00064         oid_t leafPageOid = page[i / leafPageSize % dbHArrayPageSize];00065         T* leaf;00066         <span class="keywordflow">if</span> (leafPageOid == 0) { 00067             leafPageOid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb27">allocateObject</a>(dbHArrayPageMarker);00068             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb8">put</a>(pageOid);00069             page[i / leafPageSize % dbHArrayPageSize] = leafPageOid;00070             leaf = (T*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(leafPageOid);00071             memset(leaf, 0, dbPageSize);00072         } <span class="keywordflow">else</span> { 00073             leaf = (T*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb8">put</a>(leafPageOid);00074         }00075         <span class="keywordflow">return</span> leaf[i % leafPageSize];00076     }00077 00078     <span class="keywordtype">void</span> set(size_t i, T value, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 00079         set(i, db) = value;00080     }00081 };00082 <span class="preprocessor">#else</span>00083 <span class="preprocessor"></span><span class="keyword">class </span>dbAnyHArray : <span class="keyword">public</span> <a class="code" href="classdbAnyReference.html">dbAnyReference</a> { 00084   <span class="keyword">public</span>:00085     <span class="keywordtype">void</span> create(<a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 00086         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb32">beginTransaction</a>(dbDatabase::dbExclusiveLock);00087         oid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb27">allocateObject</a>(dbHArrayPageMarker);00088         memset(db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(oid), 0, dbPageSize);00089     }00090 00091     byte* get(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db, <span class="keyword">const</span> size_t maxArraySize, <span class="keyword">const</span> size_t leafPageSize)<span class="keyword"> const </span>{ 00092         assert (oid != 0 &amp;&amp; i &lt; maxArraySize); 00093         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb32">beginTransaction</a>(dbDatabase::dbSharedLock);00094         oid_t* page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(oid);00095         oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];00096         <span class="keywordflow">if</span> (pageOid == 0) { 00097             <span class="keywordflow">return</span> 0;00098         }00099         page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(pageOid);00100         pageOid = page[i / leafPageSize % dbHArrayPageSize];00101         <span class="keywordflow">if</span> (pageOid == 0) { 00102             <span class="keywordflow">return</span> 0;00103         }00104         <span class="keywordflow">return</span> db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(pageOid);00105     }00106 00107     byte* set(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db, <span class="keyword">const</span> size_t maxArraySize, <span class="keyword">const</span> size_t leafPageSize) { 00108         assert (oid != 0 &amp;&amp; i &lt; maxArraySize);00109         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb32">beginTransaction</a>(dbDatabase::dbExclusiveLock);00110         oid_t* page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(oid);00111         oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];00112         <span class="keywordflow">if</span> (pageOid == 0) { 00113             pageOid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb27">allocateObject</a>(dbHArrayPageMarker);00114             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb8">put</a>(oid);00115             page[i / (dbHArrayPageSize*leafPageSize)] = pageOid;00116             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(pageOid);00117             memset(page, 0, dbPageSize);00118         } <span class="keywordflow">else</span> { 00119             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(pageOid);00120         }00121         oid_t leafPageOid = page[i / leafPageSize % dbHArrayPageSize];00122         byte* leaf;00123         <span class="keywordflow">if</span> (leafPageOid == 0) { 00124             leafPageOid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb27">allocateObject</a>(dbHArrayPageMarker);00125             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb8">put</a>(pageOid);00126             page[i / leafPageSize % dbHArrayPageSize] = leafPageOid;00127             leaf = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb7">get</a>(leafPageOid);00128             memset(leaf, 0, dbPageSize);00129         } <span class="keywordflow">else</span> { 00130             leaf = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb8">put</a>(leafPageOid);00131         }00132         <span class="keywordflow">return</span> leaf;00133     }00134 };00135 00136 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;  00137 <span class="keyword">class </span>dbHArray : <span class="keyword">public</span> dbAnyHArray { 00138   <span class="keyword">public</span>:00139     <span class="keyword">enum</span> { 00140         leafPageSize = dbPageSize / <span class="keyword">sizeof</span>(T),00141         maxArraySize = dbHArrayPageSize*dbHArrayPageSize*leafPageSize00142     };00143 00144     <span class="keywordtype">void</span> set(size_t i, T value, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 00145         set(i, db) = value;00146     }00147     T get(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db)<span class="keyword"> const </span>{ 00148         <span class="keywordflow">return</span> ((T*)dbAnyHArray::get(i, db, maxArraySize, leafPageSize))[i % leafPageSize];00149     }00150     T&amp; set(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 00151         <span class="keywordflow">return</span> ((T*)dbAnyHArray::set(i, db, maxArraySize, leafPageSize))[i % leafPageSize];00152     }00153 };00154 <span class="preprocessor">#endif</span>00155 <span class="preprocessor"></span>00156 00157 00158 00159 <span class="keyword">class </span>dbBitmap : <span class="keyword">public</span> dbHArray&lt;int4&gt; { 00160     <span class="keyword">typedef</span> dbHArray&lt;int4&gt; base;00161   <span class="keyword">public</span>:00162     <span class="keywordtype">void</span> create(<a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 00163         base::create(db);00164     }00165 00166     <span class="keywordtype">bool</span> get(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db)<span class="keyword"> const </span>{ 00167         <span class="keywordflow">return</span> (base::get(i &gt;&gt; 5, db) &amp; (1 &lt;&lt; (i &amp; 31))) != 0;00168     }00169 00170     <span class="keywordtype">void</span> set(size_t i, <span class="keywordtype">bool</span> value, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db) {00171         int4&amp; mask = base::set(i &gt;&gt; 5, db);00172         <span class="keywordflow">if</span> (value) { 00173             mask |= 1 &lt;&lt; (i &amp; 31);00174         } <span class="keywordflow">else</span> { 00175             mask &amp;= ~(1 &lt;&lt; (i &amp; 31));00176         }00177     }00178 };        00179  00180 <span class="preprocessor">#endif</span>00181 <span class="preprocessor"></span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Feb 12 13:04:48 2004 for FastDB by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.5 </small></address></body></html>

⌨️ 快捷键说明

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