]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/multi_index/doc/compiler_specifics.html
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / multi_index / doc / compiler_specifics.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN">
2
3 <html>
4 <head>
5 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
6 <title>Boost.MultiIndex Documentation - Compiler specifics</title>
7 <link rel="stylesheet" href="style.css" type="text/css">
8 <link rel="start" href="index.html">
9 <link rel="prev" href="reference/key_extraction.html">
10 <link rel="up" href="index.html">
11 <link rel="next" href="performance.html">
12 </head>
13
14 <body>
15 <h1><img src="../../../boost.png" alt="boost.png (6897 bytes)" align=
16 "middle" width="277" height="86">Boost.MultiIndex Compiler specifics</h1>
17
18 <div class="prev_link"><a href="reference/key_extraction.html"><img src="prev.gif" alt="key extraction" border="0"><br>
19 Key extraction
20 </a></div>
21 <div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
22 Index
23 </a></div>
24 <div class="next_link"><a href="performance.html"><img src="next.gif" alt="performance" border="0"><br>
25 Performance
26 </a></div><br clear="all" style="clear: all;">
27
28 <hr>
29
30 <p>
31 Boost.MultiIndex utilizes some C++11 capabilities but is also equipped
32 to work reasonably well in decent C++03-compliant environments.
33 We list some of the possible limitations along with suitable workarounds when available.
34 </p>
35
36 <h2>Contents</h2>
37
38 <ul>
39 <li><a href="#move">Move semantics</a></li>
40 <li><a href="#emplace">Emplace functions</a></li>
41 <li><a href="#initializer_list">Initializer lists</a></li>
42 <li><a href="#tuple">Tuples</a></li>
43 <li><a href="#symbol_reduction">Reduction of symbol name lengths</a>
44 <ul>
45 <li><a href="#argument_limitation">Limitation of maximum number of arguments</a></li>
46 <li><a href="#type_hiding">Type hiding</a></li>
47 </ul>
48 </li>
49 <li><a href="#legacy">Legacy compilers</a></li>
50 </ul>
51
52 <h2><a name="move">Move semantics</a></h2>
53
54 <p>
55 Boost.MultiIndex uses <a href="../../../doc/html/move.html">Boost.Move</a>
56 to support compilers without rvalue references. In such scenarios, taking
57 advantage of <code>multi_index_container&lt;Value&gt;</code> capabilities for
58 increased efficiency in insertion and handling of moveable-only elements will
59 require that <code>Value</code> be suitably instrumented.
60 </p>
61
62 <h2><a name="emplace">Emplace functions</a></h2>
63
64 <p>
65 In compilers without variadic template support, Boost.MultiIndex emplace
66 functions emulate this missing functionality by accepting up to
67 <code>BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS</code>
68 construction arguments that are internally forwarded with
69 <a href="../../../doc/html/move.html">Boost.Move</a>:
70 only constant lvalue references and rvalues are permitted as construction arguments
71 in such case.
72 </p>
73
74 <p>
75 <code>BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS</code>, which by default is 5, can
76 be globally defined by the user to a different value.
77 </p>
78
79 <h2><a name="initializer_list">Initializer lists</a></h2>
80
81 <p>
82 No transparent emulation of this functionality can be provided in the absence of
83 <code>std::initializer_list</code>: consider
84 <a href="../../../libs/assign/index.html">Boost.Assign</a> as a
85 possible replacement.
86 </p>
87
88 <h2><a name="tuple">Tuples</a></h2>
89
90 <p>
91 Everywhere where <code>std::tuple</code>s are used in the library interface,
92 <code>boost::tuple</code>s can be resorted to in their place. The converse, however,
93 is not true.
94 </p>
95
96 <h2><a name="symbol_reduction">Reduction of symbol name lengths</a></h2>
97
98 <p>
99 The types generated on the instantiations of <code>multi_index_container</code>s
100 typically produce very long symbol names, sometimes beyond the internal limits
101 of some compilers. There are several techniques to shorten generated symbol
102 names: these techniques have also the beneficial side effect that resulting error
103 messages are more readable.
104 </p>
105
106 <h3><a name="argument_limitation">Limitation of maximum number of arguments</a></h3>
107
108 <p>
109 The class templates <a href="reference/indices.html#indexed_by"><code>indexed_by</code></a>,
110 <a href="reference/indices.html#tag"><code>tag</code></a> and
111 <a href="reference/key_extraction.html#composite_key"><code>composite_key</code></a>
112 accept a variable number of arguments whose maximum number is limited by
113 internal macros. Even non-used arguments contribute to the final types,
114 so manually adjusting the corresponding macros can result in a modest reduction
115 of symbol names.
116 </p>
117
118 <p align="center">
119 <table cellspacing="0">
120 <caption><b>Limiting maximum number of arguments of some class templates
121 of Boost.MultiIndex.</b></caption>
122 <tr>
123 <th>class template</th>
124 <th>limiting macro</th>
125 <th>default value</th>
126 </tr>
127 <tr>
128 <td align="center">&nbsp;<code>indexed_by</code>&nbsp;</td>
129 <td align="center">&nbsp;<code>BOOST_MULTI_INDEX_LIMIT_INDEXED_BY_SIZE</code>&nbsp;</td>
130 <td align="center">20</td>
131 </tr>
132 <tr class="odd_tr">
133 <td align="center">&nbsp;<code>tag</code>&nbsp;</td>
134 <td align="center">&nbsp;<code>BOOST_MULTI_INDEX_LIMIT_TAG_SIZE</code>&nbsp;</td>
135 <td align="center">20</td>
136 </tr>
137 <tr>
138 <td align="center">&nbsp;<code>composite_key</code>&nbsp;</td>
139 <td align="center">&nbsp;<code>BOOST_MULTI_INDEX_LIMIT_COMPOSITE_KEY_SIZE</code>&nbsp;</td>
140 <td align="center">10</td>
141 </tr>
142 </table>
143 </p>
144
145 <h3><a name="type_hiding">Type hiding</a></h3>
146
147 <p>
148 Consider a typical instantiation of <code>multi_index_container</code>:
149 </p>
150
151 <blockquote><pre>
152 <span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
153 <span class=identifier>employee</span><span class=special>,</span>
154 <span class=identifier>indexed_by</span><span class=special>&lt;</span>
155 <span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
156 <span class=identifier>ordered_non_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>,&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>name</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
157 <span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span><span class=keyword>int</span><span class=special>,&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>ssnumber</span><span class=special>&gt;</span> <span class=special>&gt;</span>
158 <span class=special>&gt;</span>
159 <span class=special>&gt;</span> <span class=identifier>employee_set</span><span class=special>;</span>
160 </pre></blockquote>
161
162 <p>
163 Then, for instance, the type <code>employee_set::nth_index&lt;0&gt;::type</code>
164 resolves to the following in GCC:
165 </p>
166
167 <blockquote><pre>
168 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>ordered_index</span><span class=special>&lt;</span>
169 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;,</span>
170 <span class=identifier>std</span><span class=special>::</span><span class=identifier>less</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;,</span>
171 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>nth_layer</span><span class=special>&lt;</span>
172 <span class=number>1</span><span class=special>,</span> <span class=identifier>employee</span><span class=special>,</span>
173 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>indexed_by</span><span class=special>&lt;</span>
174 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>ordered_unique</span><span class=special>&lt;</span>
175 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span>
176 <span class=special>&gt;,</span>
177 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>ordered_non_unique</span><span class=special>&lt;</span>
178 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>,</span> <span class=special>&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>name</span><span class=special>&gt;,</span>
179 <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span>
180 <span class=special>&gt;,</span>
181 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>ordered_unique</span><span class=special>&lt;</span>
182 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span> <span class=keyword>int</span><span class=special>,</span> <span class=special>&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>ssnumber</span><span class=special>&gt;,</span>
183 <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span>
184 <span class=special>&gt;,</span>
185 <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span>
186 <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span>
187 <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span>
188 <span class=special>&gt;,</span>
189 <span class=identifier>std</span><span class=special>::</span><span class=identifier>allocator</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;</span>
190 <span class=special>&gt;,</span>
191 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>mpl</span><span class=special>::</span><span class=identifier>vector0</span><span class=special>&lt;</span><span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>&gt;,</span>
192 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>ordered_unique_tag</span>
193 <span class=special>&gt;</span>
194 </pre></blockquote>
195
196 <p>
197 It can be seen that a significant portion of the type name is contributed by
198 the <code>indexed_by&lt;...&gt;</code> part, which is nothing but an expanded
199 version of the index specifier list provided in the definition of
200 <code>employee_set</code>. We can prevent this very long name from appearing
201 in the final type by encapsulating it into another, shorter-named construct:
202 </p>
203
204 <blockquote><pre>
205 <span class=comment>// reducing symbol names through type hiding
206 // type hide the index specifier list within employee_set_indices</span>
207
208 <span class=keyword>struct</span> <span class=identifier>employee_set_indices</span><span class=special>:</span>
209 <span class=identifier>indexed_by</span><span class=special>&lt;</span>
210 <span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
211 <span class=identifier>ordered_non_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>,&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>name</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
212 <span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span><span class=keyword>int</span><span class=special>,&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>ssnumber</span><span class=special>&gt;</span> <span class=special>&gt;</span>
213 <span class=special>&gt;</span>
214 <span class=special>{};</span>
215
216 <span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
217 <span class=identifier>employee</span><span class=special>,</span>
218 <span class=identifier>employee_set_indices</span>
219 <span class=special>&gt;</span> <span class=identifier>employee_set</span><span class=special>;</span>
220 </pre></blockquote>
221
222 <p>
223 <code>employee_set_indices</code> works as a conventional <code>typedef</code>
224 in all respects, save for a detail: its name does not explicitly
225 include the information contained in the <code>indexed_by</code> instantiation.
226 Applying this technique, <code>employee_set::nth_index&lt;0&gt;::type</code>
227 now becomes:
228 </p>
229
230 <blockquote><pre>
231 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>ordered_index</span><span class=special>&lt;</span>
232 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;,</span>
233 <span class=identifier>std</span><span class=special>::</span><span class=identifier>less</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;,</span>
234 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>nth_layer</span><span class=special>&lt;</span>
235 <span class=number>1</span><span class=special>,</span> <span class=identifier>employee</span><span class=special>,</span>
236 <span class=identifier>employee_set_indices</span><span class=special>,</span>
237 <span class=identifier>std</span><span class=special>::</span><span class=identifier>allocator</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;</span>
238 <span class=special>&gt;,</span>
239 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>mpl</span><span class=special>::</span><span class=identifier>vector0</span><span class=special>&lt;</span><span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>&gt;,</span>
240 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>ordered_unique_tag</span>
241 <span class=special>&gt;</span>
242 </pre></blockquote>
243
244 <p>
245 which is considerably shorter than the original, and also more
246 easily parsed by a human reader. Type hiding would not work if, instead of
247 making <code>employee_set_indices</code> a derived <code>struct</code> of
248 <code>indexed_by&lt;...&gt;</code>, we had defined it as a <code>typedef</code>:
249 <code>typedef</code>s are syntactic aliases and usually get expanded
250 by the compiler before doing any further type handling.
251 </p>
252
253 <p>
254 Type hiding techniques can also be applied to <code>composite_key</code> intantiations,
255 which often contribute a great deal to symbol name lengths.
256 </p>
257
258 <h2><a name="legacy">Legacy compilers</a></h2>
259
260 <p>
261 Boost.MultiIndex support for legacy compilers is not actively kept, so if you happen
262 to work with an old environment you might need to use a former version of the library.
263 A table is provided of some legacy compilers along with the latest version of
264 Boost.MultiIndex known to work for them (frequently with limitations as explained
265 in the corresponding compiler specifics section.) If you successfully try one of those
266 with newer versions of Boost.MultiIndex than stated here, please report back so that
267 the information can be updated.
268 </p>
269
270 <p align="center">
271 <table cellspacing="0" cellpadding="5">
272 <caption><b>Support for legacy compilers.</b></caption>
273 <tr>
274 <th>Compiler</th>
275 <th>Latest known<br>compatible version</th>
276 <th>Date</th>
277 </tr>
278 <tr>
279 <td>Borland C++ Builder 6.4 through 2006, CodeGear C++Builder 2010</td>
280 <td>Never worked with Boost.MultiIndex</td>
281 <td></td>
282 </tr>
283 <tr class="odd_tr">
284 <td>Comeau C/C++ 4.3.10.1 for Windows (VC++ 9.0 backend)</td>
285 <td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#comeau_43101_win_vc7_71">Boost 1.38</a></td>
286 <td>February 2009</td>
287 </tr>
288 <tr>
289 <td>Compaq C++ 6.5-042 through 7.1-006 for Tru64 UNIX</td>
290 <td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#compaq_65">Boost 1.38</a></td>
291 <td>February 2009</td>
292 </tr>
293 <tr class="odd_tr">
294 <td>GCC 3.2 through 3.4</td>
295 <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#gcc_32">Boost 1.41</a></td>
296 <td>November 2009</td>
297 </tr>
298 <tr>
299 <td>HP aC++ A.06.12 through A.06.17 for HP-UX IA64</td>
300 <td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#acc_612_ia64">Boost 1.38</a></td>
301 <td>February 2009</td>
302 </tr>
303 <tr class="odd_tr">
304 <td>HP aC++ A.03.80 through A.03.85 for HP-UX PA-RISC</td>
305 <td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#acc_380_pa_risc">Boost 1.38</a></td>
306 <td>February 2009</td>
307 </tr>
308 <tr>
309 <td>IBM VisualAge C++ V6.0 for AIX</td>
310 <td><a href="http://www.boost.org/doc/libs/1_33_1/libs/multi_index/doc/compiler_specifics.html#va_60">Boost 1.33.1</a></td>
311 <td>December 2006</td>
312 </tr>
313 <tr class="odd_tr">
314 <td>IBM XL C/C++ V9.0 through V10.1 for AIX</td>
315 <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#xl_90">Boost 1.41</a></td>
316 <td>November 2009</td>
317 </tr>
318 <tr>
319 <td>Intel C++ Compiler for Linux 8.1 through 11.1</td>
320 <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_81_lin">Boost 1.41</a></td>
321 <td>November 2009</td>
322 </tr>
323 <tr class="odd_tr">
324 <td>Intel C++ Compiler for Mac OS 9.1 through 11.0</td>
325 <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_91_mac">Boost 1.41</a></td>
326 <td>November 2009</td>
327 </tr>
328 <tr>
329 <td>Intel C++ Compiler for Windows 32-bit 8.0 through 11.1</td>
330 <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_80_win">Boost 1.41</a></td>
331 <td>November 2009</td>
332 </tr>
333 <tr class="odd_tr">
334 <td>Intel C++ Compiler for Windows 64-bit 10.0 through 11.11</td>
335 <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_100_win64">Boost 1.41</a></td>
336 <td>November 2009</td>
337 </tr>
338 <tr>
339 <td>Metrowerks CodeWarrior 8.3</td>
340 <td><a href="http://www.boost.org/doc/libs/1_36_0/libs/multi_index/doc/compiler_specifics.html#cw_83">Boost 1.36</a></td>
341 <td>August 2008</td>
342 </tr>
343 <tr class="odd_tr">
344 <td>Metrowerks CodeWarrior 9 through 9.5</td>
345 <td><a href="http://www.boost.org/doc/libs/1_34_1/libs/multi_index/doc/compiler_specifics.html#cw_9x">Boost 1.34.1</a></td>
346 <td>July 2007</td>
347 </tr>
348 <tr>
349 <td>Microsoft Visual C++ 6.0 Service Pack 5</td>
350 <td><a href="http://www.boost.org/doc/libs/1_36_0/libs/multi_index/doc/compiler_specifics.html#msvc_60">Boost 1.36</a></td>
351 <td>August 2008</td>
352 </tr>
353 <tr class="odd_tr">
354 <td>Microsoft Visual C++ 7.0</td>
355 <td><a href="http://www.boost.org/doc/libs/1_35_0/libs/multi_index/doc/compiler_specifics.html#msvc_70">Boost 1.35</a></td>
356 <td>March 2008</td>
357 </tr>
358 <tr>
359 <td>Sun Studio 10 through 12 Update 1 for Solaris</td>
360 <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#sun_10">Boost 1.41</a></td>
361 <td>November 2009</td>
362 </tr>
363 </table>
364 </p>
365
366 <hr>
367
368 <div class="prev_link"><a href="reference/key_extraction.html"><img src="prev.gif" alt="key extraction" border="0"><br>
369 Key extraction
370 </a></div>
371 <div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
372 Index
373 </a></div>
374 <div class="next_link"><a href="performance.html"><img src="next.gif" alt="performance" border="0"><br>
375 Performance
376 </a></div><br clear="all" style="clear: all;">
377
378 <br>
379
380 <p>Revised August 20th 2014</p>
381
382 <p>&copy; Copyright 2003-2014 Joaqu&iacute;n M L&oacute;pez Mu&ntilde;oz.
383 Distributed under the Boost Software
384 License, Version 1.0. (See accompanying file <a href="../../../LICENSE_1_0.txt">
385 LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
386 http://www.boost.org/LICENSE_1_0.txt</a>)
387 </p>
388
389 </body>
390 </html>