summaryrefslogtreecommitdiff
path: root/docs/programmer_reference/stl_misc.html
blob: 90f3d45235a934d6f2161a7f56840531d6c891e7 (plain)
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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
<?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 12.1.6.1</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#idp953048">Special notes about trivial methods</a>
            </span>
          </dt>
          <dt>
            <span class="sect2">
              <a href="stl_misc.html#idp993208">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="idp953048"></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="idp993208"></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>