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