1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Dbstl miscellaneous notes</title>
<link rel="stylesheet" href="gettingStarted.css" type="text/css" />
<meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
<link rel="start" href="index.html" title="Berkeley DB Programmer's Reference Guide" />
<link rel="up" href="stl.html" title="Chapter 7. Standard Template Library API" />
<link rel="prev" href="stl_memory_mgmt.html" title="Dbstl memory management" />
<link rel="next" href="stl_known_issues.html" title="Dbstl known issues" />
</head>
<body>
<div xmlns="" class="navheader">
<div class="libver">
<p>Library Version 11.2.5.3</p>
</div>
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">Dbstl miscellaneous notes</th>
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="stl_memory_mgmt.html">Prev</a> </td>
<th width="60%" align="center">Chapter 7. Standard Template Library API</th>
<td width="20%" align="right"> <a accesskey="n" href="stl_known_issues.html">Next</a></td>
</tr>
</table>
<hr />
</div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a id="stl_misc"></a>Dbstl miscellaneous notes</h2>
</div>
</div>
</div>
<div class="toc">
<dl>
<dt>
<span class="sect2">
<a href="stl_misc.html#idp51587208">Special notes about trivial methods</a>
</span>
</dt>
<dt>
<span class="sect2">
<a href="stl_misc.html#idp51603304">Using correct container and iterator public types</a>
</span>
</dt>
</dl>
</div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="idp51587208"></a>Special notes about trivial methods</h3>
</div>
</div>
</div>
<p>
There are some standard STL methods which are meaningless in dbstl, but they are kept in
dbstl as no-ops so as to stay consistent with the standard. These are:
</p>
<table class="simplelist" border="0" summary="Simple list">
<tr>
<td>
<code class="methodname">db_vecter::reserve();</code>
</td>
</tr>
<tr>
<td>
<code class="methodname">db_vector::max_size();</code>
</td>
</tr>
<tr>
<td>
<code class="methodname">db_vector::capacity();</code>
</td>
</tr>
<tr>
<td>
<code class="methodname">db_map::reserve();</code>
</td>
</tr>
<tr>
<td>
<code class="methodname">db_map::max_size();</code>
</td>
</tr>
</table>
<p>
<code class="methodname">db_vector<>::max_size()</code> and
<code class="methodname">db_map<>::max_size()</code> both return 2^30. This does not mean
that Berkeley DB can only hold that much data. This value is returned to conform to some
compilers' overflow rules — if we set bigger numbers like 2^32 or 2^31, some compilers
complain that the number has overflowed.
</p>
<p>
See the Berkeley DB documentation for information about limitations on how much data a
database can store.
</p>
<p>
There are also some read-only functions. You set the configuration
for these using the Berkeley DB API. You access them using the container's methods. Again,
this is to keep consistent with C++ standard STL containers, such as:
</p>
<table class="simplelist" border="0" summary="Simple list">
<tr>
<td>
<code class="methodname">db_map::key_comp();</code>
</td>
</tr>
<tr>
<td>
<code class="methodname">db_map::value_comp();</code>
</td>
</tr>
<tr>
<td>
<code class="methodname">db_map::hash_funct();</code>
</td>
</tr>
<tr>
<td>
<code class="methodname">db_map::key_eq();</code>
</td>
</tr>
</table>
</div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="idp51603304"></a>Using correct container and iterator public types</h3>
</div>
</div>
</div>
<p>
All public types defined by the C++ STL specification are present in dbstl. One thing to
note is the <span class="bold"><strong>value_type</strong></span>. dbstl defines the <span class="bold"><strong>value_type</strong></span> for each iterator and container class to be the raw
type without the <code class="classname">ElementRef</code>/<code class="classname">ElementHolder</code>
wrapper, so this type of variable can not be used to store data in a database. There is a
<span class="bold"><strong>value_type_wrap</strong></span> type for each container and iterator type,
with the raw type wrapped by the
<code class="classname">ElementRef</code>/<code class="classname">ElementHolder</code>.
</p>
<p>
For example, when type <code class="literal">int_vector_t</code> is defined as
</p>
<pre class="programlisting">db_vector<int, ElementHolder<int> ></pre>
<p>
its <span class="bold"><strong>value_type</strong></span> is <code class="literal">int</code>, its
<span class="bold"><strong>value_type_wrap</strong></span> is <code class="literal">ElementHolder<int></code>,
and its reference and pointer types are <code class="literal">ElementHolder<int>&</code> and
<code class="literal">ElementHolder<int>*</code> respectively. If you need to store data, use
<span class="bold"><strong>value_type_wrap</strong></span> to make use of the wrapper to store data
into database.
</p>
<p>
The reason we leave <span class="bold"><strong>value_type</strong></span> as the raw type is that we
want the existing algorithms in the STL library to work with dbstl because we have seen that
without doing so, a few tests will fail.
</p>
<p>
You need to use the same type as the return type of the data element retrieval functions to
hold a value in order to properly manipulate the data element. For example, when calling
</p>
<pre class="programlisting">db_vector<T>::operator[]</pre>
<p>
check that the return type for this function is
</p>
<pre class="programlisting">db_vector<T>::datatype_wrap</pre>
<p>
Then, hold the return value using an object of the same type:
</p>
<pre class="programlisting">db_vector<T>::datatype_wrap refelem = vctr[3];</pre>
</div>
</div>
<div class="navfooter">
<hr />
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left"><a accesskey="p" href="stl_memory_mgmt.html">Prev</a> </td>
<td width="20%" align="center">
<a accesskey="u" href="stl.html">Up</a>
</td>
<td width="40%" align="right"> <a accesskey="n" href="stl_known_issues.html">Next</a></td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Dbstl memory management </td>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
<td width="40%" align="right" valign="top"> Dbstl known issues</td>
</tr>
</table>
</div>
</body>
</html>
|