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

📄 harray_8h-source.html

📁 最新版本!fastdb是高效的内存数据库系统
💻 HTML
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>harray.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.18 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </center>
<hr><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 BEGIN_FASTDB_NAMESPACE
00015 
00016 <span class="preprocessor">#include "fastdb.h"</span>
00017 
00018 <span class="keyword">const</span> size_t dbHArrayPageSize = dbPageSize / <span class="keyword">sizeof</span>(oid_t);
00019 
00020 <span class="preprocessor">#ifdef HAS_TEMPLATE_FRIENDS</span>
00021 <span class="preprocessor"></span><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;  
00022 <span class="keyword">class </span>dbHArray : <span class="keyword">public</span> <a class="code" href="classdbAnyReference.html">dbAnyReference</a> { 
00023   <span class="keyword">public</span>:
00024     <span class="keyword">enum</span> { 
00025         leafPageSize = dbPageSize / <span class="keyword">sizeof</span>(T),
00026         maxArraySize = dbHArrayPageSize*dbHArrayPageSize*leafPageSize
00027     };
00028 
00029     <span class="keywordtype">void</span> create(<a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 
00030         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb43">beginTransaction</a>(dbDatabase::dbExclusiveLock);
00031         oid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb38">allocateObject</a>(dbPageObjectMarker);
00032         memset(db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(oid), 0, dbPageSize);
00033     }
00034 
00035     T get(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db)<span class="keyword"> const </span>{ 
00036         assert (oid != 0 &amp;&amp; i &lt; maxArraySize); 
00037         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb43">beginTransaction</a>(dbDatabase::dbSharedLock);
00038         oid_t* page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(oid);
00039         oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];
00040         <span class="keywordflow">if</span> (pageOid == 0) { 
00041             <span class="keywordflow">return</span> 0;
00042         }
00043         page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(pageOid);
00044         pageOid = page[i / leafPageSize % dbHArrayPageSize];
00045         <span class="keywordflow">if</span> (pageOid == 0) { 
00046             <span class="keywordflow">return</span> 0;
00047         }
00048         T* leaf = (T*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(pageOid);
00049         <span class="keywordflow">return</span> leaf[i % leafPageSize];
00050     }
00051 
00052     T&amp; set(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 
00053         assert (oid != 0 &amp;&amp; i &lt; maxArraySize);
00054         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb43">beginTransaction</a>(dbDatabase::dbExclusiveLock);
00055         oid_t* page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(oid);
00056         oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];
00057         <span class="keywordflow">if</span> (pageOid == 0) { 
00058             pageOid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb38">allocateObject</a>(dbPageObjectMarker);
00059             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb18">put</a>(oid);
00060             page[i / (dbHArrayPageSize*leafPageSize)] = pageOid;
00061             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(pageOid);
00062             memset(page, 0, dbPageSize);
00063         } <span class="keywordflow">else</span> { 
00064             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(pageOid);
00065         }
00066         oid_t leafPageOid = page[i / leafPageSize % dbHArrayPageSize];
00067         T* leaf;
00068         <span class="keywordflow">if</span> (leafPageOid == 0) { 
00069             leafPageOid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb38">allocateObject</a>(dbPageObjectMarker);
00070             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb18">put</a>(pageOid);
00071             page[i / leafPageSize % dbHArrayPageSize] = leafPageOid;
00072             leaf = (T*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(leafPageOid);
00073             memset(leaf, 0, dbPageSize);
00074         } <span class="keywordflow">else</span> { 
00075             leaf = (T*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb18">put</a>(leafPageOid);
00076         }
00077         <span class="keywordflow">return</span> leaf[i % leafPageSize];
00078     }
00079 
00080     <span class="keywordtype">void</span> set(size_t i, T value, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 
00081         set(i, db) = value;
00082     }
00083 };
00084 <span class="preprocessor">#else</span>
00085 <span class="preprocessor"></span><span class="keyword">class </span>dbAnyHArray : <span class="keyword">public</span> <a class="code" href="classdbAnyReference.html">dbAnyReference</a> { 
00086   <span class="keyword">public</span>:
00087     <span class="keywordtype">void</span> create(<a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 
00088         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb43">beginTransaction</a>(dbDatabase::dbExclusiveLock);
00089         oid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb38">allocateObject</a>(dbPageObjectMarker);
00090         memset(db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(oid), 0, dbPageSize);
00091     }
00092 
00093     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>{ 
00094         assert (oid != 0 &amp;&amp; i &lt; maxArraySize); 
00095         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb43">beginTransaction</a>(dbDatabase::dbSharedLock);
00096         oid_t* page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(oid);
00097         oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];
00098         <span class="keywordflow">if</span> (pageOid == 0) { 
00099             <span class="keywordflow">return</span> 0;
00100         }
00101         page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(pageOid);
00102         pageOid = page[i / leafPageSize % dbHArrayPageSize];
00103         <span class="keywordflow">if</span> (pageOid == 0) { 
00104             <span class="keywordflow">return</span> 0;
00105         }
00106         <span class="keywordflow">return</span> db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(pageOid);
00107     }
00108 
00109     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) { 
00110         assert (oid != 0 &amp;&amp; i &lt; maxArraySize);
00111         db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb43">beginTransaction</a>(dbDatabase::dbExclusiveLock);
00112         oid_t* page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(oid);
00113         oid_t pageOid = page[i / (dbHArrayPageSize*leafPageSize)];
00114         <span class="keywordflow">if</span> (pageOid == 0) { 
00115             pageOid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb38">allocateObject</a>(dbPageObjectMarker);
00116             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb18">put</a>(oid);
00117             page[i / (dbHArrayPageSize*leafPageSize)] = pageOid;
00118             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(pageOid);
00119             memset(page, 0, dbPageSize);
00120         } <span class="keywordflow">else</span> { 
00121             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(pageOid);
00122         }
00123         oid_t leafPageOid = page[i / leafPageSize % dbHArrayPageSize];
00124         byte* leaf;
00125         <span class="keywordflow">if</span> (leafPageOid == 0) { 
00126             leafPageOid = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb38">allocateObject</a>(dbPageObjectMarker);
00127             page = (oid_t*)db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb18">put</a>(pageOid);
00128             page[i / leafPageSize % dbHArrayPageSize] = leafPageOid;
00129             leaf = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb17">get</a>(leafPageOid);
00130             memset(leaf, 0, dbPageSize);
00131         } <span class="keywordflow">else</span> { 
00132             leaf = db-&gt;<a class="code" href="classdbDatabase.html#dbSubSqlb18">put</a>(leafPageOid);
00133         }
00134         <span class="keywordflow">return</span> leaf;
00135     }
00136 };
00137 
00138 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;  
00139 <span class="keyword">class </span>dbHArray : <span class="keyword">public</span> dbAnyHArray { 
00140   <span class="keyword">public</span>:
00141     <span class="keyword">enum</span> { 
00142         leafPageSize = dbPageSize / <span class="keyword">sizeof</span>(T),
00143         maxArraySize = dbHArrayPageSize*dbHArrayPageSize*leafPageSize
00144     };
00145 
00146     <span class="keywordtype">void</span> set(size_t i, T value, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 
00147         set(i, db) = value;
00148     }
00149     T get(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db)<span class="keyword"> const </span>{ 
00150         <span class="keywordflow">return</span> ((T*)dbAnyHArray::get(i, db, maxArraySize, leafPageSize))[i % leafPageSize];
00151     }
00152     T&amp; set(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 
00153         <span class="keywordflow">return</span> ((T*)dbAnyHArray::set(i, db, maxArraySize, leafPageSize))[i % leafPageSize];
00154     }
00155 };
00156 <span class="preprocessor">#endif</span>
00157 <span class="preprocessor"></span>
00158 
00159 
00160 
00161 <span class="keyword">class </span>dbBitmap : <span class="keyword">public</span> dbHArray&lt;int4&gt; { 
00162     <span class="keyword">typedef</span> dbHArray&lt;int4&gt; base;
00163   <span class="keyword">public</span>:
00164     <span class="keywordtype">void</span> create(<a class="code" href="classdbDatabase.html">dbDatabase</a>* db) { 
00165         base::create(db);
00166     }
00167 
00168     <span class="keywordtype">bool</span> get(size_t i, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db)<span class="keyword"> const </span>{ 
00169         <span class="keywordflow">return</span> (base::get(i &gt;&gt; 5, db) &amp; (1 &lt;&lt; (i &amp; 31))) != 0;
00170     }
00171 
00172     <span class="keywordtype">void</span> set(size_t i, <span class="keywordtype">bool</span> value, <a class="code" href="classdbDatabase.html">dbDatabase</a>* db) {
00173         int4&amp; mask = base::set(i &gt;&gt; 5, db);
00174         <span class="keywordflow">if</span> (value) { 
00175             mask |= 1 &lt;&lt; (i &amp; 31);
00176         } <span class="keywordflow">else</span> { 
00177             mask &amp;= ~(1 &lt;&lt; (i &amp; 31));
00178         }
00179     }
00180 };        
00181 
00182 END_FASTDB_NAMESPACE
00183  
00184 <span class="preprocessor">#endif</span>
00185 <span class="preprocessor"></span>
</pre></div><hr><address style="align: right;"><small>Generated on Thu Feb 14 12:42:30 2008 for FastDB by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 
width=110 height=53></a>1.2.18 </small></address>
</body>
</html>

⌨️ 快捷键说明

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