|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r71654 - in sandbox/local/libs/local: doc/html doc/html/boost/local doc/html/boost_local doc/qbk example
From: lorcaminiti_at_[hidden]
Date: 2011-05-01 18:07:08
Author: lcaminiti
Date: 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
New Revision: 71654
URL: http://svn.boost.org/trac/boost/changeset/71654
Log:
Added all profiles to docs.
Binary files modified:
sandbox/local/libs/local/example/profile.06.xls
sandbox/local/libs/local/example/profile.xls
sandbox/local/libs/local/example/profile_msvc-8.0_debug.png
sandbox/local/libs/local/example/profile_msvc-8.0_release.png
Text files modified:
sandbox/local/libs/local/doc/html/BOOST_IDENTITY_TYPE.html | 2
sandbox/local/libs/local/doc/html/BOOST_IDENTITY_VALUE.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK_END.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK_TPL.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_COMPLIANT.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_THIS_PARAM_NAME.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT_END.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT_TPL.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_NAME.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_PARAMS.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_PARAMS_TPL.html | 2
sandbox/local/libs/local/doc/html/BOOST_LOCAL_TYPEOF.html | 2
sandbox/local/libs/local/doc/html/boost/local/function.html | 2
sandbox/local/libs/local/doc/html/boost_local/Advanced_Topics.html | 20 +-
sandbox/local/libs/local/doc/html/boost_local/Alternatives.html | 314 +++++++++++++++++++++++----------------
sandbox/local/libs/local/doc/html/boost_local/Bibliography.html | 5
sandbox/local/libs/local/doc/html/boost_local/Getting_Started.html | 4
sandbox/local/libs/local/doc/html/boost_local/Tutorial.html | 48 +++---
sandbox/local/libs/local/doc/html/index.html | 4
sandbox/local/libs/local/doc/qbk/alternatives.qbk | 165 ++++++++++++--------
sandbox/local/libs/local/doc/qbk/bibliography.qbk | 2
sandbox/local/libs/local/doc/qbk/local.qbk | 2
sandbox/local/libs/local/doc/qbk/release_notes.qbk | 7
26 files changed, 352 insertions(+), 251 deletions(-)
Modified: sandbox/local/libs/local/doc/html/BOOST_IDENTITY_TYPE.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_IDENTITY_TYPE.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_IDENTITY_TYPE.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_IDENTITY_TYPE(parenthesized_type)</pre></div>
<div class="refsect1">
-<a name="id916024"></a><h2>Description</h2>
+<a name="id916016"></a><h2>Description</h2>
<p>This macro expands to an expression that can be passed as a single macro parameter even if it contains commas and that evaluates to the specified type at compile-time (see the <a class="link" href="boost_local/Advanced_Topics.html" title="Advanced Topics"> Advanced Topics</a> section).</p>
<p>For example <code class="computeroutput">BOOST_IDENTITY_TYPE((std::map<int, double>))</code> can be passed as a single macro parameter when instead <code class="computeroutput">std::map<int, double></code> cannot (because it contains a comma not wrapped by round parenthesis so it will be interpreted as two separate macro parameters by the preprocessor).</p>
<p><span class="bold"><strong>Parameters:</strong></span> </p>
Modified: sandbox/local/libs/local/doc/html/BOOST_IDENTITY_VALUE.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_IDENTITY_VALUE.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_IDENTITY_VALUE.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_IDENTITY_VALUE(parenthesized_value)</pre></div>
<div class="refsect1">
-<a name="id916166"></a><h2>Description</h2>
+<a name="id916158"></a><h2>Description</h2>
<p>This macro expands to an expression that can be passed as a single macro parameter even if it contains commas and that evaluates to the specified value at run-time (see the <a class="link" href="boost_local/Advanced_Topics.html" title="Advanced Topics"> Advanced Topics</a> section).</p>
<p>For example <code class="computeroutput">BOOST_IDENTITY_VALUE((key_sizeof<int, double>::value))</code> can be passed as a single macro parameter when instead <code class="computeroutput">key_sizeof<int, double>::value</code> cannot (because it contains a comma not wrapped by round parenthesis so it will be interpreted as two separate macro parameters by the preprocessor).</p>
<p><span class="bold"><strong>Parameters:</strong></span> </p>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_BLOCK(bindings)</pre></div>
<div class="refsect1">
-<a name="id910938"></a><h2>Description</h2>
+<a name="id910930"></a><h2>Description</h2>
<p>This macro must be used within a declarative context, it must be followed by the local block body code and then by the <code class="computeroutput"><a class="link" href="BOOST_LOCAL_BLOCK_END.html" title="Macro BOOST_LOCAL_BLOCK_END">BOOST_LOCAL_BLOCK_END</a></code> macro (see the Tutorial section): </p>
<pre class="programlisting"> <span class="special">{</span> <span class="comment">// Some declarative context.</span>
<span class="special">...</span>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK_END.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK_END.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK_END.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_BLOCK_END</pre></div>
<div class="refsect1">
-<a name="id911677"></a><h2>Description</h2>
+<a name="id911668"></a><h2>Description</h2>
<p>This macro must follow the local block body code <code class="computeroutput">{ ... }</code> as shown in the <code class="computeroutput"><a class="link" href="BOOST_LOCAL_BLOCK.html" title="Macro BOOST_LOCAL_BLOCK">BOOST_LOCAL_BLOCK</a></code> documentation.</p>
<p><span class="bold"><strong>Note:</strong></span> This macro cannot be used multiple times on the same line because it internally uses the line number <code class="computeroutput">__LINE__</code> to generate unique identifiers.</p>
<p><span class="bold"><strong>See:</strong></span> <code class="computeroutput"><a class="link" href="BOOST_LOCAL_BLOCK.html" title="Macro BOOST_LOCAL_BLOCK">BOOST_LOCAL_BLOCK</a></code>, <a class="link" href="boost_local/Tutorial.html" title="Tutorial">Tutorial</a> section. </p>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK_TPL.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK_TPL.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_BLOCK_TPL.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_BLOCK_TPL(bindings)</pre></div>
<div class="refsect1">
-<a name="id911603"></a><h2>Description</h2>
+<a name="id911594"></a><h2>Description</h2>
<p><span class="bold"><strong>See:</strong></span> <code class="computeroutput"><a class="link" href="BOOST_LOCAL_BLOCK.html" title="Macro BOOST_LOCAL_BLOCK">BOOST_LOCAL_BLOCK</a></code>, <a class="link" href="boost_local/Tutorial.html" title="Tutorial">Tutorial</a> section. </p>
</div>
</div>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_COMPLIANT.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_COMPLIANT.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_COMPLIANT.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_CONFIG_COMPLIANT</pre></div>
<div class="refsect1">
-<a name="id911845"></a><h2>Description</h2>
+<a name="id911836"></a><h2>Description</h2>
<p>If programmers leave this configuration macro undefined, its default value is to be left not defined.</p>
<p>If this macro is defined, variadic macros and empty macro parameters are not used by this library. Using variadic macros and empty macro parameters allows this library to provide the <span class="emphasis"><em>variadic macro</em></span> and <span class="emphasis"><em>empty macro</em></span> syntaxes which some programmers might find more readable than the <span class="emphasis"><em>sequencing macro</em></span> syntax (see <code class="computeroutput"><a class="link" href="BOOST_LOCAL_FUNCTION_PARAMS.html" title="Macro BOOST_LOCAL_FUNCTION_PARAMS">BOOST_LOCAL_FUNCTION_PARAMS</a></code>, <code class="computeroutput"><a class="link" href="BOOST_LOCAL_BLOCK.html" title="Macro BOOST_LOCAL_BLOCK">BOOST_LOCAL_BLOCK</a></code>, and <code class="computeroutput"><a class="link" href="BOOST_LOCAL_EXIT.html" title="Macro BOOST_LOCAL_EXIT">BOOST_LOCAL_EXIT</a></code>). If this configuration macro is defined then only the sequencing macro syntax is allowed (regardless of whether the compiler supports variadic and e
mpty macros or not).</p>
<p><span class="bold"><strong>Warning:</strong></span> The variadic and empty macro syntaxes are not supported by all C++ compilers so they should be used with care to avoid portability issues (and this configuration macro can be defined to disable them).</p>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX</pre></div>
<div class="refsect1">
-<a name="id912024"></a><h2>Description</h2>
+<a name="id912015"></a><h2>Description</h2>
<p>If programmers leave this configuration macro undefined, its default value is <code class="computeroutput">5</code>.</p>
<p>This only refers to the number of local function parameters and not to the number of bound variables in scope (the limit on the number of bound variables is instead the maximum size allowed for a Boost.Preprocessor sequences).</p>
<p><span class="bold"><strong>Warning:</strong></span> Increasing this number will increase compilation time.</p>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_THIS_PARAM_NAME.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_THIS_PARAM_NAME.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_CONFIG_THIS_PARAM_NAME.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_CONFIG_THIS_PARAM_NAME</pre></div>
<div class="refsect1">
-<a name="id912119"></a><h2>Description</h2>
+<a name="id912110"></a><h2>Description</h2>
<p>If programmers leave this configuration macro undefined, the default symbol used is <code class="computeroutput">this_</code>.</p>
<p><span class="bold"><strong>Warning:</strong></span> Programmers should not define this macro unless it is absolutely necessary (e.g., to avoid name clashes with another library which cannot be changed). Changing the symbol <code class="computeroutput">this_</code> effectively changes the public API of this library.</p>
<p><span class="bold"><strong>See:</strong></span> <a class="link" href="boost_local/Getting_Started.html" title="Getting Started"> Getting Started</a> section. </p>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_EXIT(binding_list)</pre></div>
<div class="refsect1">
-<a name="id912260"></a><h2>Description</h2>
+<a name="id912251"></a><h2>Description</h2>
<p>This macro must be used within a declarative context, it must be followed by the local exit body code and then by the <code class="computeroutput"><a class="link" href="BOOST_LOCAL_EXIT_END.html" title="Macro BOOST_LOCAL_EXIT_END">BOOST_LOCAL_EXIT_END</a></code> macro (see the <a class="link" href="boost_local/Tutorial.html" title="Tutorial">Tutorial</a> section): </p>
<pre class="programlisting"> <span class="special">{</span> <span class="comment">// Some declarative context.</span>
<span class="special">...</span>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT_END.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT_END.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT_END.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_EXIT_END</pre></div>
<div class="refsect1">
-<a name="id913010"></a><h2>Description</h2>
+<a name="id913001"></a><h2>Description</h2>
<p>This macro must follow the local exit body code <code class="computeroutput">{ ... }</code> as shown in the <code class="computeroutput"><a class="link" href="BOOST_LOCAL_EXIT.html" title="Macro BOOST_LOCAL_EXIT">BOOST_LOCAL_EXIT</a></code> documentation.</p>
<p><span class="bold"><strong>Note:</strong></span> This macro cannot be used multiple times on the same line because it internally uses the line number <code class="computeroutput">__LINE__</code> to generate unique identifiers.</p>
<p><span class="bold"><strong>See:</strong></span> <code class="computeroutput"><a class="link" href="BOOST_LOCAL_EXIT.html" title="Macro BOOST_LOCAL_EXIT">BOOST_LOCAL_EXIT</a></code>, <a class="link" href="boost_local/Tutorial.html" title="Tutorial">Tutorial</a> section. </p>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT_TPL.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT_TPL.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_EXIT_TPL.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_EXIT_TPL(binding_list)</pre></div>
<div class="refsect1">
-<a name="id912936"></a><h2>Description</h2>
+<a name="id912927"></a><h2>Description</h2>
<p><span class="bold"><strong>See:</strong></span> <code class="computeroutput"><a class="link" href="BOOST_LOCAL_EXIT.html" title="Macro BOOST_LOCAL_EXIT">BOOST_LOCAL_EXIT</a></code>, <a class="link" href="boost_local/Tutorial.html" title="Tutorial">Tutorial</a> section. </p>
</div>
</div>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_NAME.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_NAME.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_NAME.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_FUNCTION_NAME(name)</pre></div>
<div class="refsect1">
-<a name="id915472"></a><h2>Description</h2>
+<a name="id915464"></a><h2>Description</h2>
<p>This macro must follow the local function body code block <code class="computeroutput">{ ... }</code> as shown in the <code class="computeroutput"><a class="link" href="BOOST_LOCAL_FUNCTION_PARAMS.html" title="Macro BOOST_LOCAL_FUNCTION_PARAMS">BOOST_LOCAL_FUNCTION_PARAMS</a></code> documentation.</p>
<p><span class="bold"><strong>Parameters:</strong></span> </p>
<div class="informaltable"><table class="table">
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_PARAMS.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_PARAMS.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_PARAMS.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_FUNCTION_PARAMS(parameters)</pre></div>
<div class="refsect1">
-<a name="id914498"></a><h2>Description</h2>
+<a name="id914490"></a><h2>Description</h2>
<p>This macro must be used within a declarative context, it must follow the local function result type, it must be followed by the local function body code and then by the <code class="computeroutput"><a class="link" href="BOOST_LOCAL_FUNCTION_NAME.html" title="Macro BOOST_LOCAL_FUNCTION_NAME">BOOST_LOCAL_FUNCTION_NAME</a></code> macro (see the <a class="link" href="boost_local/Tutorial.html" title="Tutorial">Tutorial</a> and <a class="link" href="boost_local/Advanced_Topics.html" title="Advanced Topics"> Advanced Topics</a> sections): </p>
<pre class="programlisting"> <span class="special">{</span> <span class="comment">// Some declarative context.</span>
<span class="special">...</span>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_PARAMS_TPL.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_PARAMS_TPL.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_FUNCTION_PARAMS_TPL.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_FUNCTION_PARAMS_TPL(parameters)</pre></div>
<div class="refsect1">
-<a name="id915398"></a><h2>Description</h2>
+<a name="id915390"></a><h2>Description</h2>
<p><span class="bold"><strong>See:</strong></span> <code class="computeroutput"><a class="link" href="BOOST_LOCAL_FUNCTION_PARAMS.html" title="Macro BOOST_LOCAL_FUNCTION_PARAMS">BOOST_LOCAL_FUNCTION_PARAMS</a></code>, <a class="link" href="boost_local/Tutorial.html" title="Tutorial">Tutorial</a> section. </p>
</div>
</div>
Modified: sandbox/local/libs/local/doc/html/BOOST_LOCAL_TYPEOF.html
==============================================================================
--- sandbox/local/libs/local/doc/html/BOOST_LOCAL_TYPEOF.html (original)
+++ sandbox/local/libs/local/doc/html/BOOST_LOCAL_TYPEOF.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -33,7 +33,7 @@
</span>BOOST_LOCAL_TYPEOF(bound_variable_name)</pre></div>
<div class="refsect1">
-<a name="id915697"></a><h2>Description</h2>
+<a name="id915689"></a><h2>Description</h2>
<p>The type is fully qualified in that it contains the extra constant and reference qualifiers when they are specified for binding by constant and by reference. For example, if a variable named <code class="computeroutput">x</code> of type <code class="computeroutput">T</code> is: </p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>Bound by value using <code class="computeroutput">bind x</code> then <code class="computeroutput">BOOST_LOCAL_TYPEOF(x)</code> is <code class="computeroutput">T</code>. </p></li>
Modified: sandbox/local/libs/local/doc/html/boost/local/function.html
==============================================================================
--- sandbox/local/libs/local/doc/html/boost/local/function.html (original)
+++ sandbox/local/libs/local/doc/html/boost/local/function.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -35,7 +35,7 @@
<span class="keyword">struct</span> <a class="link" href="function.html" title="Struct template function">function</a> <span class="special">{</span>
<span class="special">}</span><span class="special">;</span></pre></div>
<div class="refsect1">
-<a name="id913371"></a><h2>Description</h2>
+<a name="id913362"></a><h2>Description</h2>
<p>This template defines several specializations to handle a generic number of function parameters some of which can have default values. The number of supported function parameters <code class="computeroutput">N</code> goes from <code class="computeroutput">0</code> (for a function with no parameter) to a maximum of <code class="computeroutput"><a class="link" href="../../BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX.html" title="Macro BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX">BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX</a></code>.</p>
<p>Each template specialization defines call operators <code class="computeroutput">operator()(...)</code> with a different set of parameters to handle the number of default parameters specified by <code class="computeroutput">defaults</code> (see <a class="link" href="../../boost_local/Advanced_Topics.html" title="Advanced Topics">
Advanced Topics</a> section): </p>
Modified: sandbox/local/libs/local/doc/html/boost_local/Advanced_Topics.html
==============================================================================
--- sandbox/local/libs/local/doc/html/boost_local/Advanced_Topics.html (original)
+++ sandbox/local/libs/local/doc/html/boost_local/Advanced_Topics.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -83,7 +83,7 @@
<p>
In addition, local function parameter types cannot start with non-alphanumeric
symbols (alphanumeric symbols are <code class="computeroutput"><span class="identifier">A</span><span class="special">-</span><span class="identifier">Z</span></code>, <code class="computeroutput"><span class="identifier">a</span><span class="special">-</span><span class="identifier">z</span></code>,
- and <code class="computeroutput"><span class="number">0</span><span class="special">-</span><span class="number">9</span></code>). <sup>[<a name="id881350" href="#ftn.id881350" class="footnote">14</a>]</sup> The library will generate (cryptic) preprocessor errors if a
+ and <code class="computeroutput"><span class="number">0</span><span class="special">-</span><span class="number">9</span></code>). <sup>[<a name="id881339" href="#ftn.id881339" class="footnote">14</a>]</sup> The library will generate (cryptic) preprocessor errors if a
parameter type starts with a non-alphanumeric symbol.
</p>
<p>
@@ -206,7 +206,7 @@
<li class="listitem">
Parenthesis to wrap the type expression (and therefore any commas <code class="computeroutput"><span class="special">,</span></code> that it contains) passed as parameter
to the <code class="computeroutput"><a class="link" href="../BOOST_IDENTITY_TYPE.html" title="Macro BOOST_IDENTITY_TYPE">BOOST_IDENTITY_TYPE</a></code>
- macro. <sup>[<a name="id882710" href="#ftn.id882710" class="footnote">15</a>]</sup>
+ macro. <sup>[<a name="id882699" href="#ftn.id882699" class="footnote">15</a>]</sup>
</li>
</ol></div>
<p>
@@ -407,7 +407,7 @@
</p></td></tr>
</table></div>
<p>
- Consider the following complete example: <sup>[<a name="id884014" href="#ftn.id884014" class="footnote">16</a>]</sup>
+ Consider the following complete example: <sup>[<a name="id884004" href="#ftn.id884004" class="footnote">16</a>]</sup>
</p>
<div class="informaltable"><table class="table">
<colgroup>
@@ -1899,7 +1899,7 @@
It is not possible to overload local functions. Declaring multiple local
functions with the same name within the same enclosing scope generates a
compile-time error (even if the different declarations specify different
- parameters). <sup>[<a name="id909818" href="#ftn.id909818" class="footnote">17</a>]</sup>
+ parameters). <sup>[<a name="id909810" href="#ftn.id909810" class="footnote">17</a>]</sup>
</p>
<p>
For example, the following code will <span class="bold"><strong>not</strong></span>
@@ -1923,7 +1923,7 @@
</h6>
<p>
Local functions cannot be operators. Naming a local function <code class="computeroutput"><span class="keyword">operator</span><span class="special">...</span></code>
- will generate a compile-time error. <sup>[<a name="id910167" href="#ftn.id910167" class="footnote">18</a>]</sup>
+ will generate a compile-time error. <sup>[<a name="id910158" href="#ftn.id910158" class="footnote">18</a>]</sup>
</p>
<p>
For example, the following code will <span class="bold"><strong>not</strong></span>
@@ -1970,21 +1970,21 @@
</div>
<div class="footnotes">
<br><hr width="100" align="left">
-<div class="footnote"><p><sup>[<a id="ftn.id881350" href="#id881350" class="para">14</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id881339" href="#id881339" class="para">14</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> This limitation derives from
the fact that <code class="computeroutput"><a class="link" href="../BOOST_LOCAL_FUNCTION_PARAMS.html" title="Macro BOOST_LOCAL_FUNCTION_PARAMS">BOOST_LOCAL_FUNCTION_PARAMS</a></code>
uses preprocessor token concatenation to inspect the parameter type token
to see if the token is a parameter or a bound variable. The C++ preprocessor
does not allow to concatenate non-alphanumeric tokens.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id882710" href="#id882710" class="para">15</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id882699" href="#id882699" class="para">15</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> Using variadic macros,
this extra set of parenthesis could be eliminated requiring only the
parenthesis to invoke the <code class="computeroutput"><a class="link" href="../BOOST_IDENTITY_TYPE.html" title="Macro BOOST_IDENTITY_TYPE">BOOST_IDENTITY_TYPE</a></code>
macro. However, this feature is currently not implemented and the double
parenthesis are always needed when invoking this macro.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id884014" href="#id884014" class="para">16</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id884004" href="#id884004" class="para">16</a>] </sup>
The authors recognize that the use of the <span class="emphasis"><em>identity macros</em></span>
adds extra parenthesis to the already significant number of parenthesis
required by the sequencing macro syntax. However, macro parameters usually
@@ -1992,14 +1992,14 @@
(unless template metaprogramming is being used) so this is usually not
a problem.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id909818" href="#id909818" class="para">17</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id909810" href="#id909810" class="para">17</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> This is because a local function
is a functor object declared as a local variable within the enclosing scope.
Therefore, declaring two local functions with the same name within the
same enclosing scope declares two local variables with the same name within
the same scope and that is not allowed in C++.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id910167" href="#id910167" class="para">18</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id910158" href="#id910158" class="para">18</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> This is the because a local
function name must be a valid local variable name (the local variable to
hold the local functor object) and operators cannot be used as local variable
Modified: sandbox/local/libs/local/doc/html/boost_local/Alternatives.html
==============================================================================
--- sandbox/local/libs/local/doc/html/boost_local/Alternatives.html (original)
+++ sandbox/local/libs/local/doc/html/boost_local/Alternatives.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -109,7 +109,8 @@
</td>
<td>
<p>
- No so this not an alternative implementation of local functions.
+ No. Therefore so this not really an alternative implementation
+ of local functions but it is listed here just for comparison.
</p>
</td>
<td>
@@ -136,26 +137,26 @@
</td>
<td>
<p>
- Yes (also reporting compiler error messages usual for function
- statements).
+ Yes. Moreover, eventual compiler errors follow the usual format
+ of C++ statement errors.
</p>
</td>
<td>
<p>
- Yes (also reporting compiler error messages usual for function
- statements).
+ Yes. Moreover, eventual compiler errors follow the usual format
+ of C++ statement errors.
</p>
</td>
<td>
<p>
- Yes (also reporting compiler error messages usual for function
- statements).
+ Yes. Moreover, eventual compiler errors follow the usual format
+ of C++ statement errors.
</p>
</td>
<td>
<p>
- Yes (also reporting compiler error messages usual for function
- statements).
+ Yes. Moreover, eventual compiler errors follow the usual format
+ of C++ statement errors.
</p>
</td>
<td>
@@ -177,17 +178,17 @@
</td>
<td>
<p>
- No, defined only within declarations.
+ No. It can be defined only within declarations.
</p>
</td>
<td>
<p>
- No, defined only within declarations.
+ No. It can be defined only within declarations.
</p>
</td>
<td>
<p>
- No, defined only within declarations.
+ No. It can be defined only within declarations.
</p>
</td>
<td>
@@ -214,18 +215,22 @@
</td>
<td>
<p>
- Yes.
+ Yes. The ISO C++ standard does not allow to pass local types as
+ template parameters (see [2657])
+ but this library implements a "trick" to get around this
+ limitation (see the <a class="link" href="Implementation.html" title="Appendix: Implementation">Implementation</a>
+ section).
</p>
</td>
<td>
<p>
- No with ISO C++ standard (see "local class" in [StroustupGlossary]).
- (Yes with C++0x standard and some compilers like MSVC.)
+ No on ISO C++ compilers but yes on C++0x compilers and some compilers
+ like MSVC (see [2657]).
</p>
</td>
<td>
<p>
- No.
+ Yes.
</p>
</td>
<td>
@@ -252,40 +257,39 @@
</td>
<td>
<p>
- Yes, bind by value, constant value, reference, and constant reference
- (also bind the object <code class="computeroutput"><span class="keyword">this</span></code>).
- However, the names of the bound variables must be repeated one
- by one.
+ Yes. It can bind variables by value, constant value, reference,
+ and constant reference (also it can bind the object <code class="computeroutput"><span class="keyword">this</span></code>).
</p>
</td>
<td>
<p>
- No, programmers must manually manage functor member variable and
- specify their types.
+ No. Programmers must manually manage functor member variables with
+ explicit types to access variables in scope.
</p>
</td>
<td>
<p>
- No, programmers must manually manage functor member variable and
- specify their types.
+ No. Programmers must manually manage functor member variables with
+ explicit types to access variables in scope.
</p>
</td>
<td>
<p>
- Yes, plus there is short-hand syntax to bind all variables in scope
- at once (by value or by reference). However, there is no bind by
- constant reference.
+ Yes. In addition, there is "short-hand" syntax to bind
+ all variables in scope at once (by value or by reference). However,
+ it is not possible to bind by constant reference (only by constant
+ value).
</p>
</td>
<td>
<p>
- No.
+ No (but variables in scope are accessible as usual within expressions).
</p>
</td>
<td>
<p>
- Yes, using <code class="computeroutput"><span class="identifier">let</span></code>
- which also allows to bind by constant reference.
+ Yes (using <code class="computeroutput"><span class="identifier">let</span></code>
+ which also allows to bind by constant reference).
</p>
</td>
</tr>
@@ -296,7 +300,10 @@
<a class="link" href="Alternatives.html#boost_local.Alternatives.local_functions.examples">Examples</a>
</h6>
<p>
- For example, using this library local functions:
+ The same example is rewritten here for all the different alternatives to
+ local functions so programmers can get a sense of the different syntaxes
+ and programming styles that the alternatives require. The following example
+ adds together all the elements of a vector using this library local functions:
</p>
<div class="informaltable"><table class="table">
<colgroup>
@@ -583,21 +590,30 @@
<a class="link" href="Alternatives.html#boost_local.Alternatives.local_functions.profiling">Profiling</a>
</h6>
<p>
- The following table compares compile-time, binary size, and run-time among
- the different alternatives.
+ The following tables compare run-time, binary size, and compile-time for
+ the different alternatives to local functions.
</p>
<p>
- This library has compile-times and generates binary sizes similar to the
- ones of the other approaches. This library run-times on ISO C++ compliant
+ Overall, this library has compile-times and generates binary sizes similar
+ to the ones of the other approaches. This library run-times on ISO C++ compliant
compilers (see "Boost.Local
- Compliant" below) were measured to be similar to "Local Functor"
- but larger than other approaches like "Global Functor", "Boost.Lambda",
- or "Boost.Phoenix"
- when compiler optimization is enabled. However, on C++03 compilers (e.g.,
- MSVC) this library generates optimized code (see "Boost.Local"
- below) that runs as fast as the fastest of the other approaches. Finally,
+ Compliant" below) were measured to be larger than other approaches when
+ compiler optimization is enabled (using <code class="computeroutput"><span class="identifier">bjam</span>
+ <span class="identifier">release</span> <span class="special">...</span></code>).
+ However, on compilers that allow to pass local types as template parameters
+ (e.g., MSVC 8.0 or GCC 4.5.1 with C++0x features enabled, see also [2657])
+ this library generates optimized code that runs as fast as the fastest of
+ the other approaches (see "Boost.Local"
+ below). When this library local function is specified <code class="computeroutput"><span class="keyword">inline</span></code>
+ (see "Boost.Local
+ Inline For-Loop" below) its run-times are always comparable to both
+ the "Local Functor" and "Global Functor" approaches (for
+ all these approaches, the local function cannot be portably passed as template
+ parameter, see [2657],
+ so <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span></code> is replaced by a for-loop). Finally,
this library run-times are always among the fastest when no compiler optimization
- is used.
+ is enabled (using <code class="computeroutput"><span class="identifier">bjam</span> <span class="identifier">debug</span>
+ <span class="special">...</span></code>).
</p>
<div class="note"><table border="0" summary="Note">
<tr>
@@ -606,119 +622,161 @@
</tr>
<tr><td align="left" valign="top">
<p>
- This is because on non C++03 compilers (e.g., GCC) this library needs to
+ The run-time performance of this library local function is explained because
+ on ISO C++ compliant compilers (e.g., GCC 4.3.4) this library needs to
use a function pointer in order to pass the local functor class as a template
- parameter (see the <a class="link" href="Implementation.html" title="Appendix: Implementation">Implementation</a>
- section). This function pointer prevents the compiler from inlining all
- the function calls while the functors used by other approaches like "Boost.Lambda"
+ parameter (see [2657]
+ and the <a class="link" href="Implementation.html" title="Appendix: Implementation">Implementation</a>
+ section). For all tested compilers, this function pointer prevents the
+ compiler optimization algorithms from inlining all the function calls.
+ Instead, the functor objects used by other approaches like "Boost.Lambda"
and "Boost.Phoenix"
- allows the compiler to inline all the function calls.
+ have been observed to allow all tested compilers to inline all the function
+ calls for optimization. This run-time performance cost is not present on
+ compilers that allow to pass local types as template parameters (e.g.,
+ MSVC 8.0 or GCC 4.51 with C++0x features enabled) because this library
+ does not have to use the extra function pointer to implement the local
+ function call.
</p>
<p>
- This run-time performance cost on non C++03 compilers might or not be a
- problem depending on the performance requirements of your application.
- For example, your application might already be using a number of indirect
- function calls (function pointers, virtual functions, etc) for which the
- overhead added by using the one extra function pointer required by the
- local function call might not be noticeable within your overall program
+ This run-time performance cost on ISO C++ compliant compilers might or
+ might not be an issue depending on the performance requirements of specific
+ applications. For example, an application might already be using a number
+ of indirect function calls (function pointers, virtual functions, etc)
+ for which the overhead added by using the one extra function pointer required
+ by the local function call might not be noticeable within the overall program
run-time.
</p>
</td></tr>
</table></div>
<p>
- Finally, note that a very simple local function body with only one instruction
- was used for the profiling presented here (see files profile_boost_local.cpp
,
- profile_boost_local_for_loop.cpp
,
- profile_boost_local_optimized.cpp
,
- profile_local_functor.cpp
,
- profile_global_functor.cpp
,
- profile_0x_lambda.cpp
,
- profile_boost_lambda.cpp
,
- and profile_boost_phoenix.cpp
).
- The authors have not studied how this library and the other approaches will
- perform with respect to each other when a more complex set of instructions
- is programmed for the local function body.
+ Finally, note that only a very simple local function body with just a single
+ instruction was used for the anaylsis presented here (see the profile program
+ source files linked below). The authors have not studied how this library
+ and the other approaches will perform with respect to each other when a more
+ complex set of instructions is programmed for the local function body (e.g.,
+ <span class="emphasis"><em>if</em></span> a more complex set of instructions in the local function
+ body were to inhibit some compilers from inlining functor objects also other
+ approaches like Boost.Lambda
+ and Boost.Phoenix
+ <span class="emphasis"><em>could</em></span> start to show higher run-times even when optimization
+ is enabled).
</p>
<div class="informaltable"><table class="table">
-<colgroup>
-<col>
-<col>
-</colgroup>
-<thead><tr>
-<th>
+<colgroup><col></colgroup>
+<thead><tr><th>
<p>
- <code class="literal">bjam release</code> on MSVC 8.0 (maximum optimization
- <code class="literal">/O2 /Ob2</code>)
+ Legend, Source Files, and Commands
</p>
- </th>
-<th>
+ </th></tr></thead>
+<tbody>
+<tr><td>
<p>
- <code class="literal">bjam debug</code> on MSVC 8.0 (no optimization <code class="literal">/O0
- /Ob0</code>)
+ <span class="inlinemediaobject"><img src="../../../example/profile_legend.png" width="1170" alt="profile_legend"></span>
</p>
- </th>
-</tr></thead>
-<tbody>
-<tr>
-<td>
+ </td></tr>
+<tr><td>
<p>
The local function was called <code class="literal">1e8</code> times to add
- together all the elements of a vector. The run-time was measured
+ together all the elements of a vector and the run-time was measured
using Boost.Chrono
- and averaged over <code class="literal">100</code> executions of the vector
- summation (see the relative <code class="literal">profile_...</code> example
- files).
+ averaging over <code class="literal">10</code> executions of the vector summation
+ (see source files at profile_boost_local.cpp
,
+ profile_boost_local_inline.cpp
,
+ profile_local_functor.cpp
,
+ profile_global_functor.cpp
,
+ profile_0x_lambda.cpp
,
+ profile_boost_lambda.cpp
,
+ and profile_boost_phoenix.cpp
).
</p>
- </td>
-<td>
+ </td></tr>
+<tr><td>
<p>
- The local function was called <code class="literal">1e8</code> times to add
- together all the elements of a vector. The run-time was measured
- using Boost.Chrono
- and averaged over <code class="literal">1</code> execution of the vector
- summation (see the relative <code class="literal">profile_...</code> example
- files).
+ The following commands were executed from the library example directory
+ to measure compile-time, binary size, and run-time respectively:
+
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">python</span> <span class="identifier">chrono</span><span class="special">.</span><span class="identifier">py</span> <span class="identifier">bjam</span> <span class="special">{</span><span class="identifier">release</span><span class="special">|</span><span class="identifier">debug</span><span class="special">}</span> <span class="special"><</span><span class="identifier">PROGRAM</span><span class="special">></span> <span class="preprocessor"># compile</span><span class="special">-</span><span class="identifier">time</span>
+<span class="special">></span> <span class="identifier">size</span> <span class="special"><</span><span class="identifier">PROGRAM</span><span class="special">></span> <span class="preprocessor"># binary</span> <span class="identifier">size</span> <span class="special">(</span><span class="identifier">Linux</span> <span class="keyword">and</span> <span class="identifier">Gygwin</span><span class="special">)</span>
+<span class="special">></span> <span class="special"><</span><span class="identifier">PROGRAM</span><span class="special">></span> <span class="preprocessor"># run</span><span class="special">-</span><span class="identifier">time</span>
+</pre>
+<p>
</p>
- </td>
-</tr>
-<tr>
-<td>
+ </td></tr>
+</tbody>
+</table></div>
+<div class="informaltable"><table class="table">
+<colgroup><col></colgroup>
+<thead><tr><th>
<p>
- <span class="inlinemediaobject"><img src="../../../example/profile_msvc-8.0_release.png" width="630" alt="profile_msvc-8.0_release"></span>
+ GCC 4.5.1 With C++0x Lambdas and "Local Types as Template
+ Parameters" (<code class="literal">bjam cxxflags=-std=c++0x ...</code>)
+ on Ubuntu Linux 10
</p>
- </td>
-<td>
+ </th></tr></thead>
+<tbody>
+<tr><td>
<p>
- <span class="inlinemediaobject"><img src="../../../example/profile_msvc-8.0_debug.png" width="630" alt="profile_msvc-8.0_debug"></span>
+ <span class="bold"><strong>Compiled with <code class="literal">bjam release ...</code>
+ for maximum optimization (<code class="literal">-O3 -finline-functions</code>)</strong></span>
+ <span class="inlinemediaobject"><img src="../../../example/profile_gcc-4.5.1-0x_release.png" width="1170" alt="profile_gcc-4.5.1-0x_release"></span>
</p>
- </td>
-</tr>
-<tr>
-<td>
+ </td></tr>
+<tr><td>
<p>
- Commands used to measure compile-time, binary size, and run-time
- from the library example directory:
-</p>
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">python</span> <span class="identifier">chrono</span><span class="special">.</span><span class="identifier">py</span> <span class="identifier">bjam</span> <span class="identifier">release</span> <span class="special"><</span><span class="identifier">PROGRAM</span><span class="special">></span>
-<span class="special">></span> <span class="identifier">size</span> <span class="special"><</span><span class="identifier">PROGRAM</span><span class="special">></span> <span class="preprocessor"># Cygwin</span> <span class="identifier">command</span>
-<span class="special">></span> <span class="special"><</span><span class="identifier">PROGRAM</span><span class="special">></span> <span class="number">100000000</span> <span class="number">100</span>
-</pre>
-<p>
+ <span class="bold"><strong>Compiled with <code class="literal">bjam debug ...</code>
+ for no optimization (<code class="literal">-O0 -fno-inline</code>)</strong></span>
+ <span class="inlinemediaobject"><img src="../../../example/profile_gcc-4.5.1-0x_debug.png" width="1170" alt="profile_gcc-4.5.1-0x_debug"></span>
</p>
- </td>
-<td>
+ </td></tr>
+</tbody>
+</table></div>
+<div class="informaltable"><table class="table">
+<colgroup><col></colgroup>
+<thead><tr><th>
<p>
- Commands used to measure compile-time, binary size, and run-time
- from the library example directory:
-</p>
-<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">python</span> <span class="identifier">chrono</span><span class="special">.</span><span class="identifier">py</span> <span class="identifier">bjam</span> <span class="identifier">debug</span> <span class="special"><</span><span class="identifier">PROGRAM</span><span class="special">></span>
-<span class="special">></span> <span class="identifier">size</span> <span class="special"><</span><span class="identifier">PROGRAM</span><span class="special">></span> <span class="preprocessor"># Cygwin</span> <span class="identifier">command</span>
-<span class="special">></span> <span class="special"><</span><span class="identifier">PROGRAM</span><span class="special">></span> <span class="number">100000000</span> <span class="number">1</span>
-</pre>
-<p>
+ MSVC 8.0 With "Local Types as Template Parameters" on
+ Windows XP
</p>
- </td>
-</tr>
+ </th></tr></thead>
+<tbody>
+<tr><td>
+ <p>
+ <span class="bold"><strong>Compiled with <code class="literal">bjam release ...</code>
+ for maximum optimization (<code class="literal">/O2 /Ob2</code>)</strong></span>
+ <span class="inlinemediaobject"><img src="../../../example/profile_msvc-8.0_release.png" width="1170" alt="profile_msvc-8.0_release"></span>
+ </p>
+ </td></tr>
+<tr><td>
+ <p>
+ <span class="bold"><strong>Compiled with <code class="literal">bjam debug ...</code>
+ for no optimization (<code class="literal">/Od /Ob0</code>)</strong></span> <span class="inlinemediaobject"><img src="../../../example/profile_msvc-8.0_debug.png" width="1170" alt="profile_msvc-8.0_debug"></span>
+ </p>
+ </td></tr>
+</tbody>
+</table></div>
+<div class="informaltable"><table class="table">
+<colgroup><col></colgroup>
+<thead><tr><th>
+ <p>
+ GCC 4.3.4 With No C++0x Features on Cygwin
+ </p>
+ </th></tr></thead>
+<tbody>
+<tr><td>
+ <p>
+ <span class="bold"><strong>Compiled with <code class="literal">bjam release ...</code>
+ for maximum optimization (<code class="literal">-O3 -finline-functions</code>)</strong></span>
+ <span class="inlinemediaobject"><img src="../../../example/profile_gcc-4.3.4_release.png" width="1170" alt="profile_gcc-4.3.4_release"></span>
+ </p>
+ </td></tr>
+<tr><td>
+ <p>
+ <span class="bold"><strong>Compiled with <code class="literal">bjam debug ...</code>
+ for no optimization (<code class="literal">-O0 -fno-inline</code>)</strong></span>
+ <span class="inlinemediaobject"><img src="../../../example/profile_gcc-4.3.4_debug.png" width="1170" alt="profile_gcc-4.3.4_debug"></span>
+ </p>
+ </td></tr>
</tbody>
</table></div>
</div>
@@ -727,8 +785,8 @@
<a name="boost_local.Alternatives.local_blocks"></a><a class="link" href="Alternatives.html#boost_local.Alternatives.local_blocks" title="Local Blocks">Local Blocks</a>
</h3></div></div></div>
<p>
- The authors know of no other library or language feature that supports local
- blocks (i.e., with the ability to bind by constant value or reference).
+ The authors know of no other library or C++ language feature that supports
+ local blocks (i.e., with the ability to bind by constant value or reference).
</p>
</div>
<div class="section">
Modified: sandbox/local/libs/local/doc/html/boost_local/Bibliography.html
==============================================================================
--- sandbox/local/libs/local/doc/html/boost_local/Bibliography.html (original)
+++ sandbox/local/libs/local/doc/html/boost_local/Bibliography.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -47,6 +47,11 @@
Standards Committee, document no. N2550=08-0060, 2008.
</p>
<p>
+ [2657]
+ John Spicer. <span class="emphasis"><em>Local and Unamed Types as Template Arguments.</em></span>
+ The C++ Standard Committee, document no. NN2657-08-0167, 2008.
+ </p>
+<p>
<a href="http://www2.research.att.com/~bs/glossary.html" target="_top">[StroustupGlossary]</a>
Bjarne Stroustrup. <span class="emphasis"><em>Bjarne Stroustrup's C++ Glossary.</em></span>
</p>
Modified: sandbox/local/libs/local/doc/html/boost_local/Getting_Started.html
==============================================================================
--- sandbox/local/libs/local/doc/html/boost_local/Getting_Started.html (original)
+++ sandbox/local/libs/local/doc/html/boost_local/Getting_Started.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -121,7 +121,7 @@
</pre>
<p>
The following symbols are part of the library private API, they are not documented,
- and they should not be directly used by programmers: <sup>[<a name="id866105" href="#ftn.id866105" class="footnote">1</a>]</sup>
+ and they should not be directly used by programmers: <sup>[<a name="id866096" href="#ftn.id866096" class="footnote">1</a>]</sup>
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
@@ -159,7 +159,7 @@
</div>
<div class="footnotes">
<br><hr width="100" align="left">
-<div class="footnote"><p><sup>[<a id="ftn.id866105" href="#id866105" class="para">1</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id866096" href="#id866096" class="para">1</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> This library concatenates symbols
specified by the programmers (e.g., the local function name) with other
symbols (e.g., special prefixes or preprocessor line numbers) to make internal
Modified: sandbox/local/libs/local/doc/html/boost_local/Tutorial.html
==============================================================================
--- sandbox/local/libs/local/doc/html/boost_local/Tutorial.html (original)
+++ sandbox/local/libs/local/doc/html/boost_local/Tutorial.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -115,12 +115,12 @@
<span class="special">...</span> <span class="special">}</span></code>
using the usual C++ syntax. The body is specified outside any of the macros
so eventual compiler error messages and related line numbers retain their
- usual meaning. <sup>[<a name="id866801" href="#ftn.id866801" class="footnote">2</a>]</sup>
+ usual meaning. <sup>[<a name="id866791" href="#ftn.id866791" class="footnote">2</a>]</sup>
</p>
<p>
The macro <code class="computeroutput"><a class="link" href="../BOOST_LOCAL_FUNCTION_NAME.html" title="Macro BOOST_LOCAL_FUNCTION_NAME">BOOST_LOCAL_FUNCTION_NAME</a></code>
is used to end the local function definition and to specify the local function
- name. <sup>[<a name="id866837" href="#ftn.id866837" class="footnote">3</a>]</sup>
+ name. <sup>[<a name="id866828" href="#ftn.id866828" class="footnote">3</a>]</sup>
</p>
<p>
For example, let's program a local function named <code class="computeroutput"><span class="identifier">add</span></code>
@@ -366,7 +366,7 @@
This library also allows to specify default values for the local function
parameters. However, the usual C++ syntax for default parameters that uses
the assignment symbol <code class="computeroutput"><span class="special">=</span></code> cannot
- be used. <sup>[<a name="id868862" href="#ftn.id868862" class="footnote">4</a>]</sup> The keyword <code class="computeroutput"><span class="keyword">default</span></code>
+ be used. <sup>[<a name="id868850" href="#ftn.id868850" class="footnote">4</a>]</sup> The keyword <code class="computeroutput"><span class="keyword">default</span></code>
is used instead:
</p>
<div class="informaltable"><table class="table">
@@ -508,7 +508,7 @@
variables, the object <code class="computeroutput"><span class="keyword">this</span></code>,
etc) can be bound to a local function declaration. The types of bound variables
are automatically deduced by this library using Boost.Typeof.
- <sup>[<a name="id870222" href="#ftn.id870222" class="footnote">5</a>]</sup>
+ <sup>[<a name="id870210" href="#ftn.id870210" class="footnote">5</a>]</sup>
</p>
<div class="important"><table border="0" summary="Important">
<tr>
@@ -525,7 +525,7 @@
</table></div>
<p>
This library introduces the new "keyword" <code class="computeroutput"><span class="identifier">bind</span></code>
- <sup>[<a name="id870304" href="#ftn.id870304" class="footnote">6</a>]</sup> which is used in place of the parameter type to specify the name
+ <sup>[<a name="id870292" href="#ftn.id870292" class="footnote">6</a>]</sup> which is used in place of the parameter type to specify the name
of a variable in scope to bind. The variable can be bound by value:
</p>
<pre class="programlisting"><span class="identifier">bind</span> <span class="emphasis"><em>variable-name</em></span> <span class="comment">// Bind by value.</span>
@@ -572,7 +572,7 @@
bound as constant unless constant binding is forced using <code class="computeroutput"><span class="keyword">const</span>
<span class="identifier">bind</span> <span class="special">...</span></code>
(note that binding by constant reference is not supported by <a href="http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions" target="_top">C++0x
- lambda</a> functions). <sup>[<a name="id870874" href="#ftn.id870874" class="footnote">7</a>]</sup> As with passing parameters to usual C++ functions, programmers
+ lambda</a> functions). <sup>[<a name="id870862" href="#ftn.id870862" class="footnote">7</a>]</sup> As with passing parameters to usual C++ functions, programmers
might want to bind variables of complex types by (constant) reference instead
than by value to avoid expensive copy operations when these variables are
bound to a local function.
@@ -705,12 +705,12 @@
<p>
When the object <code class="computeroutput"><span class="keyword">this</span></code> is bound
to a local function, the local function body must use the special symbol
- <code class="computeroutput"><span class="identifier">this_</span></code> (instead of <code class="computeroutput"><span class="keyword">this</span></code>) to access the bound object. <sup>[<a name="id872060" href="#ftn.id872060" class="footnote">8</a>]</sup>
+ <code class="computeroutput"><span class="identifier">this_</span></code> (instead of <code class="computeroutput"><span class="keyword">this</span></code>) to access the bound object. <sup>[<a name="id872041" href="#ftn.id872041" class="footnote">8</a>]</sup>
</p>
<p>
Unfortunately, mistakenly using <code class="computeroutput"><span class="keyword">this</span></code>
within the local function body instead of <code class="computeroutput"><span class="identifier">this_</span></code>
- will not necessarily generate a compile-time error. <sup>[<a name="id872154" href="#ftn.id872154" class="footnote">9</a>]</sup> Programmers are responsible to make sure that <code class="computeroutput"><span class="keyword">this</span></code> is never used within a local function
+ will not necessarily generate a compile-time error. <sup>[<a name="id872134" href="#ftn.id872134" class="footnote">9</a>]</sup> Programmers are responsible to make sure that <code class="computeroutput"><span class="keyword">this</span></code> is never used within a local function
body which should only use the special symbol <code class="computeroutput"><span class="identifier">this_</span></code>.
</p>
</td></tr>
@@ -892,7 +892,7 @@
<tr><td align="left" valign="top"><p>
A <code class="computeroutput"><span class="keyword">return</span><span class="special">;</span></code>
instruction from within a local block jumps to the end of the local block
- body and it does not return the enclosing function. <sup>[<a name="id875458" href="#ftn.id875458" class="footnote">10</a>]</sup>
+ body and it does not return the enclosing function. <sup>[<a name="id875450" href="#ftn.id875450" class="footnote">10</a>]</sup>
</p></td></tr>
</table></div>
<p>
@@ -1002,7 +1002,7 @@
</tr>
<tr><td align="left" valign="top"><p>
The execution of the local exit body code is guaranteed only if the program
- does not terminate because of an uncaught exception. <sup>[<a name="id876671" href="#ftn.id876671" class="footnote">11</a>]</sup>
+ does not terminate because of an uncaught exception. <sup>[<a name="id876663" href="#ftn.id876663" class="footnote">11</a>]</sup>
</p></td></tr>
</table></div>
<p>
@@ -1107,7 +1107,7 @@
Local exits are very similar to the <span class="emphasis"><em>scope exits</em></span> provided
by Boost.ScopeExit
with the addition that they also support constant binding and binding of
- the object <code class="computeroutput"><span class="keyword">this</span></code>. <sup>[<a name="id877926" href="#ftn.id877926" class="footnote">12</a>]</sup> Local exits can be used to emulate the <a href="http://d.digitalmars.com" target="_top">D
+ the object <code class="computeroutput"><span class="keyword">this</span></code>. <sup>[<a name="id877918" href="#ftn.id877918" class="footnote">12</a>]</sup> Local exits can be used to emulate the <a href="http://d.digitalmars.com" target="_top">D
Programming Language</a> <span class="emphasis"><em>scope guards</em></span> (see the
<a class="link" href="Examples.html#boost_local.Examples.Emulating_Ds_Scope_Guards" title="Emulating D's Scope Guards">Emulating
D's Scope Guards</a> example).
@@ -1121,7 +1121,7 @@
When local functions, local blocks, and local exits are programmed within
templates, they need to be declared using the following special macros ending
with the <code class="computeroutput"><span class="identifier">TPL</span></code> postfix (see
- the Reference section): <sup>[<a name="id878209" href="#ftn.id878209" class="footnote">13</a>]</sup>
+ the Reference section): <sup>[<a name="id878200" href="#ftn.id878200" class="footnote">13</a>]</sup>
</p>
<pre class="programlisting"><code class="computeroutput"><a class="link" href="../BOOST_LOCAL_FUNCTION_PARAMS_TPL.html" title="Macro BOOST_LOCAL_FUNCTION_PARAMS_TPL">BOOST_LOCAL_FUNCTION_PARAMS_TPL</a></code><span class="special">(</span><span class="emphasis"><em>parameters</em></span><span class="special">)</span>
<code class="computeroutput"><a class="link" href="../BOOST_LOCAL_BLOCK_TPL.html" title="Macro BOOST_LOCAL_BLOCK_TPL">BOOST_LOCAL_BLOCK_TPL</a></code><span class="special">(</span><span class="emphasis"><em>bindings</em></span><span class="special">)</span>
@@ -1254,20 +1254,20 @@
</div>
<div class="footnotes">
<br><hr width="100" align="left">
-<div class="footnote"><p><sup>[<a id="ftn.id866801" href="#id866801" class="para">2</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id866791" href="#id866791" class="para">2</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> If the local function body
were instead passed as a macro parameter, it would be expanded on a single
line of code (because macros always expand as a single line of code). Therefore,
eventual compiler error line numbers would all report the same value and
would no longer be useful to pinpoint the error.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id866837" href="#id866837" class="para">3</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id866828" href="#id866828" class="para">3</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> The local function name must
be passed to the macro <code class="computeroutput"><a class="link" href="../BOOST_LOCAL_FUNCTION_NAME.html" title="Macro BOOST_LOCAL_FUNCTION_NAME">BOOST_LOCAL_FUNCTION_NAME</a></code>
ending the function definition so this macro can declare a local variable
with the local function name to hold the local functor object.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id868862" href="#id868862" class="para">4</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id868850" href="#id868850" class="para">4</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> The assignment symbol <code class="computeroutput"><span class="special">=</span></code> cannot be used to specify default parameter
values because default values are not part of the parameter type so they
cannot be handled using template metaprogamming. Default parameter values
@@ -1277,7 +1277,7 @@
it counts the number of default values to provide the correct set of call
operators for the local functor object.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id870222" href="#id870222" class="para">5</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id870210" href="#id870210" class="para">5</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> By binding a variable in scope,
the local function declaration is specifying that such a variable should
be accessible within the local function body regardless of its type. Semantically,
@@ -1290,7 +1290,7 @@
This is especially useful for maintenance so if a bound variable type is
changed, the local function declaration does not have to change.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id870304" href="#id870304" class="para">6</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id870292" href="#id870292" class="para">6</a>] </sup>
The token <code class="computeroutput"><span class="identifier">bind</span></code> is not a
real keyword of the C++ language. This library parses <code class="computeroutput"><span class="identifier">bind</span></code>
during macro expansion using preprocessor metaprogramming. Therefore,
@@ -1299,7 +1299,7 @@
within the syntax defined by the macros of this library -- thus it is referred
to as a "keyword" only within quotes.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id870874" href="#id870874" class="para">7</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id870862" href="#id870862" class="para">7</a>] </sup>
An historical note: Constant binding of variables in scope was the main
use case that originally motivated the authors in developing this library.
The authors needed to locally create a chuck of code to assert some correctness
@@ -1314,7 +1314,7 @@
generates an error because the bound variable is of <code class="computeroutput"><span class="keyword">const</span></code>
type within the local function body.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id872060" href="#id872060" class="para">8</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id872041" href="#id872041" class="para">8</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> This limitation comes from
the fact that <code class="computeroutput"><span class="keyword">this</span></code> is a
reserved C++ keyword so it cannot be used as the name of the internal
@@ -1328,7 +1328,7 @@
behaviour of <code class="computeroutput"><span class="keyword">static_cast</span></code></a>
(which might not work on all platforms at the cost of portability).
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id872154" href="#id872154" class="para">9</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id872134" href="#id872134" class="para">9</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> The local function body cannot
be a static member function of the local functor object in order to support
recursion (because the local function name is specified by the <code class="computeroutput"><a class="link" href="../BOOST_LOCAL_FUNCTION_NAME.html" title="Macro BOOST_LOCAL_FUNCTION_NAME">BOOST_LOCAL_FUNCTION_NAME</a></code>
@@ -1341,7 +1341,7 @@
is visible but it refers to the local functor object and not to the bound
object.
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id875458" href="#id875458" class="para">10</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id875450" href="#id875450" class="para">10</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> Programmers might expect
<code class="computeroutput"><span class="keyword">return</span><span class="special">;</span></code>
to exit the enclosing function instead of the local block (or local exit),
@@ -1359,7 +1359,7 @@
<code class="computeroutput"><span class="identifier">BOOST_LOCAL_RETURN</span><span class="special">;</span></code>)
to exit local blocks (and local exits).
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id876671" href="#id876671" class="para">11</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id876663" href="#id876663" class="para">11</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> This library (as well as
<a href="http://www.boost.org/doc/libs/release/libs/scope_exit/doc/html/index.html" target="_top">Boost.ScopeExit</a>)
uses the destructor of a local variable to automatically execute the
@@ -1370,7 +1370,7 @@
scope exit code even if the main program terminates because of an uncaught
exception.)
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id877926" href="#id877926" class="para">12</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id877918" href="#id877918" class="para">12</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> This library could be merged
together with Boost.ScopeExit
into a new library named Boost.Scope (from the meaning of the word "scope"
@@ -1397,7 +1397,7 @@
of "<a href="http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html" target="_top">nested
functions</a>" (GCC compiler extension).
</p></div>
-<div class="footnote"><p><sup>[<a id="ftn.id878209" href="#id878209" class="para">13</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.id878200" href="#id878200" class="para">13</a>] </sup>
<span class="bold"><strong>Rationale.</strong></span> Within templates, this library
needs to use <code class="computeroutput"><span class="keyword">typename</span></code> to explicitly
indicate that some expressions evaluate to a type. Because C++ does not
Modified: sandbox/local/libs/local/doc/html/index.html
==============================================================================
--- sandbox/local/libs/local/doc/html/index.html (original)
+++ sandbox/local/libs/local/doc/html/index.html 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -27,7 +27,7 @@
</h3></div></div></div>
<div><p class="copyright">Copyright © 2009-2011 Lorenzo Caminiti</p></div>
<div><div class="legalnotice">
-<a name="id808762"></a><p>
+<a name="id863704"></a><p>
Use, modification, and distribution is subject to the Boost Software License,
Version 1.0 (see accompanying file LICENSE_1_0.txt or a copy at http://www.boost.org/LICENSE_1_0.txt).
</p>
@@ -416,7 +416,7 @@
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"><p><small>Last revised: April 29, 2011 at 03:17:41 GMT</small></p></td>
+<td align="left"><p><small>Last revised: May 01, 2011 at 21:58:12 GMT</small></p></td>
<td align="right"><div class="copyright-footer"></div></td>
</tr></table>
<hr>
Modified: sandbox/local/libs/local/doc/qbk/alternatives.qbk
==============================================================================
--- sandbox/local/libs/local/doc/qbk/alternatives.qbk (original)
+++ sandbox/local/libs/local/doc/qbk/alternatives.qbk 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -26,54 +26,64 @@
[ ['Can be defined locally] ]
[ Yes. ]
[ Yes. ]
- [ No so this not an alternative implementation of local functions. ]
+ [ No.
+Therefore so this not really an alternative implementation of local functions but it is listed here just for comparison. ]
[ Yes. ]
[ Yes. ]
[ Yes. ]
]
[
[ ['Can be defined using regular C++ statements] ]
- [ Yes (also reporting compiler error messages usual for function statements). ]
- [ Yes (also reporting compiler error messages usual for function statements). ]
- [ Yes (also reporting compiler error messages usual for function statements). ]
- [ Yes (also reporting compiler error messages usual for function statements). ]
+ [ Yes.
+Moreover, eventual compiler errors follow the usual format of C++ statement errors.]
+ [ Yes.
+Moreover, eventual compiler errors follow the usual format of C++ statement errors.]
+ [ Yes.
+Moreover, eventual compiler errors follow the usual format of C++ statement errors.]
+ [ Yes.
+Moreover, eventual compiler errors follow the usual format of C++ statement errors.]
[ No. ]
[ No. ]
]
[
[ ['Can be defined within expressions] ]
- [ No, defined only within declarations. ]
- [ No, defined only within declarations. ]
- [ No, defined only within declarations. ]
+ [ No. It can be defined only within declarations. ]
+ [ No. It can be defined only within declarations. ]
+ [ No. It can be defined only within declarations. ]
[ Yes. ]
[ Yes. ]
[ Yes. ]
]
[
[ ['Can be passed as template parameter (e.g., to STL algorithms)] ]
+ [ Yes.
+The ISO C++ standard does not allow to pass local types as template parameters (see __N2657__) but this library implements a "trick" to get around this limitation (see the __Implementation__ section). ]
+ [ No on ISO C++ compilers but yes on C++0x compilers and some compilers like MSVC (see __N2657__). ]
[ Yes. ]
- [ No with ISO C++ standard (see "local class" in __StroustrupGlossary__). (Yes with C++0x standard and some compilers like MSVC.) ]
- [ No. ]
[ Yes. ]
[ Yes. ]
[ Yes. ]
]
[
[ ['Bind variables in scope] ]
- [ Yes, bind by value, constant value, reference, and constant reference (also bind the object `this`).
-However, the names of the bound variables must be repeated one by one.]
- [ No, programmers must manually manage functor member variable and specify their types. ]
- [ No, programmers must manually manage functor member variable and specify their types. ]
- [ Yes, plus there is short-hand syntax to bind all variables in scope at once (by value or by reference).
-However, there is no bind by constant reference. ]
- [ No. ]
- [ Yes, using `let` which also allows to bind by constant reference. ]
+ [ Yes.
+It can bind variables by value, constant value, reference, and constant reference (also it can bind the object `this`). ]
+ [ No.
+Programmers must manually manage functor member variables with explicit types to access variables in scope. ]
+ [ No.
+Programmers must manually manage functor member variables with explicit types to access variables in scope. ]
+ [ Yes.
+ In addition, there is "short-hand" syntax to bind all variables in scope at once (by value or by reference).
+However, it is not possible to bind by constant reference (only by constant value). ]
+ [ No (but variables in scope are accessible as usual within expressions). ]
+ [ Yes (using `let` which also allows to bind by constant reference). ]
]
]
[h5 Examples]
-For example, using this library local functions:
+The same example is rewritten here for all the different alternatives to local functions so programmers can get a sense of the different syntaxes and programming styles that the alternatives require.
+The following example adds together all the elements of a vector using this library local functions:
[table
[ [__Variadic_Macro_Syntax__] [__Sequencing_Macro_Syntax__] ]
@@ -102,76 +112,97 @@
[h5 Profiling]
-The following table compares compile-time, binary size, and run-time among the different alternatives.
+The following tables compare run-time, binary size, and compile-time for the different alternatives to local functions.
-This library has compile-times and generates binary sizes similar to the ones of the other approaches.
-This library run-times on ISO C++ compliant compilers (see "__Boost_Local__ Compliant" below) were measured to be similar to "Local Functor" but larger than other approaches like "Global Functor", "__Boost_Lambda__", or "__Boost_Phoenix__" when compiler optimization is enabled.
-However, on C++03 compilers (e.g., MSVC) this library generates optimized code (see "__Boost_Local__" below) that runs as fast as the fastest of the other approaches.
-Finally, this library run-times are always among the fastest when no compiler optimization is used.
+Overall, this library has compile-times and generates binary sizes similar to the ones of the other approaches.
+This library run-times on ISO C++ compliant compilers (see "__Boost_Local__ Compliant" below) were measured to be larger than other approaches when compiler optimization is enabled (using `bjam release ...`).
+However, on compilers that allow to pass local types as template parameters (e.g., MSVC 8.0 or GCC 4.5.1 with C++0x features enabled, see also __N2657__) this library generates optimized code that runs as fast as the fastest of the other approaches (see "__Boost_Local__" below).
+When this library local function is specified `inline` (see "__Boost_Local__ Inline For-Loop" below) its run-times are always comparable to both the "Local Functor" and "Global Functor" approaches (for all these approaches, the local function cannot be portably passed as template parameter, see __N2657__, so `std::for_each` is replaced by a for-loop).
+Finally, this library run-times are always among the fastest when no compiler optimization is enabled (using `bjam debug ...`).
[note
-This is because on non C++03 compilers (e.g., GCC) this library needs to use a function pointer in order to pass the local functor class as a template parameter (see the __Implementation__ section).
-This function pointer prevents the compiler from inlining all the function calls while the functors used by other approaches like "__Boost_Lambda__" and "__Boost_Phoenix__" allows the compiler to inline all the function calls.
+The run-time performance of this library local function is explained because on ISO C++ compliant compilers (e.g., GCC 4.3.4) this library needs to use a function pointer in order to pass the local functor class as a template parameter (see __N2657__ and the __Implementation__ section).
+For all tested compilers, this function pointer prevents the compiler optimization algorithms from inlining all the function calls.
+Instead, the functor objects used by other approaches like "__Boost_Lambda__" and "__Boost_Phoenix__" have been observed to allow all tested compilers to inline all the function calls for optimization.
+This run-time performance cost is not present on compilers that allow to pass local types as template parameters (e.g., MSVC 8.0 or GCC 4.51 with C++0x features enabled) because this library does not have to use the extra function pointer to implement the local function call.
-This run-time performance cost on non C++03 compilers might or not be a problem depending on the performance requirements of your application.
-For example, your application might already be using a number of indirect function calls (function pointers, virtual functions, etc) for which the overhead added by using the one extra function pointer required by the local function call might not be noticeable within your overall program run-time.
+This run-time performance cost on ISO C++ compliant compilers might or might not be an issue depending on the performance requirements of specific applications.
+For example, an application might already be using a number of indirect function calls (function pointers, virtual functions, etc) for which the overhead added by using the one extra function pointer required by the local function call might not be noticeable within the overall program run-time.
]
-Finally, note that a very simple local function body with only one instruction was used for the profiling presented here (see files
+Finally, note that only a very simple local function body with just a single instruction was used for the anaylsis presented here (see the profile program source files linked below).
+The authors have not studied how this library and the other approaches will perform with respect to each other when a more complex set of instructions is programmed for the local function body (e.g., /if/ a more complex set of instructions in the local function body were to inhibit some compilers from inlining functor objects also other approaches like __Boost_Lambda__ and __Boost_Phoenix__ /could/ start to show higher run-times even when optimization is enabled).
+
+[table
+[ [ Legend, Source Files, and Commands ] ]
+[ [ [$../../example/profile_legend.png [width 13in] [height 10in]] ] ]
+[ [
+The local function was called =1e8= times to add together all the elements of a vector and the run-time was measured using __Boost_Chrono__ averaging over =10= executions of the vector summation (see source files at
[@../../example/profile_boost_local.cpp =profile_boost_local.cpp=],
-[@../../example/profile_boost_local_for_loop.cpp =profile_boost_local_for_loop.cpp=],
-[@../../example/profile_boost_local_optimized.cpp =profile_boost_local_optimized.cpp=],
+[@../../example/profile_boost_local_inline.cpp =profile_boost_local_inline.cpp=],
[@../../example/profile_local_functor.cpp =profile_local_functor.cpp=],
[@../../example/profile_global_functor.cpp =profile_global_functor.cpp=],
[@../../example/profile_0x_lambda.cpp =profile_0x_lambda.cpp=],
[@../../example/profile_boost_lambda.cpp =profile_boost_lambda.cpp=], and
[@../../example/profile_boost_phoenix.cpp =profile_boost_phoenix.cpp=]).
-The authors have not studied how this library and the other approaches will perform with respect to each other when a more complex set of instructions is programmed for the local function body.
+] ]
+[ [
+The following commands were executed from the library example directory to measure compile-time, binary size, and run-time respectively:
+``
+> python chrono.py bjam {release|debug} <PROGRAM> # compile-time
+> size <PROGRAM> # binary size (Linux and Gygwin)
+> <PROGRAM> # run-time
+``
+] ]
+]
[table
-[
- [ =bjam release= on MSVC 8.0 (maximum optimization =/O2 /Ob2=)]
- [ =bjam debug= on MSVC 8.0 (no optimization =/O0 /Ob0=)]
+[ [
+GCC 4.5.1 With C++0x Lambdas and "Local Types as Template Parameters" ([^bjam cxxflags=-std=c++0x ...]) on Ubuntu Linux 10
+] ]
+[ [
+[*Compiled with =bjam release ...= for maximum optimization (=-O3 -finline-functions=)]
+[$../../example/profile_gcc-4.5.1-0x_release.png [width 13in] [height 10in]]
+] ]
+[ [
+[*Compiled with =bjam debug ...= for no optimization (=-O0 -fno-inline=)]
+[$../../example/profile_gcc-4.5.1-0x_debug.png [width 13in] [height 10in]]
+] ]
]
-[
- [
-The local function was called =1e8= times to add together all the elements of a vector.
-The run-time was measured using __Boost_Chrono__ and averaged over =100= executions of the vector summation (see the relative =profile_...= example files).
- ]
- [
-The local function was called =1e8= times to add together all the elements of a vector.
-The run-time was measured using __Boost_Chrono__ and averaged over =1= execution of the vector summation (see the relative =profile_...= example files).
- ]
-]
-[
- [ [$../../example/profile_msvc-8.0_release.png [width 7in] [height 10in]] ]
- [ [$../../example/profile_msvc-8.0_debug.png [width 7in] [height 10in]] ]
-]
-[
- [
-Commands used to measure compile-time, binary size, and run-time from the library example directory:
-``
-> python chrono.py bjam release <PROGRAM>
-> size <PROGRAM> # Cygwin command
-> <PROGRAM> 100000000 100
-``
- ]
- [
-Commands used to measure compile-time, binary size, and run-time from the library example directory:
-``
-> python chrono.py bjam debug <PROGRAM>
-> size <PROGRAM> # Cygwin command
-> <PROGRAM> 100000000 1
-``
- ]
+
+[table
+[ [
+MSVC 8.0 With "Local Types as Template Parameters" on Windows XP
+] ]
+[ [
+[*Compiled with =bjam release ...= for maximum optimization (=/O2 /Ob2=)]
+[$../../example/profile_msvc-8.0_release.png [width 13in] [height 10in]]
+] ]
+[ [
+[*Compiled with =bjam debug ...= for no optimization (=/Od /Ob0=)]
+[$../../example/profile_msvc-8.0_debug.png [width 13in] [height 10in]]
+] ]
]
+
+[table
+[ [
+GCC 4.3.4 With No C++0x Features on Cygwin
+] ]
+[ [
+[*Compiled with =bjam release ...= for maximum optimization (=-O3 -finline-functions=)]
+[$../../example/profile_gcc-4.3.4_release.png [width 13in] [height 10in]]
+] ]
+[ [
+[*Compiled with =bjam debug ...= for no optimization (=-O0 -fno-inline=)]
+[$../../example/profile_gcc-4.3.4_debug.png [width 13in] [height 10in]]
+] ]
]
[endsect]
[section Local Blocks]
-The authors know of no other library or language feature that supports local blocks (i.e., with the ability to bind by constant value or reference).
+The authors know of no other library or C++ language feature that supports local blocks (i.e., with the ability to bind by constant value or reference).
[endsect]
Modified: sandbox/local/libs/local/doc/qbk/bibliography.qbk
==============================================================================
--- sandbox/local/libs/local/doc/qbk/bibliography.qbk (original)
+++ sandbox/local/libs/local/doc/qbk/bibliography.qbk 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -14,7 +14,7 @@
__N2550__ Jaakko Jarvi, John Freeman, Lawrence Crowl. /Lambda Expressions and Closures: Wording for Monomorphic Lambdas (Revision 4)./ The C++ Standards Committee, document no. N2550=08-0060, 2008.
-__StroustrupGlossary__ Bjarne Stroustrup. /Bjarne Stroustrup's C++ Glossary./
+__N2657__ John Spicer. /Local and Unamed Types as Template Arguments./ The C++ Standard Committee, document no. NN2657-08-0167, 2008.
[endsect]
Modified: sandbox/local/libs/local/doc/qbk/local.qbk
==============================================================================
--- sandbox/local/libs/local/doc/qbk/local.qbk (original)
+++ sandbox/local/libs/local/doc/qbk/local.qbk 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -40,7 +40,7 @@
[def __N2511__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2511.html \[N2511\]]]
[def __N2529__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2529.pdf \[N2529\]]]
[def __N2550__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2550.pdf \[N2550\]]]
-[def __StroustrupGlossary__ [@http://www2.research.att.com/~bs/glossary.html \[StroustupGlossary\]]]
+[def __N2657__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm \[2657\]]]
[def __Introduction__ [link boost_local.Introduction Introduction]]
[def __Getting_Started__ [link boost_local.Getting_Started Getting Started]]
Modified: sandbox/local/libs/local/doc/qbk/release_notes.qbk
==============================================================================
--- sandbox/local/libs/local/doc/qbk/release_notes.qbk (original)
+++ sandbox/local/libs/local/doc/qbk/release_notes.qbk 2011-05-01 18:07:04 EDT (Sun, 01 May 2011)
@@ -28,6 +28,13 @@
[section TODO]
+# Add Inline Local Function `..._NAME(inline <name>)` to Advanced Topics section.
+
+# Add `..._NAME(recursive <name>)` to recursion section in Advanced Topics.
+Indicate that recursive local function cannot be optimized even when declared inline.
+
+# Modify `..._NAME()` macro to parse also `recursive inline` and `inline recursive` as recursive (no reason to give an error, just ignore the inline request and document it).
+
# *Code.* Optimize macro expansion code for C++0x, C++03, etc.
From John Bytheway:
Modified: sandbox/local/libs/local/example/profile.06.xls
==============================================================================
Binary files. No diff available.
Modified: sandbox/local/libs/local/example/profile.xls
==============================================================================
Binary files. No diff available.
Modified: sandbox/local/libs/local/example/profile_msvc-8.0_debug.png
==============================================================================
Binary files. No diff available.
Modified: sandbox/local/libs/local/example/profile_msvc-8.0_release.png
==============================================================================
Binary files. No diff available.
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk