libdb/docs/programmer_reference/stl_misc.html
2012-11-14 16:35:20 -05:00

200 lines
8.2 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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#idp1407848">Special notes about trivial methods</a>
</span>
</dt>
<dt>
<span class="sect2">
<a href="stl_misc.html#idp1421568">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="idp1407848"></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&lt;&gt;::max_size()</code> and
<code class="methodname">db_map&lt;&gt;::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="idp1421568"></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&lt;int, ElementHolder&lt;int&gt; &gt;</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&lt;int&gt;</code>,
and its reference and pointer types are <code class="literal">ElementHolder&lt;int&gt;&amp;</code> and
<code class="literal">ElementHolder&lt;int&gt;*</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&lt;T&gt;::operator[]</pre>
<p>
check that the return type for this function is
</p>
<pre class="programlisting">db_vector&lt;T&gt;::datatype_wrap</pre>
<p>
Then, hold the return value using an object of the same type:
</p>
<pre class="programlisting">db_vector&lt;T&gt;::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>