mirror of
https://github.com/boostorg/multi_index.git
synced 2025-05-09 23:14:04 +00:00
1107 lines
58 KiB
HTML
1107 lines
58 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN">
|
|
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
|
<title>Boost.MultiIndex Documentation - Compiler specifics</title>
|
|
<link rel="stylesheet" href="style.css" type="text/css">
|
|
<link rel="start" href="index.html">
|
|
<link rel="prev" href="reference/key_extraction.html">
|
|
<link rel="up" href="index.html">
|
|
<link rel="next" href="performance.html">
|
|
</head>
|
|
|
|
<body>
|
|
<h1><img src="../../../boost.png" alt="boost.png (6897 bytes)" align=
|
|
"middle" width="277" height="86">Boost.MultiIndex Compiler specifics</h1>
|
|
|
|
<div class="prev_link"><a href="reference/key_extraction.html"><img src="prev.gif" alt="key extraction" border="0"><br>
|
|
Key extraction
|
|
</a></div>
|
|
<div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
|
|
Index
|
|
</a></div>
|
|
<div class="next_link"><a href="performance.html"><img src="next.gif" alt="performance" border="0"><br>
|
|
Performance
|
|
</a></div><br clear="all" style="clear: all;">
|
|
|
|
<hr>
|
|
|
|
<p>
|
|
Boost.MultiIndex has been tried in different compilers, with
|
|
various degrees of success. We list the limitations encountered,
|
|
along with suitable workarounds when available.
|
|
</p>
|
|
|
|
<h2>Contents</h2>
|
|
|
|
<ul>
|
|
<li><a href="#bcb_64">Borland C++ Builder 6.4 and later</a></li>
|
|
<li><a href="#comeau_43101_win_vc7_71">Comeau C/C++ 4.3.10.1 for Windows (VC++ 9.0 backend)</a></li>
|
|
<li><a href="#compaq_65">Compaq C++ 6.5-042 and later for Tru64 UNIX</a></li>
|
|
<li>
|
|
<a href="#gcc_32">GNU GCC 3.2 and later</a>
|
|
<ul>
|
|
<li><a href="#gcc_tru64">GNU GCC for Tru64 UNIX</a></li>
|
|
<li><a href="#gcc_4_darwin">Darwin GCC 4.0</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#acc_612_ia64">HP aC++ A.06.12 and later for HP-UX IA64</a></li>
|
|
<li><a href="#acc_380_pa_risc">HP aC++ A.03.80 for HP-UX PA-RISC</a></li>
|
|
<li><a href="#va_60">IBM VisualAge C++ V6.0 for AIX</a></li>
|
|
<li><a href="#va_90">IBM VisualAge C++ V9.0 for AIX</a></li>
|
|
<li><a href="#intel_81_lin">Intel C++ Compiler for Linux 8.1 and later</a></li>
|
|
<li><a href="#intel_91_mac">Intel C++ Compiler for Mac OS 9.1 and later</a></li>
|
|
<li><a href="#intel_80_win">Intel C++ Compiler for Windows 32-bit 8.0 and later</a></li>
|
|
<li><a href="#intel_100_win64">Intel C++ Compiler for Windows 64-bit 10.0 and later</a></li>
|
|
<li><a href="#cw_83">Metrowerks CodeWarrior 8.3</a></li>
|
|
<li><a href="#cw_9x">Metrowerks CodeWarrior 9 and later</a></li>
|
|
<li>
|
|
<a href="#msvc_60">Microsoft Visual C++ 6.0 Service Pack 5</a>
|
|
<ul>
|
|
<li><a href="#msvc_60_stlport_453">Microsoft Visual C++ 6.0 Service Pack 5 + STLport 4.5.3 and later</a></li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<a href="#msvc_70">Microsoft Visual C++ 7.0</a>
|
|
<ul>
|
|
<li><a href="#msvc_70_stlport_501">Microsoft Visual C++ 7.0 + STLport 5.0.1</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#msvc_71">Microsoft Visual C++ 7.1</a></li>
|
|
<li><a href="#msvc_80">Microsoft Visual C++ 8.0 and later</a></li>
|
|
<li><a href="#msvc_80_x86_amd64">Microsoft Visual C++ 8.0 x64 cross-compiler and later</a></li>
|
|
<li><a href="#sun_10">Sun Studio 10 and later for Solaris</a></li>
|
|
<li><a href="#portability">Portability techniques</a>
|
|
<ul>
|
|
<li><a href="#member_offset">Use of <code>member_offset</code></a></li>
|
|
<li><a href="#mem_fun_explicit">Use of <code>const_mem_fun_explicit</code> and
|
|
<code>mem_fun_explicit</code></a></li>
|
|
<li><a href="#composite_key_no_pts"><code>composite_key</code> in compilers
|
|
without partial template specialization</a></li>
|
|
<li><a href="#symbol_reduction">Reduction of symbol name lengths</a>
|
|
<ul>
|
|
<li><a href="#argument_limitation">Limitation of maximum number of arguments</a></li>
|
|
<li><a href="#type_hiding">Type hiding</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
<h2><a name="bcb_64">Borland C++ Builder 6.4 and later</a></h2>
|
|
|
|
<p>
|
|
Currently, Boost.MultiIndex cannot be used with any of BCB 6.4 up to BCB 2006
|
|
and CodeGear C++Builder 2007.
|
|
The number of problems encountered during the tests makes it unlikely that
|
|
future versions of the library can be made to work under these compilers.
|
|
</p>
|
|
|
|
<h2><a name="comeau_43101_win_vc7_71">Comeau C/C++ 4.3.10.1 for Windows (VC++ 9.0 backend)</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with this compiler. The library fails to compile,
|
|
however, when Microsoft Visual C++ 6.0 is used as the backend. Last time they were
|
|
tested (Boost.1.34.1), VC++ 7.0/7.1 backends worked correctly. The beta 2 version of
|
|
the Comeau compiler 4.3.10.1 has been used.
|
|
</p>
|
|
|
|
<h2><a name="compaq_65">Compaq C++ 6.5-042 and later for Tru64 UNIX</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with this compiler. Last tested for version 7.1-006.
|
|
</p>
|
|
|
|
<h2><a name="gcc_32">GNU GCC 3.2 and later</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with several versions of this compiler
|
|
starting from 3.2. The following versions have been explicitly tested:
|
|
<ul>
|
|
<li>GCC 3.2 20020927 (prerelease) under Cygwin 1.5.7,</li>
|
|
<li>GCC 3.4.2 under HP-UX PA-RISC,</li>
|
|
<li>GCC 3.4.3 under Linux x86-64,</li>
|
|
<li>GCC 3.4.6 under Solaris, 20060404 (Red Hat 3.4.6-3) under Linux IA64,</li>
|
|
<li>GCC 4.0.1 under Linux x86-64, (Apple build 5363) under Mac OS,</li>
|
|
<li>GCC 4.1.1 20070105 (Red Hat 4.1.1-52) under Linux x86-64,</li>
|
|
<li>GCC 4.2.1 under HP-UX IA64 and Linux x86-64, (SUSE Linux) under Linux,</li>
|
|
<li>GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7) under Linux and Linux x86-64,</li>
|
|
<li>GCC 4.3.0 under Linux x86-64, with Apache C++ Standard Library 4.2.2 under Linux and Linux x86-64,</li>
|
|
<li>GCC 4.3.0 gnu++0x under Linux x86-64.</li>
|
|
</ul>
|
|
Boost.MultiIndex does not work with versions 3.1 and prior of GCC.
|
|
</p>
|
|
|
|
<h3><a name="gcc_tru64">GNU GCC for Tru64 UNIX</a></h3>
|
|
|
|
<p>
|
|
On this platform, GCC is not able to handle debug symbol names whose length
|
|
exceeds 32,768 bytes, resulting in the error <code>mips-tfile, ... string
|
|
too big</code>. You may encounter this issue with heavily templatized
|
|
code like Boost.MultiIndex, which typically produces long symbol names. The problem
|
|
can be overcome by omitting the compiler option <code>-g</code> (generate debugging
|
|
information.) Alternatively, consult the section on
|
|
<a href="#symbol_reduction">reduction of symbol name lengths</a> for various
|
|
applicable workarounds.
|
|
</p>
|
|
|
|
<h3><a name="gcc_4_darwin">Darwin GCC 4.0</a></h3>
|
|
|
|
<p>
|
|
Build 4061 of GCC 4.0, shipped with Darwin 8.2 and prior (Mac OS X 10.4.2 and
|
|
prior), corresponds to a prerelease version of GNU GCC 4.0.0 which introduces
|
|
a <a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17435">regression bug</a>
|
|
related to binding of references to temporary objects. This bug precludes the
|
|
usage of Boost.MultiIndex
|
|
<a href="tutorial/debug.html#invariant_check">invariant-checking mode</a>; other
|
|
than this, Boost.MultiIndex works correctly.
|
|
The bug is corrected in GCC 4.0 Apple build 5026, which is in sync with the official
|
|
release of GNU GCC 4.0.0, so the invariant-checking mode is available from this
|
|
upgrade.
|
|
</p>
|
|
|
|
<h2><a name="acc_612_ia64">HP aC++ A.06.12 and later for HP-UX IA64</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with this compiler.
|
|
Last tested for version A.06.14.
|
|
</p>
|
|
|
|
<h2><a name="acc_380_pa_risc">HP aC++ A.03.80 for HP-UX PA-RISC</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with this compiler.
|
|
</p>
|
|
|
|
<h2><a name="va_60">IBM VisualAge C++ V6.0 for AIX</a></h2>
|
|
|
|
<p>
|
|
<b>Note:</b> Last tested in Boost 1.33.1. The information might be no longer accurate.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
<a href="reference/key_extraction.html#member"><code>member</code></a> not supported,
|
|
refer to the section on
|
|
<a href="#member_offset">use of <code>member_offset</code></a> for workarounds.
|
|
<code>member_offset</code> causes the compiler to emit warnings about the
|
|
use of <code>offsetof</code> with non-POD types: these warnings can be suppressed
|
|
by setting the compiler option <code>-qsuppress=1540-1281</code>, or, alternatively,
|
|
by inserting the following preprocessor directive:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=preprocessor>#pragma</span> <span class=identifier>info</span><span class=special>(</span><span class=identifier>nolan</span><span class=special>)</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
This latter pragma, however, may also eliminate other warnings not related
|
|
to the use of <code>offsetof</code>.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
Serialization capabilities are not available as Boost.Serialization is not
|
|
supported on this platform.
|
|
</p>
|
|
|
|
<h2><a name="va_90">IBM VisualAge C++ V9.0 for AIX</a></h2>
|
|
|
|
<p>
|
|
<a href="reference/key_extraction.html#member"><code>member</code></a> not supported,
|
|
refer to the section on
|
|
<a href="#member_offset">use of <code>member_offset</code></a> for workarounds.
|
|
<code>member_offset</code> causes the compiler to emit warnings about the
|
|
use of <code>offsetof</code> with non-POD types: these warnings can be suppressed
|
|
by setting the compiler option <code>-qsuppress=1540-1281</code>, or, alternatively,
|
|
by inserting the following preprocessor directive:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=preprocessor>#pragma</span> <span class=identifier>info</span><span class=special>(</span><span class=identifier>nolan</span><span class=special>)</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
This latter pragma, however, may also eliminate other warnings not related
|
|
to the use of <code>offsetof</code>.
|
|
Other than this, Boost.MultiIndex works without problems.
|
|
</p>
|
|
|
|
<h2><a name="intel_81_lin">Intel C++ Compiler for Linux 8.1 and later</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with this compiler.
|
|
Tested from version 8.1 to 10.0.
|
|
</p>
|
|
|
|
<h2><a name="intel_91_mac">Intel C++ Compiler for Mac OS 9.1 and later</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with this compiler.
|
|
Tested from version 9.1 to 10.1.
|
|
</p>
|
|
|
|
<h2><a name="intel_80_win">Intel C++ Compiler for Windows 32-bit 8.0 and later</a></h2>
|
|
|
|
<p>
|
|
When used on top of MSVC++ 7.0 or prior, argument dependent lookup is
|
|
disabled by default. This will cause problems with many Boost libraries,
|
|
and in particular with the serialization part of Boost.MultiIndex.
|
|
Argument dependent lookup is enabled by adding
|
|
<code>/Qoption,c,--arg_dep_lookup</code> to the project options.
|
|
Other than this, Boost.MultiIndex works without problems.
|
|
Last tested for compiler version 10.1.
|
|
</p>
|
|
|
|
<h2><a name="intel_100_win64">Intel C++ Compiler for Windows 64-bit 10.0 and later</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with this compiler.
|
|
Last tested for compiler version 10.1.
|
|
</p>
|
|
|
|
<h2><a name="cw_83">Metrowerks CodeWarrior 8.3</a></h2>
|
|
|
|
<p>
|
|
Predefined key extractors instantiated on a given type do not accept
|
|
objects of derived types. For instance:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=keyword>struct</span> <span class=identifier>base</span><span class=special>{};</span>
|
|
<span class=keyword>struct</span> <span class=identifier>derived</span><span class=special>:</span><span class=keyword>public</span> <span class=identifier>base</span><span class=special>{};</span>
|
|
<span class=special>...</span>
|
|
|
|
<span class=identifier>identity</span><span class=special><</span><span class=identifier>base</span><span class=special>></span> <span class=identifier>key_extractor</span><span class=special>;</span>
|
|
<span class=identifier>derived</span> <span class=identifier>x</span><span class=special>;</span>
|
|
|
|
<span class=comment>// not accepted by this compiler: an explicit cast to base is required</span>
|
|
<span class=identifier>key_extractor</span><span class=special>(</span><span class=identifier>x</span><span class=special>);</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
Other than this, Boost.MultiIndex works without problems under Mac OS and Windows (last
|
|
tested under Windows only).
|
|
</p>
|
|
|
|
<h2><a name="cw_9x">Metrowerks CodeWarrior 9 and later</a></h2>
|
|
|
|
<p>
|
|
<b>Note:</b> Last tested in Boost 1.34.1. The information might be no longer accurate.
|
|
</p>
|
|
|
|
<p>
|
|
Boost.MultiIndex works correctly with versions of this compiler from 9.0 to
|
|
9.5, both under Mac OS and Windows.
|
|
</p>
|
|
|
|
<h2><a name="msvc_60">Microsoft Visual C++ 6.0 Service Pack 5</a></h2>
|
|
|
|
<p>
|
|
Beginning with Boost.1.36, Boost.Serialization is no longer supported in this
|
|
compiler, thus the serialization capabilities cannot be used.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
<a href="reference/key_extraction.html#member"><code>member</code></a> not supported,
|
|
refer to the section on
|
|
<a href="#member_offset">use of <code>member_offset</code></a> for workarounds.
|
|
</p>
|
|
|
|
<p>
|
|
<a href="reference/key_extraction.html#const_mem_fun"><code>const_mem_fun</code></a> and
|
|
<a href="reference/key_extraction.html#mem_fun"><code>mem_fun</code></a>
|
|
not supported, refer to the section on
|
|
<a href="#mem_fun_explicit">use of <code>const_mem_fun_explicit</code> and
|
|
<code>mem_fun_explicit</code></a> for workarounds.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
No support for <a href="reference/multi_index_container.html#index_retrieval">index retrieval</a>
|
|
and <a href="reference/multi_index_container.html#projection">projection</a>
|
|
nested types and member functions:
|
|
<ul>
|
|
<li><code>nth_index</code>,</li>
|
|
<li><code>index</code>,</li>
|
|
<li><code>nth_index_iterator</code>,</li>
|
|
<li><code>nth_index_const_iterator</code>,</li>
|
|
<li><code>index_iterator</code>,</li>
|
|
<li><code>index_const_iterator</code>,</li>
|
|
<li><code>get</code>,</li>
|
|
<li><code>project</code>.</li>
|
|
</ul>
|
|
You can use instead their global equivalents. Also, this compiler does not
|
|
implement argument dependent lookup, so you might need to explicitly qualify
|
|
these global names with <code>::boost::multi_index</code>.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
<code>boost::multi_index::multi_index_container</code> is imported to
|
|
<code>namespace boost</code> by means of a <code>using</code> declaration.
|
|
MSVC++ 6.0, however, does not properly handle this import. So, instead of
|
|
writing:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index_container</span><span class=special><...></span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
use the following:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>multi_index_container</span><span class=special><...></span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
or else resort to a directive <code>using namespace boost::multi_index</code>.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
The lack of partial template specialization support in MSVC++ 6.0
|
|
results in some inconveniences when using <code>composite_key</code> that
|
|
can be remedied as explained in
|
|
<a href="#composite_key_no_pts">"<code>composite_key</code>
|
|
in compilers without partial template specialization"</a>.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
Due to problems with function template ordering support,
|
|
<a href="reference/key_extraction.html#composite_key_compare"><code>composite_key_compare</code></a>
|
|
and related classes do not accept the notational variations of
|
|
<code>operator()</code> where one of the operands is treated as if
|
|
included into a tuple of length 1. As a result, the user cannot ever
|
|
omit tuple enclosing when specifying the arguments of lookup operations
|
|
involving composite keys.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
Predefined key extractors instantiated on a given type do not accept
|
|
objects of derived types. For instance:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=keyword>struct</span> <span class=identifier>base</span><span class=special>{};</span>
|
|
<span class=keyword>struct</span> <span class=identifier>derived</span><span class=special>:</span><span class=keyword>public</span> <span class=identifier>base</span><span class=special>{};</span>
|
|
<span class=special>...</span>
|
|
|
|
<span class=identifier>identity</span><span class=special><</span><span class=identifier>base</span><span class=special>></span> <span class=identifier>key_extractor</span><span class=special>;</span>
|
|
<span class=identifier>derived</span> <span class=identifier>x</span><span class=special>;</span>
|
|
|
|
<span class=comment>// not accepted by this compiler: an explicit cast to base is required</span>
|
|
<span class=identifier>key_extractor</span><span class=special>(</span><span class=identifier>x</span><span class=special>);</span>
|
|
</pre></blockquote>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
MSVC++ 6.0 presents serious limitations for the maximum length of
|
|
symbol names generated by the compiler, which might result in the
|
|
linker error
|
|
<code><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/lnk1179.asp">LNK1179</a>:
|
|
invalid or corrupt file: duplicate comdat
|
|
comdat</code>. To overcome this problem, consult the section on
|
|
<a href="#symbol_reduction">reduction of symbol name lengths</a> for various
|
|
applicable workarounds.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
Under some circumstances, the compiler emits the error
|
|
<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/C2587.asp">
|
|
<code>C2587</code></a><code>: '_U' : illegal use of local variable as
|
|
default parameter</code>, inside the MSVC internal header
|
|
<code><xlocnum></code>.
|
|
This problem is a recurrent bug of the compiler, and has been reported in
|
|
other unrelated libraries, like the
|
|
<a href="../../../libs/graph/doc/table_of_contents.html">Boost Graph Library</a>,
|
|
<a href="../../../libs/multi_array/doc/index.html">Boost.MultiArray</a>,
|
|
<a href="../../../libs/regex/index.html">Boost.Regex</a>,
|
|
<a href="http://www.cgal.org/">CGAL</a> and
|
|
<a href="http://www.mysql.com/downloads/api-mysql++.html">MySQL++</a>.
|
|
The error is triggered, though not in a systematic manner, by the use
|
|
of <code>multi_index_container</code> iterator constructor. Two workarounds exist:
|
|
the first consists of avoiding this constructor and replacing
|
|
code like:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>multi_index_container</span><span class=special><...></span> <span class=identifier>s</span><span class=special>(</span><span class=identifier>c</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>c</span><span class=special>.</span><span class=identifier>end</span><span class=special>());</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
with equivalent operations:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>multi_index_container</span><span class=special><...></span> <span class=identifier>s</span><span class=special>;</span>
|
|
<span class=identifier>s</span><span class=special>.</span><span class=identifier>insert</span><span class=special>(</span><span class=identifier>c</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>c</span><span class=special>.</span><span class=identifier>end</span><span class=special>());</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
The second workaround has not been confirmed by the author, but it is given
|
|
on the Internet in connection with this error appearing in other libraries.
|
|
Replace line 84 of <code><xlocnum></code>
|
|
|
|
<blockquote><pre>
|
|
<span class=preprocessor>#define</span> <span class=identifier>_VIRTUAL</span> <span class=keyword>virtual</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
with the following:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=preprocessor>#define</span> <span class=identifier>_VIRTUAL</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
<b>Warning</b>: it is not known whether this
|
|
replacement can result in unexpected side effects in code implicitly
|
|
using <code><xlocnum></code>.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
In general, the extensive use of templates by Boost.MultiIndex puts this compiler
|
|
under severe stress, so that several internal limitations may be reached.
|
|
The following measures can help alleviate these problems:
|
|
<ul>
|
|
<li>Set the compiler option <code>/Zm</code> (Specify Memory Allocation Limit)
|
|
to increase the amount of memory available for compilation. Usual values for
|
|
this option range from 300 to 800.</li>
|
|
<li>If in debug mode, try switching from <code>/ZI</code> (Program Database for
|
|
Edit and Continue) to a less demanding type of debugging information
|
|
(<code>/Zi</code>, <code>/Z7</code> or <code>/Zd</code>.)</li>
|
|
<li>Play with the precompiled headers options. Usually, turning this feature
|
|
off yields the best results.</li>
|
|
<li>If the compiler emits the error
|
|
<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/c1055.asp">
|
|
<code>C1055</code></a><code>: compiler limit : out of keys</code>, try
|
|
disabling the option <code>/Gm</code> (Enable Minimal Rebuild.) In these
|
|
cases, it is also beneficial to split the project into smaller
|
|
subprojects.</li>
|
|
</ul>
|
|
</p>
|
|
|
|
<h3>
|
|
<a name="msvc_60_stlport_453">Microsoft Visual C++ 6.0 Service Pack 5
|
|
+ STLport 4.5.3 and later</a>
|
|
</h3>
|
|
|
|
<p>
|
|
Boost.MultiIndex works for this configuration. The same limitations apply as
|
|
in MSVC++ 6.0 with its original Dinkumware standard library. STLport 4.6.2 and
|
|
5.0.1 has also been confirmed to work correctly.
|
|
</p>
|
|
|
|
<h2><a name="msvc_70">Microsoft Visual C++ 7.0</a></h2>
|
|
|
|
<p>
|
|
<b>Note:</b> Last tested in Boost 1.35. The information might be no longer accurate.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
Beginning with Boost.1.36, Boost.Serialization is no longer supported in this
|
|
compiler, thus the serialization capabilities cannot be used.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
<a href="reference/key_extraction.html#member"><code>member</code></a> not supported,
|
|
refer to the section on
|
|
<a href="#member_offset">use of <code>member_offset</code></a> for workarounds.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
No support for <a href="reference/multi_index_container.html#index_retrieval">index retrieval</a>
|
|
and <a href="reference/multi_index_container.html#projection">projection</a>
|
|
nested types and member functions:
|
|
<ul>
|
|
<li><code>nth_index</code>,</li>
|
|
<li><code>index</code>,</li>
|
|
<li><code>nth_index_iterator</code>,</li>
|
|
<li><code>nth_index_const_iterator</code>,</li>
|
|
<li><code>index_iterator</code>,</li>
|
|
<li><code>index_const_iterator</code>,</li>
|
|
<li><code>get</code>,</li>
|
|
<li><code>project</code>.</li>
|
|
</ul>
|
|
You can use instead their global equivalents. Also, this compiler does not
|
|
implement argument dependent lookup, so you might need to explicitly qualify
|
|
these global names with <code>::boost::multi_index</code>.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
<code>boost::multi_index::multi_index_container</code> is imported to
|
|
<code>namespace boost</code> by means of a <code>using</code> declaration.
|
|
MSVC++ 7.0, however, does not properly handle this import. So, instead of
|
|
writing:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index_container</span><span class=special><...></span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
use the following:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>multi_index_container</span><span class=special><...></span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
or else resort to a directive <code>using namespace boost::multi_index</code>.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
The lack of partial template specialization support in MSVC++ 7.0
|
|
results in some inconveniences when using <code>composite_key</code> that
|
|
can be remedied as explained in
|
|
<a href="#composite_key_no_pts">"<code>composite_key</code>
|
|
in compilers without partial template specialization"</a>.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
Due to problems with function template ordering support,
|
|
<a href="reference/key_extraction.html#composite_key_compare"><code>composite_key_compare</code></a>
|
|
and related classes do not accept the notational variations of
|
|
<code>operator()</code> where one of the operands is treated as if
|
|
included into a tuple of length 1. As a result, the user cannot ever
|
|
omit tuple enclosing when specifying the arguments of lookup operations
|
|
involving composite keys.
|
|
</p>
|
|
|
|
<blockquote><hr></blockquote>
|
|
|
|
<p>
|
|
Predefined key extractors instantiated on a given type do not accept
|
|
objects of derived types. For instance:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=keyword>struct</span> <span class=identifier>base</span><span class=special>{};</span>
|
|
<span class=keyword>struct</span> <span class=identifier>derived</span><span class=special>:</span><span class=keyword>public</span> <span class=identifier>base</span><span class=special>{};</span>
|
|
<span class=special>...</span>
|
|
|
|
<span class=identifier>identity</span><span class=special><</span><span class=identifier>base</span><span class=special>></span> <span class=identifier>key_extractor</span><span class=special>;</span>
|
|
<span class=identifier>derived</span> <span class=identifier>x</span><span class=special>;</span>
|
|
|
|
<span class=comment>// not accepted by this compiler: an explicit cast to base is required</span>
|
|
<span class=identifier>key_extractor</span><span class=special>(</span><span class=identifier>x</span><span class=special>);</span>
|
|
</pre></blockquote>
|
|
|
|
<h3><a name="msvc_70_stlport_501">Microsoft Visual C++ 7.0 + STLport 5.0.1</a></h3>
|
|
|
|
<p>
|
|
<b>Note:</b> Last tested in Boost 1.35. The information might be no longer accurate.
|
|
</p>
|
|
|
|
<p>
|
|
Boost.MultiIndex works for this configuration. The same issues apply as in
|
|
MSVC++ 7.0 with its original Dinkumware standard library.
|
|
</p>
|
|
|
|
<h2><a name="msvc_71">Microsoft Visual C++ 7.1</a></h2>
|
|
|
|
<p>
|
|
Problems have been reported when compiling the library with the <code>/Gm</code>
|
|
option (Enable Minimal Rebuild.) Seemingly, this is due to an
|
|
internal defect of the compiler (see for instance
|
|
<a href="http://lists.boost.org/boost-users/2004/02/5987.php">
|
|
this mention of a similar issue</a> in the Boost Users mailing list.)
|
|
If <code>/Gm</code> is turned off, Boost.MultiIndex compiles and runs
|
|
without further problems.
|
|
</p>
|
|
|
|
<h2><a name="msvc_80">Microsoft Visual C++ 8.0 and later</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with this compiler.
|
|
Last tested for compiler versions 8.0 and 9.0.
|
|
</p>
|
|
|
|
<h2><a name="msvc_80_x86_amd64">Microsoft Visual C++ 8.0 x64 cross-compiler and later</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with this compiler.
|
|
Last tested for compiler version 9.0.
|
|
</p>
|
|
|
|
<h2><a name="sun_10">Sun Studio 10 and later for Solaris</a></h2>
|
|
|
|
<p>
|
|
No problems have been detected with this platform. The exact compiler versions
|
|
tested were:
|
|
<ul>
|
|
<li>Sun C++ 5.7 Patch 117830-07 2006/03/15 (Sun Studio 10),</li>
|
|
<li>Sun C++ 5.8 Patch 121017-09 2007/01/17 (Sun Studio 11),</li>
|
|
<li>Sun C++ 5.9 (Sun Studio 12).</li>
|
|
</ul>
|
|
|
|
The option <code>-library=stlport4</code> was used to replace the default
|
|
standard library with STLport.
|
|
</p>
|
|
|
|
<h2><a name="portability">Portability techniques</a></h2>
|
|
|
|
<h3><a name="member_offset">Use of <code>member_offset</code></a></h3>
|
|
|
|
<p>
|
|
The <code>member</code> key extractor poses some problems in compilers
|
|
that do not properly support pointers to members as non-type
|
|
template arguments, as indicated by the
|
|
<a href="../../../libs/config/config.htm">Boost Configuration Library</a>
|
|
defect macro <code>BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS</code>.
|
|
The following compilers have been confirmed not
|
|
to work correctly with <code>member</code>:
|
|
<ul>
|
|
<li>MSVC++ 6.0/7.0,</li>
|
|
<li>Intel C++ 7.0/7.1 for Windows,</li>
|
|
<li>VisualAge 6.0/9.0 for AIX.</li>
|
|
</ul>
|
|
This program can help determine if your compiler
|
|
properly supports pointers to members as non-type template parameters:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=preprocessor>#include</span> <span class=special><</span><span class=identifier>iostream</span><span class=special>></span>
|
|
|
|
<span class=keyword>struct</span> <span class=identifier>pair</span>
|
|
<span class=special>{</span>
|
|
<span class=keyword>int</span> <span class=identifier>x</span><span class=special>,</span><span class=identifier>y</span><span class=special>;</span>
|
|
|
|
<span class=identifier>pair</span><span class=special>(</span><span class=keyword>int</span> <span class=identifier>x_</span><span class=special>,</span><span class=keyword>int</span> <span class=identifier>y_</span><span class=special>):</span><span class=identifier>x</span><span class=special>(</span><span class=identifier>x_</span><span class=special>),</span><span class=identifier>y</span><span class=special>(</span><span class=identifier>y_</span><span class=special>){}</span>
|
|
<span class=special>};</span>
|
|
|
|
<span class=keyword>template</span><span class=special><</span><span class=keyword>int</span> <span class=identifier>pair</span><span class=special>::*</span> <span class=identifier>PtrToPairMember</span><span class=special>></span>
|
|
<span class=keyword>struct</span> <span class=identifier>foo</span>
|
|
<span class=special>{</span>
|
|
<span class=keyword>int</span> <span class=identifier>bar</span><span class=special>(</span><span class=identifier>pair</span><span class=special>&</span> <span class=identifier>p</span><span class=special>){</span><span class=keyword>return</span> <span class=identifier>p</span><span class=special>.*</span><span class=identifier>PtrToPairMember</span><span class=special>;}</span>
|
|
<span class=special>};</span>
|
|
|
|
<span class=keyword>int</span> <span class=identifier>main</span><span class=special>()</span>
|
|
<span class=special>{</span>
|
|
<span class=identifier>pair</span> <span class=identifier>p</span><span class=special>(</span><span class=number>0</span><span class=special>,</span><span class=number>1</span><span class=special>);</span>
|
|
<span class=identifier>foo</span><span class=special><&</span><span class=identifier>pair</span><span class=special>::</span><span class=identifier>x</span><span class=special>></span> <span class=identifier>fx</span><span class=special>;</span>
|
|
<span class=identifier>foo</span><span class=special><&</span><span class=identifier>pair</span><span class=special>::</span><span class=identifier>y</span><span class=special>></span> <span class=identifier>fy</span><span class=special>;</span>
|
|
|
|
<span class=keyword>if</span><span class=special>(</span><span class=identifier>fx</span><span class=special>.</span><span class=identifier>bar</span><span class=special>(</span><span class=identifier>p</span><span class=special>)!=</span><span class=number>0</span><span class=special>||</span><span class=identifier>fy</span><span class=special>.</span><span class=identifier>bar</span><span class=special>(</span><span class=identifier>p</span><span class=special>)!=</span><span class=number>1</span><span class=special>)</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>cout</span><span class=special><<</span><span class=string>"KO"</span><span class=special><<</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>endl</span><span class=special>;</span>
|
|
<span class=keyword>else</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>cout</span><span class=special><<</span><span class=string>"OK"</span><span class=special><<</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>endl</span><span class=special>;</span>
|
|
|
|
<span class=keyword>return</span> <span class=number>0</span><span class=special>;</span>
|
|
<span class=special>}</span>
|
|
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
If you find a compiler that does not pass the test, and for which
|
|
<code>BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS</code> is <i>not</i> defined,
|
|
please report to the Boost developers mailing list.
|
|
</p>
|
|
<p>To overcome this defect, a replacement utility
|
|
<a href="reference/key_extraction.html#member_offset"><code>member_offset</code></a>
|
|
has been provided that does the work of <code>member</code> at the
|
|
expense of less convenient notation and the possibility of
|
|
non-conformance with the standard. Please consult
|
|
the reference for further information on <code>member_offset</code>.
|
|
As an example of use, given the class
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=keyword>class</span> <span class=identifier>A</span>
|
|
<span class=special>{</span>
|
|
<span class=keyword>int</span> <span class=identifier>x</span><span class=special>;</span>
|
|
<span class=special>}</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
the instantiation <code>member<A,int,&A::x></code> can be simulated then
|
|
as <code>member_offset<A,int,offsetof(A,x)></code>.
|
|
</p>
|
|
|
|
<p>
|
|
For those writing portable code, Boost.MultiIndex provides the ternary macro
|
|
<a href="reference/key_extraction.html#boost_multi_index_member"><code>BOOST_MULTI_INDEX_MEMBER</code></a>.
|
|
Continuing with the example above, the
|
|
expression
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>BOOST_MULTI_INDEX_MEMBER</span><span class=special>(</span><span class=identifier>A</span><span class=special>,</span><span class=keyword>int</span><span class=special>,</span><span class=identifier>x</span><span class=special>)</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
expands by default to
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>member</span><span class=special><</span><span class=identifier>A</span><span class=special>,</span><span class=keyword>int</span><span class=special>,&</span><span class=identifier>A</span><span class=special>::</span><span class=identifier>x</span><span class=special>></span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
or alternatively to
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>member_offset</span><span class=special><</span><span class=identifier>A</span><span class=special>,</span><span class=keyword>int</span><span class=special>,</span><span class=identifier>offsetof</span><span class=special>(</span><span class=identifier>A</span><span class=special>,</span><span class=identifier>x</span><span class=special>)></span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
if <code>BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS</code> is defined.
|
|
</p>
|
|
|
|
<h3><a name="mem_fun_explicit">Use of <code>const_mem_fun_explicit</code> and
|
|
<code>mem_fun_explicit</code></a></h3>
|
|
|
|
<p>
|
|
MSVC++ 6.0 has problems with <code>const</code> member functions as non-type
|
|
template parameters, and thus does not accept the <code>const_mem_fun</code>
|
|
key extractor. A simple workaround, fortunately, has been found, consisting
|
|
in specifying the <i>type</i> of these pointers as an additional template
|
|
parameter. The alternative
|
|
<a href="reference/key_extraction.html#const_mem_fun_explicit"><code>const_mem_fun_explicit</code></a>
|
|
extractor adopts this solution; for instance, given the type
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=keyword>struct</span> <span class=identifier>A</span>
|
|
<span class=special>{</span>
|
|
<span class=keyword>int</span> <span class=identifier>f</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
|
|
<span class=special>};</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
the extractor <code>const_mem_fun<A,int,&A::f></code> can be replaced by
|
|
<code>const_mem_fun_explicit<A,int,int (A::*)()const,&A::f></code>. A similar
|
|
<code>mem_fun_explicit</code> class template is provided for non-constant
|
|
member functions.
|
|
</p>
|
|
|
|
<p>
|
|
If you are writing cross-platform code, the selection of either key extractor
|
|
is transparently handled by the macro
|
|
<a href="reference/key_extraction.html#boost_multi_index_const_mem_fun"><code>BOOST_MULTI_INDEX_CONST_MEM_FUN</code></a>,
|
|
so that
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>BOOST_MULTI_INDEX_CONST_MEM_FUN</span><span class=special>(</span><span class=identifier>A</span><span class=special>,</span><span class=keyword>int</span><span class=special>,</span><span class=identifier>f</span><span class=special>)</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
expands by default to
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>const_mem_fun</span><span class=special><</span><span class=identifier>A</span><span class=special>,</span><span class=keyword>int</span><span class=special>,&</span><span class=identifier>A</span><span class=special>::</span><span class=identifier>f</span><span class=special>></span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
but resolves to
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=identifier>const_mem_fun_explicit</span><span class=special><</span><span class=identifier>A</span><span class=special>,</span><span class=keyword>int</span><span class=special>,</span><span class=keyword>int</span> <span class=special>(</span><span class=identifier>A</span><span class=special>::*)()</span><span class=keyword>const</span><span class=special>,&</span><span class=identifier>A</span><span class=special>::</span><span class=identifier>f</span><span class=special>></span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
in MSVC++ 6.0. Non-<code>const</code> member functions are covered by
|
|
<a href="reference/key_extraction.html#mem_fun_explicit"><code>mem_fun_explicit</code></a>
|
|
and the macro
|
|
<a href="reference/key_extraction.html#boost_multi_index_mem_fun"><code>BOOST_MULTI_INDEX_MEM_FUN</code></a>.
|
|
</p>
|
|
|
|
<h3><a name="composite_key_no_pts"><code>composite_key</code> in compilers
|
|
without partial template specialization</a></h3>
|
|
|
|
<p>
|
|
When using <code>composite_key</code>s, lookup is performed by passing
|
|
tuples of values: this ability is achieved by suitably specializing
|
|
the class templates <code>std::equal_to</code>, <code>std::less</code>,
|
|
<code>std::greater</code> and <code>boost::hash</code> for
|
|
<a href="reference/key_extraction.html#composite_key_result">
|
|
<code>composite_key_result</code></a> instantiations so that they
|
|
provide the appropriate overloads accepting tuples --and in the case
|
|
of <code>std::less</code> and <code>std::greater</code>, also partial
|
|
tuples where only the first components are specified.
|
|
</p>
|
|
|
|
<p>
|
|
In those compilers that do not support partial template specialization,
|
|
these specializations cannot be provided, and so
|
|
tuple-based lookup is not available by default. In this case,
|
|
<code>multi_index_container</code> instantiations using composite keys
|
|
will work as expected, both for ordered and hashed indices,
|
|
except that lookup operations will not accept tuples as an argument.
|
|
For ordered indices, the most obvious workaround
|
|
to this deficiency involves explicitly specifying the comparison
|
|
predicate with
|
|
<a href="reference/key_extraction.html#composite_key_compare"><code>composite_key_compare</code></a>;
|
|
in the case of hashed indices we can use the analogous
|
|
<a href="reference/key_extraction.html#composite_key_equal_to"><code>composite_key_equal_to</code></a>
|
|
and
|
|
<a href="reference/key_extraction.html#composite_key_hash"><code>composite_key_hash</code></a>.
|
|
This substitution is tedious as the elementary components for all the constituent key extractors must
|
|
be explicitly typed. For this reason, Boost.MultiIndex provides the following replacement
|
|
class templates
|
|
<ul>
|
|
<li><a href="reference/key_extraction.html#composite_key_result_equal_to">
|
|
<code>composite_key_result_equal_to</code></a>,</li>
|
|
<li><a href="reference/key_extraction.html#composite_key_result_less">
|
|
<code>composite_key_result_less</code></a>,</li>
|
|
<li><a href="reference/key_extraction.html#composite_key_result_greater">
|
|
<code>composite_key_result_greater</code></a> and</li>
|
|
<li><a href="reference/key_extraction.html#composite_key_result_hash">
|
|
<code>composite_key_result_hash</code></a>,</li>
|
|
</ul>
|
|
that act as the missing specializations of <code>std::equal_to</code>, <code>std::less</code>,
|
|
<code>std::greater</code> and <code>boost::hash</code> for <code>composite_key_result</code>s.
|
|
They can be used as follows:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=keyword>typedef</span> <span class=identifier>composite_key</span><span class=special><</span>
|
|
<span class=identifier>phonebook_entry</span><span class=special>,</span>
|
|
<span class=identifier>member</span><span class=special><</span><span class=identifier>phonebook_entry</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>phonebook_entry</span><span class=special>::</span><span class=identifier>family_name</span><span class=special>>,</span>
|
|
<span class=identifier>member</span><span class=special><</span><span class=identifier>phonebook_entry</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>phonebook_entry</span><span class=special>::</span><span class=identifier>given_name</span><span class=special>></span>
|
|
<span class=special>></span> <span class=identifier>ckey_t</span><span class=special>;</span>
|
|
|
|
<span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special><</span>
|
|
<span class=identifier>phonebook_entry</span><span class=special>,</span>
|
|
<span class=identifier>indexed_by</span><span class=special><</span>
|
|
<span class=identifier>ordered_non_unique</span><span class=special><</span>
|
|
<span class=identifier>ckey_t</span><span class=special>,</span>
|
|
<span class=comment>// composite_key_result_less plays the role of
|
|
// std::less<ckey_t::result_type></span>
|
|
<span class=identifier>composite_key_result_less</span><span class=special><</span><span class=identifier>ckey_t</span><span class=special>::</span><span class=identifier>result_type</span><span class=special>></span>
|
|
<span class=special>>,</span>
|
|
<span class=identifier>ordered_unique</span><span class=special><</span>
|
|
<span class=identifier>member</span><span class=special><</span><span class=identifier>phonebook_entry</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>phonebook_entry</span><span class=special>::</span><span class=identifier>phone_number</span><span class=special>></span>
|
|
<span class=special>></span>
|
|
<span class=special>></span>
|
|
<span class=special>></span> <span class=identifier>phonebook</span><span class=special>;</span>
|
|
</pre></blockquote>
|
|
|
|
<h3><a name="symbol_reduction">Reduction of symbol name lengths</a></h3>
|
|
|
|
<p>
|
|
The types generated on the instantiations of <code>multi_index_container</code>s
|
|
typically produce very long symbol names, sometimes beyond the internal limits
|
|
of some compilers. There are several techniques to shorten generated symbol
|
|
names: these techniques have also the beneficial side effect that resulting error
|
|
messages are more readable.
|
|
</p>
|
|
|
|
<h4><a name="argument_limitation">Limitation of maximum number of arguments</a></h4>
|
|
|
|
<p>
|
|
The class templates <a href="reference/indices.html#indexed_by"><code>indexed_by</code></a>,
|
|
<a href="reference/indices.html#tag"><code>tag</code></a> and
|
|
<a href="reference/key_extraction.html#composite_key"><code>composite_key</code></a>
|
|
accept a variable number of arguments whose maximum number is limited by
|
|
internal macros. Even non-used arguments contribute to the final types,
|
|
so manually adjusting the corresponding macros can result in a modest reduction
|
|
of symbol names.
|
|
</p>
|
|
|
|
<p align="center">
|
|
<table cellspacing="0">
|
|
<caption><b>Limiting maximum number of arguments of some class templates
|
|
of Boost.MultiIndex.</b></caption>
|
|
<tr>
|
|
<th>class template</th>
|
|
<th>limiting macro</th>
|
|
<th>default value</th>
|
|
<th>default value<br>(MSVC++ 6.0)</th>
|
|
</tr>
|
|
<tr>
|
|
<td align="center"> <code>indexed_by</code> </td>
|
|
<td align="center"> <code>BOOST_MULTI_INDEX_LIMIT_INDEXED_BY_SIZE</code> </td>
|
|
<td align="center">20</td>
|
|
<td align="center">5</td>
|
|
</tr>
|
|
<tr class="odd_tr">
|
|
<td align="center"> <code>tag</code> </td>
|
|
<td align="center"> <code>BOOST_MULTI_INDEX_LIMIT_TAG_SIZE</code> </td>
|
|
<td align="center">20</td>
|
|
<td align="center">3</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="center"> <code>composite_key</code> </td>
|
|
<td align="center"> <code>BOOST_MULTI_INDEX_LIMIT_COMPOSITE_KEY_SIZE</code> </td>
|
|
<td align="center">10</td>
|
|
<td align="center">5</td>
|
|
</tr>
|
|
</table>
|
|
</p>
|
|
|
|
<h4><a name="type_hiding">Type hiding</a></h4>
|
|
|
|
<p>
|
|
Consider a typical instantiation of <code>multi_index_container</code>:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special><</span>
|
|
<span class=identifier>employee</span><span class=special>,</span>
|
|
<span class=identifier>indexed_by</span><span class=special><</span>
|
|
<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>
|
|
<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>
|
|
<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>
|
|
<span class=special>></span>
|
|
<span class=special>></span> <span class=identifier>employee_set</span><span class=special>;</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
Then, for instance, the type <code>employee_set::nth_index<0>::type</code>
|
|
resolves to the following in GCC:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<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>
|
|
<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>std</span><span class=special>::</span><span class=identifier>less</span><span class=special><</span><span class=identifier>employee</span><span class=special>>,</span>
|
|
<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>
|
|
<span class=number>1</span><span class=special>,</span> <span class=identifier>employee</span><span class=special>,</span>
|
|
<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>
|
|
<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>
|
|
<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>
|
|
<span class=special>>,</span>
|
|
<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>
|
|
<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>
|
|
<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>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>
|
|
<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>
|
|
<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> <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> <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> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span>
|
|
<span class=special>>,</span>
|
|
<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>
|
|
<span class=special>>,</span>
|
|
<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>
|
|
<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>
|
|
<span class=special>></span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
It can be seen that a significant portion of the type name is contributed by
|
|
the <code>indexed_by<...></code> part, which is nothing but an expanded
|
|
version of the index specifier list provided in the definition of
|
|
<code>employee_set</code>. We can prevent this very long name from appearing
|
|
in the final type by encapsulating it into another, shorter-named construct:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<span class=comment>// reducing symbol names through type hiding
|
|
// type hide the index spexifier list within employee_set_indices</span>
|
|
|
|
<span class=keyword>struct</span> <span class=identifier>employee_set_indices</span><span class=special>:</span>
|
|
<span class=identifier>indexed_by</span><span class=special><</span>
|
|
<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>
|
|
<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>
|
|
<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>
|
|
<span class=special>></span>
|
|
<span class=special>{};</span>
|
|
|
|
<span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special><</span>
|
|
<span class=identifier>employee</span><span class=special>,</span>
|
|
<span class=identifier>employee_set_indices</span>
|
|
<span class=special>></span> <span class=identifier>employee_set</span><span class=special>;</span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
<code>employee_set_indices</code> works as a conventional <code>typedef</code>
|
|
in all respects, save for a detail: its name does not explicitly
|
|
include the information contained in the <code>indexed_by</code> instantiation.
|
|
Applying this technique, <code>employee_set::nth_index<0>::type</code>
|
|
now becomes:
|
|
</p>
|
|
|
|
<blockquote><pre>
|
|
<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>
|
|
<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>std</span><span class=special>::</span><span class=identifier>less</span><span class=special><</span><span class=identifier>employee</span><span class=special>>,</span>
|
|
<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>
|
|
<span class=number>1</span><span class=special>,</span> <span class=identifier>employee</span><span class=special>,</span>
|
|
<span class=identifier>employee_set_indices</span><span class=special>,</span>
|
|
<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>
|
|
<span class=special>>,</span>
|
|
<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>
|
|
<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>
|
|
<span class=special>></span>
|
|
</pre></blockquote>
|
|
|
|
<p>
|
|
which is considerably shorter than the original, and also more
|
|
easily parsed by a human reader. Type hiding would not work if, instead of
|
|
making <code>employee_set_indices</code> a derived <code>struct</code> of
|
|
<code>indexed_by<...></code>, we had defined it as a <code>typedef</code>:
|
|
<code>typedef</code>s are syntactic aliases and usually get expanded
|
|
by the compiler before doing any further type handling.
|
|
</p>
|
|
|
|
<p>
|
|
Type hiding techniques can also be applied to <code>composite_key</code> intantiations,
|
|
which often contribute a great deal to symbol name lengths.
|
|
</p>
|
|
|
|
<hr>
|
|
|
|
<div class="prev_link"><a href="reference/key_extraction.html"><img src="prev.gif" alt="key extraction" border="0"><br>
|
|
Key extraction
|
|
</a></div>
|
|
<div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
|
|
Index
|
|
</a></div>
|
|
<div class="next_link"><a href="performance.html"><img src="next.gif" alt="performance" border="0"><br>
|
|
Performance
|
|
</a></div><br clear="all" style="clear: all;">
|
|
|
|
<br>
|
|
|
|
<p>Revised July 8th 2008</p>
|
|
|
|
<p>© Copyright 2003-2008 Joaquín M López Muñoz.
|
|
Distributed under the Boost Software
|
|
License, Version 1.0. (See accompanying file <a href="../../../LICENSE_1_0.txt">
|
|
LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
|
|
http://www.boost.org/LICENSE_1_0.txt</a>)
|
|
</p>
|
|
|
|
</body>
|
|
</html>
|