Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r77030 - in trunk/libs/scope_exit: . doc doc/html doc/html/scope_exit example test
From: lorcaminiti_at_[hidden]
Date: 2012-02-14 20:19:47


Author: lcaminiti
Date: 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
New Revision: 77030
URL: http://svn.boost.org/trac/boost/changeset/77030

Log:
Updating ScopeExit docs, examples, and tests after supporting variadics (with full backward compatibility), this capture (this_), no capture (void), and C++11 extensions.
Added:
   trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT.html (contents, props changed)
   trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_ALL.html (contents, props changed)
   trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_CONFIG_NO_CPP11.html (contents, props changed)
   trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_END.html (contents, props changed)
   trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_TPL.html (contents, props changed)
   trunk/libs/scope_exit/doc/html/reference.html (contents, props changed)
   trunk/libs/scope_exit/example/Jamfile.v2 (contents, props changed)
   trunk/libs/scope_exit/example/scope_guard.cpp (contents, props changed)
   trunk/libs/scope_exit/example/scope_guard_seq.cpp (contents, props changed)
   trunk/libs/scope_exit/example/try_catch.cpp (contents, props changed)
   trunk/libs/scope_exit/example/try_catch_seq.cpp (contents, props changed)
   trunk/libs/scope_exit/test/native_this.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_checkpoint.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_checkpoint_all.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_checkpoint_all_seq.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_checkpoint_seq.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_lambda.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_seq.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_this.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_this_seq.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_tpl.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_tpl_seq.cpp (contents, props changed)
   trunk/libs/scope_exit/test/world_void.cpp (contents, props changed)
Removed:
   trunk/libs/scope_exit/doc/html/scope_exit/acknowledge.html
   trunk/libs/scope_exit/doc/html/scope_exit/alternatives.html
   trunk/libs/scope_exit/doc/html/scope_exit/compilers.html
   trunk/libs/scope_exit/doc/html/scope_exit/conf.html
   trunk/libs/scope_exit/doc/html/scope_exit/ref.html
   trunk/libs/scope_exit/doc/html/scope_exit/tutorial.html
   trunk/libs/scope_exit/example/world.cpp
   trunk/libs/scope_exit/test/emulation.cpp
   trunk/libs/scope_exit/test/emulation_const_error.cpp
   trunk/libs/scope_exit/test/emulation_cv_error.cpp
   trunk/libs/scope_exit/test/emulation_tpl.cpp
   trunk/libs/scope_exit/test/emulation_tu_test.cpp
Properties modified:
   trunk/libs/scope_exit/doc/ (props changed)
   trunk/libs/scope_exit/doc/html/ (props changed)
Text files modified:
   trunk/libs/scope_exit/doc/Jamfile.v2 | 39 +
   trunk/libs/scope_exit/doc/html/index.html | 114 ++++-
   trunk/libs/scope_exit/doc/scope_exit.qbk | 729 +++++++++++++++++++--------------------
   trunk/libs/scope_exit/index.html | 25
   trunk/libs/scope_exit/test/Jamfile.v2 | 79 +++-
   trunk/libs/scope_exit/test/native.cpp | 206 ++++------
   trunk/libs/scope_exit/test/native_const_error.cpp | 16
   trunk/libs/scope_exit/test/native_cv_error.cpp | 20
   trunk/libs/scope_exit/test/native_tpl.cpp | 78 +--
   trunk/libs/scope_exit/test/native_tu1.cpp | 13
   trunk/libs/scope_exit/test/native_tu2.cpp | 13
   trunk/libs/scope_exit/test/native_tu_test.cpp | 24
   trunk/libs/scope_exit/test/tu_test.hpp | 29
   13 files changed, 713 insertions(+), 672 deletions(-)

Modified: trunk/libs/scope_exit/doc/Jamfile.v2
==============================================================================
--- trunk/libs/scope_exit/doc/Jamfile.v2 (original)
+++ trunk/libs/scope_exit/doc/Jamfile.v2 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,15 +1,30 @@
 
-# Copyright 2006 Alexander Nasonov.
-# Distributed under the Boost Software License, Version 1.0. (See accompanying
-# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-using quickbook ;
-
-xml scope_exit : scope_exit.qbk ;
-boostbook standalone : scope_exit
- :
- # Path for links to Boost:
- <xsl:param>boost.root=../../../..
+# Copyright (C) 2006-2009, 2012 Alexander Nasonov
+# Copyright (C) 2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://www.boost.org/libs/scope_exit
+
+import quickbook ;
+using boostbook ;
+
+doxygen reference
+ : ../../../boost/scope_exit.hpp
+ : <reftitle>"Reference"
+ <doxygen:param>PREDEFINED="DOXYGEN"
+ <doxygen:param>QUIET=YES
+ <doxygen:param>WARN_IF_UNDOCUMENTED=NO
+ <doxygen:param>HIDE_UNDOC_MEMBERS=YES
+ <doxygen:param>HIDE_UNDOC_CLASSES=YES
+ <doxygen:param>ALIASES=" Params=\"<b>Parameters:</b> <table border="0">\" Param{2}=\"<tr><td><b><tt>\\1</tt></b></td><td>\\2</td></tr>\" EndParams=\"</table>\" Returns=\"<b>Returns:</b>\" Note=\"<b>Note:</b>\" Warning=\"<b>Warning:</b>\" See=\"<b>See:</b>\" RefSect{1}=\"\\xmlonly<link linkend='scope_exit.\\1'>\\1</link>\\endxmlonly\" RefSectId{2}=\"\\xmlonly<link linkend='scope_exit.\\1'>\\2</link>\\endxmlonly\" RefClass{1}=\"\\xmlonly<computeroutput><classname alt='\\1'>\\1</classname></computeroutput>\\endxmlonly\" RefFunc{1}=\"\\xmlonly<computeroutput><functionname alt='\\1'>\\1</functionname></computeroutput>\\endxmlonly\" RefMacro{1}=\"\\xmlonly<computeroutput><macroname alt='\\1'>\\1</macroname></computeroutput>\\endxmlonly\" "
+ ;
+
+xml qbk : scope_exit.qbk : <dependency>reference ;
+
+boostbook doc : qbk
+ : <xsl:param>boost.root=../../../..
+ <xsl:param>boost.defaults=Boost
         <format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/scope_exit/doc/html
- ;
+ ;
 

Added: trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT.html
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,97 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro BOOST_SCOPE_EXIT</title>
+<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0">
+<link rel="up" href="reference.html#header.boost.scope_exit_hpp" title="Header &lt;boost/scope_exit.hpp&gt;">
+<link rel="prev" href="reference.html" title="Reference">
+<link rel="next" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
+<td align="center">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="reference.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.scope_exit_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="BOOST_SCOPE_EXIT_TPL.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="BOOST_SCOPE_EXIT"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro BOOST_SCOPE_EXIT</span></h2>
+<p>BOOST_SCOPE_EXIT &#8212; This macro declares a scope exit. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: &lt;<a class="link" href="reference.html#header.boost.scope_exit_hpp" title="Header &lt;boost/scope_exit.hpp&gt;">boost/scope_exit.hpp</a>&gt;
+
+</span>BOOST_SCOPE_EXIT(capture_list)</pre></div>
+<div class="refsect1">
+<a name="id870482"></a><h2>Description</h2>
+<p>The scope exit declaration schedules the execution of the scope exit body at the exit of the enclosing scope:</p>
+<pre class="programlisting"> <span class="special">{</span> <span class="comment">// Some local scope.</span>
+ <span class="special">...</span>
+ <span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(</span><span class="identifier">capture_list</span><span class="special">)</span> <span class="special">{</span>
+ <span class="special">...</span> <span class="comment">// Body code.</span>
+ <span class="special">}</span> <span class="identifier">BOOST_SCOPE_EXIT_END</span>
+ <span class="special">...</span>
+ <span class="special">}</span>
+</pre>
+<p>The enclosing scope must be local. If multiple scope exits are declared within the same enclosing scope, the scope exit bodies are executed in the reversed order of their declarations. Note how the end of the scope exit body must be marked by <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">BOOST_SCOPE_EXIT_END</a></code> (or by a <code class="computeroutput">;</code> but only on C++11).</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">capture_list</code></strong></span></td>
+<td>On compilers that support variadic macros, the capture list syntax is defined by the following grammar: <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"> <span class="identifier">capture_list</span><span class="special">:</span>
+ <span class="keyword">void</span> <span class="special">|</span> <span class="identifier">capture_tuple</span> <span class="special">|</span> <span class="identifier">capture_sequence</span>
+ <span class="identifier">capture_tuple</span><span class="special">:</span>
+ <span class="identifier">capture</span><span class="special">,</span> <span class="identifier">capture</span><span class="special">,</span> <span class="special">...</span>
+ <span class="identifier">capture_sequence</span><span class="special">:</span>
+ <span class="special">(</span><span class="identifier">capture</span><span class="special">)</span> <span class="special">(</span><span class="identifier">capture</span><span class="special">)</span> <span class="special">...</span>
+ <span class="identifier">capture</span><span class="special">:</span>
+ <span class="special">[</span><span class="special">&amp;</span><span class="special">]</span><span class="identifier">variable</span> <span class="special">|</span> <span class="identifier">this_</span>
+</pre> On compilers that do not support variadic macros, <code class="computeroutput">capture_tuple</code> cannot be used: <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"> <span class="identifier">capture_list</span><span class="special">:</span>
+ <span class="keyword">void</span> <span class="special">|</span> <span class="identifier">capture_sequence</span>
+</pre> Finally, on C++11 compilers <code class="computeroutput">this</code> can be used instead of <code class="computeroutput">this_</code>: <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"> <span class="identifier">capture</span><span class="special">:</span>
+ <span class="special">[</span><span class="special">&amp;</span><span class="special">]</span><span class="identifier">variable</span> <span class="special">|</span> <span class="identifier">this_</span> <span class="special">|</span> <span class="keyword">this</span>
+</pre>Lexical conventions: <code class="computeroutput">token1 | token2</code> means either <code class="computeroutput">token1</code> or <code class="computeroutput">token2</code>; <code class="computeroutput">[token]</code> means either <code class="computeroutput">token</code> or nothing; <code class="computeroutput">{expression}</code> means the token resulting from the expression. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>Note that on compilers with variadic macro support (most of moder compliers and all C++11 compilers), the capture list can be specified as a comma-separated list of tokens. On all compilers, the same macro <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code> also allows to specify the capture list as a Boost.Preprocessor sequence of tokens (for supporting compilers without variadic macros and for backward compatibility with older versions of this library).</p>
+<p>The name <code class="computeroutput">variable</code> of each captured variable must be a valid name in the enclosing scope and it must appear exactly once in the capture list. If a capture starts with the ampersand sign <code class="computeroutput">&amp;</code>, the corresponding variable will be available by reference within the scope exit body; otherwise, a copy of the variable will be made at the point of the scope exit declaration and that copy will be available inside the scope exit body (in this case, the variable's type must be <code class="computeroutput">CopyConstructible</code>).</p>
+<p>From within a member function, the object <code class="computeroutput">this</code> can be captured using the special symbol <code class="computeroutput">this_</code> in both the capture list and the scope exit body (using <code class="computeroutput">this</code> instead of <code class="computeroutput">this_</code> in the scope exit body leads to undefined behaviour). On C++11 it is possible (but not required) to use <code class="computeroutput">this</code> instead of <code class="computeroutput">this_</code>.</p>
+<p>It is possible to capture no variable by specifying the capture list as <code class="computeroutput">void</code> (regardless of variadic macro support).</p>
+<p>Only variables listed in the capture list, static variables, <code class="computeroutput">extern</code> variables, global variables, functions, and enumerations from the enclosing scope can be used inside the scope exit body.</p>
+<p>On various GCC versions the special macro <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">BOOST_SCOPE_EXIT_TPL</a></code> must be used instead of <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code> within templates (this is not necessary on C++11).</p>
+<p>On C++11, it is possible capture all variables in scope without listing their names using the macro <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">BOOST_SCOPE_EXIT_ALL</a></code>.</p>
+<p><span class="bold"><strong>Warning:</strong></span> The implementation executes the scope exit body within a destructor thus the scope exit body must never throw in order to comply with STL exception safety requirements.</p>
+<p><span class="bold"><strong>Note:</strong></span> The implementation uses Boost.Typeof to automatically deduce the types of the captured variables. In order to compile code in type-of emulation mode, Boost.Typeof must be properly configured (see the <a class="link" href="scope_exit/Getting_Started.html" title="Getting Started"> Getting Started</a> section).</p>
+<p><span class="bold"><strong>See:</strong></span> <a class="link" href="scope_exit/Tutorial.html" title="Tutorial">Tutorial</a> section, <a class="link" href="scope_exit/Getting_Started.html" title="Getting Started"> Getting Started</a> section, <a class="link" href="scope_exit/No_Variadic_Macros.html" title="Annex: No Variadic Macros"> No Variadic Macros</a> section, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">BOOST_SCOPE_EXIT_TPL</a></code>, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">BOOST_SCOPE_EXIT_ALL</a></code>, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">BOOST_SCOPE_EXIT_END</a></code>. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Alexander Nasonov, Lorenzo Caminiti<p>
+ Distributed under 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>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="reference.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.scope_exit_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="BOOST_SCOPE_EXIT_TPL.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Added: trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_ALL.html
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_ALL.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,89 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro BOOST_SCOPE_EXIT_ALL</title>
+<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0">
+<link rel="up" href="reference.html#header.boost.scope_exit_hpp" title="Header &lt;boost/scope_exit.hpp&gt;">
+<link rel="prev" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">
+<link rel="next" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
+<td align="center">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="BOOST_SCOPE_EXIT_TPL.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.scope_exit_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="BOOST_SCOPE_EXIT_END.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="BOOST_SCOPE_EXIT_ALL"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro BOOST_SCOPE_EXIT_ALL</span></h2>
+<p>BOOST_SCOPE_EXIT_ALL &#8212; This macro declares a scope exit that captures all variables in scope (C++11 only). </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: &lt;<a class="link" href="reference.html#header.boost.scope_exit_hpp" title="Header &lt;boost/scope_exit.hpp&gt;">boost/scope_exit.hpp</a>&gt;
+
+</span>BOOST_SCOPE_EXIT_ALL(capture_list)</pre></div>
+<div class="refsect1">
+<a name="id871573"></a><h2>Description</h2>
+<p>This macro accepts a capture list starting with either <code class="computeroutput">&amp;</code> or <code class="computeroutput">=</code> to capture all variables in scope by reference or value respectively (following the same syntax of C++11 lambdas). A part from that, this macro works like <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code> (see <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code> for more information).</p>
+<pre class="programlisting"> <span class="special">{</span> <span class="comment">// Some local scope.</span>
+ <span class="special">...</span>
+ <span class="identifier">BOOST_SCOPE_EXIT_ALL</span><span class="special">(</span><span class="identifier">capture_list</span><span class="special">)</span> <span class="special">{</span> <span class="comment">// C++11 only.</span>
+ <span class="special">...</span> <span class="comment">// Body code.</span>
+ <span class="special">}</span><span class="special">;</span> <span class="comment">// Use `;` instead of `BOOST_SCOPE_EXIT_END` (C++11 only).</span>
+ <span class="special">...</span>
+ <span class="special">}</span>
+</pre>
+<p><span class="bold"><strong>Warning:</strong></span> This macro is only available on C++11 compilers. It is not defined on non-C++11 compilers so its use on non-C++11 compilers will generate a compiler error.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">capture_list</code></strong></span></td>
+<td>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">capture_list</span><span class="special">:</span>
+ <span class="identifier">capture_tuple</span> <span class="special">|</span> <span class="identifier">capture_sequence</span>
+<span class="identifier">capture_tuple</span><span class="special">:</span>
+ <span class="special">{</span><span class="special">&amp;</span> <span class="special">|</span> <span class="special">=</span><span class="special">}</span> <span class="special">[</span><span class="special">,</span> <span class="identifier">capture</span><span class="special">,</span> <span class="identifier">capture</span><span class="special">,</span> <span class="special">...</span><span class="special">]</span>
+<span class="identifier">capture_sequence</span><span class="special">:</span>
+ <span class="special">{</span><span class="special">(</span><span class="special">&amp;</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="special">=</span><span class="special">)</span><span class="special">}</span> <span class="special">[</span><span class="special">(</span><span class="identifier">capture</span><span class="special">)</span> <span class="special">(</span><span class="identifier">capture</span><span class="special">)</span> <span class="special">...</span><span class="special">]</span>
+<span class="identifier">capture</span><span class="special">:</span>
+ <span class="special">[</span><span class="special">&amp;</span><span class="special">]</span><span class="identifier">variable</span> <span class="special">|</span> <span class="identifier">this_</span> <span class="special">|</span> <span class="keyword">this</span>
+</pre>Lexical conventions: <code class="computeroutput">token1 | token2</code> means either <code class="computeroutput">token1</code> or <code class="computeroutput">token2</code>; <code class="computeroutput">[token]</code> means either <code class="computeroutput">token</code> or nothing; <code class="computeroutput">{expression}</code> means the token resulting from the expression. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>For this macro, the capture list must always contain at least the leading <code class="computeroutput">&amp;</code> or <code class="computeroutput">=</code> so it can never be <code class="computeroutput">void</code>.</p>
+<p>Note that on compilers with variadic macro support (which should be all C++11 compilers), the capture list can be specified as a comma-separated list. On all compilers, the same macro <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">BOOST_SCOPE_EXIT_ALL</a></code> also allows to specify the capture list as a Boost.Preprocessor sequence (to allow to use a syntax consistent with the one of <code class="computeroutput">BOOST_SCOPE_EXIT</code> when used on compilers without variadic macro support). The scope exit body declared by this macro can be terminated equivalently by either a semi-column <code class="computeroutput">;</code> or by the macro <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">BOOST_SCOPE_EXIT_END</a></code>. The <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">BOOST_SCOPE_EXIT_ALL</a></code> macro
 is only available on C++11 where the terminating semi-column <code class="computeroutput">;</code> can always be used without worrying about portability with C++03 (see <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">BOOST_SCOPE_EXIT_END</a></code> for more information). Similarly, this macro can always use <code class="computeroutput">this</code> instead of <code class="computeroutput">this_</code> to capture the enclosing object without worrying about portability with C++03 because this macro is only available on C++11 compilers.</p>
+<p><span class="bold"><strong>Note:</strong></span> In summary, this macro can take advantage of all syntax improvements allowed by C++11 but it optionally supports the same syntax required by C++03 so programmers can always program both <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">BOOST_SCOPE_EXIT_ALL</a></code> and <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code> using the same syntax and for all compilers if they wish to do so.</p>
+<p><span class="bold"><strong>Warning:</strong></span> The implementation executes the scope exit body within a destructor thus the scope exit body must never throw in order to comply with STL exception safety requirements.</p>
+<p><span class="bold"><strong>See:</strong></span> <a class="link" href="scope_exit/Tutorial.html" title="Tutorial">Tutorial</a> section, <a class="link" href="scope_exit/No_Variadic_Macros.html" title="Annex: No Variadic Macros"> No Variadic Macros</a> section, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code>, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">BOOST_SCOPE_EXIT_END</a></code>. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Alexander Nasonov, Lorenzo Caminiti<p>
+ Distributed under 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>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="BOOST_SCOPE_EXIT_TPL.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.scope_exit_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="BOOST_SCOPE_EXIT_END.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Added: trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_CONFIG_NO_CPP11.html
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_CONFIG_NO_CPP11.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro BOOST_SCOPE_EXIT_CONFIG_NO_CPP11</title>
+<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0">
+<link rel="up" href="reference.html#header.boost.scope_exit_hpp" title="Header &lt;boost/scope_exit.hpp&gt;">
+<link rel="prev" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">
+<link rel="next" href="scope_exit/Alternatives.html" title="Annex: Alternatives">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
+<td align="center">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="BOOST_SCOPE_EXIT_END.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.scope_exit_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="scope_exit/Alternatives.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="BOOST_SCOPE_EXIT_CONFIG_NO_CPP11"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro BOOST_SCOPE_EXIT_CONFIG_NO_CPP11</span></h2>
+<p>BOOST_SCOPE_EXIT_CONFIG_NO_CPP11 &#8212; Force not to use C++11 features. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: &lt;<a class="link" href="reference.html#header.boost.scope_exit_hpp" title="Header &lt;boost/scope_exit.hpp&gt;">boost/scope_exit.hpp</a>&gt;
+
+</span>BOOST_SCOPE_EXIT_CONFIG_NO_CPP11</pre></div>
+<div class="refsect1">
+<a name="id872336"></a><h2>Description</h2>
+<p>If programmers define this configuration macro, C++11 features will not be used even on C++11 compilers (only C++03 features will be used). By default this macro is not defined.</p>
+<p><span class="bold"><strong>Note:</strong></span> This macro does not disable comma-separated capture lists on compilers that support variadic macros (programmers can simply use Boost.Preprocessor sequences if they do not wish to use comma-separated capture lists).</p>
+<p><span class="bold"><strong>See:</strong></span> <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code>, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">BOOST_SCOPE_EXIT_ALL</a></code>, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">BOOST_SCOPE_EXIT_END</a></code>. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Alexander Nasonov, Lorenzo Caminiti<p>
+ Distributed under 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>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="BOOST_SCOPE_EXIT_END.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.scope_exit_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="scope_exit/Alternatives.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Added: trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_END.html
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_END.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,72 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro BOOST_SCOPE_EXIT_END</title>
+<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0">
+<link rel="up" href="reference.html#header.boost.scope_exit_hpp" title="Header &lt;boost/scope_exit.hpp&gt;">
+<link rel="prev" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">
+<link rel="next" href="BOOST_SCOPE_EXIT_CONFIG_NO_CPP11.html" title="Macro BOOST_SCOPE_EXIT_CONFIG_NO_CPP11">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
+<td align="center">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="BOOST_SCOPE_EXIT_ALL.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.scope_exit_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="BOOST_SCOPE_EXIT_CONFIG_NO_CPP11.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="BOOST_SCOPE_EXIT_END"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro BOOST_SCOPE_EXIT_END</span></h2>
+<p>BOOST_SCOPE_EXIT_END &#8212; This macro marks the end of a scope exit body. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: &lt;<a class="link" href="reference.html#header.boost.scope_exit_hpp" title="Header &lt;boost/scope_exit.hpp&gt;">boost/scope_exit.hpp</a>&gt;
+
+</span>BOOST_SCOPE_EXIT_END</pre></div>
+<div class="refsect1">
+<a name="id872111"></a><h2>Description</h2>
+<p>This macro must follow the closing curly bracket <code class="computeroutput">}</code> that ends the scope exit body:</p>
+<pre class="programlisting"> <span class="special">{</span> <span class="comment">// Some local scope.</span>
+ <span class="special">...</span>
+ <span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(</span><span class="identifier">capture_list</span><span class="special">)</span> <span class="special">{</span>
+ <span class="special">...</span> <span class="comment">// Body code.</span>
+ <span class="special">}</span> <span class="identifier">BOOST_SCOPE_EXIT_END</span>
+ <span class="special">...</span>
+ <span class="special">}</span>
+</pre>
+<p>On C++11, this macro is not necessary and it can be replaced by a semi-column <code class="computeroutput">;</code> : </p>
+<pre class="programlisting"> <span class="special">{</span> <span class="comment">// Some local scope.</span>
+ <span class="special">...</span>
+ <span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(</span><span class="identifier">capture_list</span><span class="special">)</span> <span class="special">{</span>
+ <span class="special">...</span> <span class="comment">// Body code.</span>
+ <span class="special">}</span><span class="special">;</span> <span class="comment">// C++11 only.</span>
+ <span class="special">...</span>
+ <span class="special">}</span>
+</pre>
+<p> However, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">BOOST_SCOPE_EXIT_END</a></code> is still provided on C++11 so to write code that is portable between C++03 and C++11 compilers.</p>
+<p><span class="bold"><strong>See:</strong></span> <a class="link" href="scope_exit/Tutorial.html" title="Tutorial">Tutorial</a> section, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code>, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">BOOST_SCOPE_EXIT_TPL</a></code>, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">BOOST_SCOPE_EXIT_ALL</a></code>. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Alexander Nasonov, Lorenzo Caminiti<p>
+ Distributed under 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>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="BOOST_SCOPE_EXIT_ALL.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.scope_exit_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="BOOST_SCOPE_EXIT_CONFIG_NO_CPP11.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Added: trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_TPL.html
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/doc/html/BOOST_SCOPE_EXIT_TPL.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,80 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro BOOST_SCOPE_EXIT_TPL</title>
+<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0">
+<link rel="up" href="reference.html#header.boost.scope_exit_hpp" title="Header &lt;boost/scope_exit.hpp&gt;">
+<link rel="prev" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">
+<link rel="next" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
+<td align="center">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="BOOST_SCOPE_EXIT.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.scope_exit_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="BOOST_SCOPE_EXIT_ALL.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="BOOST_SCOPE_EXIT_TPL"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro BOOST_SCOPE_EXIT_TPL</span></h2>
+<p>BOOST_SCOPE_EXIT_TPL &#8212; This macro is a workaround to declare a scope exit for various versions of GCC. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: &lt;<a class="link" href="reference.html#header.boost.scope_exit_hpp" title="Header &lt;boost/scope_exit.hpp&gt;">boost/scope_exit.hpp</a>&gt;
+
+</span>BOOST_SCOPE_EXIT_TPL(capture_list)</pre></div>
+<div class="refsect1">
+<a name="id871040"></a><h2>Description</h2>
+<p>Various versions of the GCC compiler do not compile <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code> inside function templates. As a workaround, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">BOOST_SCOPE_EXIT_TPL</a></code> should be used instead of <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code> in these cases:</p>
+<pre class="programlisting"> <span class="special">{</span> <span class="comment">// Some local scope.</span>
+ <span class="special">...</span>
+ <span class="identifier">BOOST_SCOPE_EXIT_TPL</span><span class="special">(</span><span class="identifier">capture_list</span><span class="special">)</span> <span class="special">{</span>
+ <span class="special">...</span> <span class="comment">// Body code.</span>
+ <span class="special">}</span> <span class="identifier">BOOST_SCOPE_EXIT_END</span>
+ <span class="special">...</span>
+ <span class="special">}</span>
+</pre>
+<p>The syntax of <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">BOOST_SCOPE_EXIT_TPL</a></code> is the exact same as the one of <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code> (see <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code> for more information).</p>
+<p>On C++11, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">BOOST_SCOPE_EXIT_TPL</a></code> is not needed because <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code> always compiles on GCC versions that support C++11 (that is also why there is no need for a <code class="computeroutput">BOOST_SCOPE_EXIT_ALL_TPL</code> macro given that <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">BOOST_SCOPE_EXIT_ALL</a></code> is only available for C++11 compilers on which it always compiles correctly). However, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">BOOST_SCOPE_EXIT_TPL</a></code> is still provided on C++11 so to write code that is portable between C++03 and C++11 compilers.</p>
+<p><span class="bold"><strong>Note:</strong></span> The problem boils down to the following code (see also GCC bug 37920): </p>
+<pre class="programlisting"> <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
+ <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+ <span class="keyword">struct</span> <span class="identifier">local</span> <span class="special">{</span>
+ <span class="keyword">typedef</span> <span class="identifier">__typeof__</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">typeof_i</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">__typeof__</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="identifier">typeof_x</span><span class="special">;</span>
+ <span class="special">}</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">local</span><span class="special">::</span><span class="identifier">typeof_i</span> <span class="identifier">i_type</span><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">local</span><span class="special">::</span><span class="identifier">typeof_x</span> <span class="identifier">x_type</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="keyword">void</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">f</span><span class="special">(</span><span class="number">0</span><span class="special">)</span><span class="special">;</span> <span class="special">}</span>
+</pre>
+<p> This can be fixed by adding <code class="computeroutput">typename</code> in front of <code class="computeroutput">local::typeof_i</code> and <code class="computeroutput">local::typeof_x</code> (which is the approach followed by the implementation of <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">BOOST_SCOPE_EXIT_TPL</a></code>).</p>
+<p><span class="bold"><strong>Note:</strong></span> Although <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">BOOST_SCOPE_EXIT_TPL</a></code> has the same suffix as <code class="computeroutput">BOOST_TYPEOF_TPL</code>, it does not follow the Boost.Typeof convention.</p>
+<p><span class="bold"><strong>See:</strong></span> <a class="link" href="scope_exit/Tutorial.html" title="Tutorial">Tutorial</a> section, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a></code>, <code class="computeroutput"><a class="link" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">BOOST_SCOPE_EXIT_END</a></code>. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Alexander Nasonov, Lorenzo Caminiti<p>
+ Distributed under 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>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="BOOST_SCOPE_EXIT.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.scope_exit_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="BOOST_SCOPE_EXIT_ALL.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Modified: trunk/libs/scope_exit/doc/html/index.html
==============================================================================
--- trunk/libs/scope_exit/doc/html/index.html (original)
+++ trunk/libs/scope_exit/doc/html/index.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,11 +1,11 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
-<title>Chapter&#160;1.&#160;Boost.ScopeExit</title>
+<title>Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0</title>
 <link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
-<link rel="home" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="next" href="scope_exit/tutorial.html" title="Tutorial">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0">
+<link rel="next" href="scope_exit/Getting_Started.html" title="Getting Started">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table cellpadding="2" width="100%"><tr>
@@ -17,61 +17,115 @@
 <td align="center">More</td>
 </tr></table>
 <hr>
-<div class="spirit-nav"><a accesskey="n" href="scope_exit/tutorial.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
+<div class="spirit-nav"><a accesskey="n" href="scope_exit/Getting_Started.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
 <div class="chapter">
 <div class="titlepage"><div>
 <div><h2 class="title">
-<a name="scope_exit"></a>Chapter&#160;1.&#160;Boost.ScopeExit</h2></div>
+<a name="scope_exit"></a>Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0</h2></div>
 <div><div class="author"><h3 class="author">
 <span class="firstname">Alexander</span> <span class="surname">Nasonov</span>
 </h3></div></div>
-<div><p class="copyright">Copyright &#169; 2006 -2009 Alexander Nasonov</p></div>
+<div><div class="author"><h3 class="author">
+<span class="firstname">Lorenzo</span> <span class="surname">Caminiti <code class="email">&lt;<a class="email" href="mailto:lorcaminiti_at_[hidden]">lorcaminiti_at_[hidden]</a>&gt;</code></span>
+</h3></div></div>
+<div><p class="copyright">Copyright &#169; 2006-2012 Alexander Nasonov, Lorenzo Caminiti</p></div>
 <div><div class="legalnotice">
-<a name="id759689"></a><p>
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at &lt;ulink url="http://www.boost.org/LICENSE_1_0.txt"&gt;
- http://www.boost.org/LICENSE_1_0.txt &lt;/ulink&gt;)
+<a name="scope_exit.legal"></a><p>
+ Distributed under 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>
 </div></div>
 </div></div>
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl>
-<dt><span class="section"> Introduction</span></dt>
-<dt><span class="section"> Tutorial</span></dt>
-<dt><span class="section"> Alternatives</span></dt>
-<dt><span class="section"> Supported Compilers</span></dt>
-<dt><span class="section"> Configuration</span></dt>
-<dt><span class="section"> Reference</span></dt>
-<dt><span class="section"> Acknowledge</span></dt>
+<dt><span class="section">Introduction</span></dt>
+<dt><span class="section">Getting Started</span></dt>
+<dd><dl>
+<dt><span class="section"><a href="scope_exit/Getting_Started.html#scope_exit.Getting_Started.compilers_and_platforms">Compilers
+ and Platforms</a></span></dt>
+<dt><span class="section">Installation</span></dt>
+</dl></dd>
+<dt><span class="section">Tutorial</span></dt>
+<dd><dl>
+<dt><span class="section">Capturing Variables</span></dt>
+<dt><span class="section"><a href="scope_exit/Tutorial.html#scope_exit.Tutorial.capturing_the_object__this_">Capturing
+ The Object <code class="computeroutput"><span class="keyword">this</span></code></a></span></dt>
+<dt><span class="section"><a href="scope_exit/Tutorial.html#scope_exit.Tutorial.capturing_no_variable">Capturing
+ No Variable</a></span></dt>
+<dt><span class="section"><a href="scope_exit/Tutorial.html#scope_exit.Tutorial.capturing_all_variables__c__11_only_">Capturing
+ All Variables (C++11 Only)</a></span></dt>
+<dt><span class="section"><a href="scope_exit/Tutorial.html#scope_exit.Tutorial.gcc_template_workaround">GCC Template
+ Workaround</a></span></dt>
+</dl></dd>
+<dt><span class="section">Reference</span></dt>
+<dd><dl><dt><span class="section">Header <boost/scope_exit.hpp></span></dt></dl></dd>
+<dt><span class="section">Annex: Alternatives</span></dt>
+<dt><span class="section">Annex: No Variadic Macros</span></dt>
+<dt><span class="section">Acknowledgements</span></dt>
 </dl>
 </div>
-<div class="section">
+<p>
+ This library allows to execute arbitrary code when the enclosing scope exits.
+ </p>
+<div class="section scope_exit_introduction">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="scope_exit.intro"></a> Introduction</h2></div></div></div>
+<a name="scope_exit.introduction"></a><a class="link" href="index.html#scope_exit.introduction" title="Introduction">Introduction</a>
+</h2></div></div></div>
 <p>
- Nowadays, every C++ developer is familiar with RAII
+ Nowadays, every C++ developer is familiar with the Resource Acquisition Is
+ Initialization (RAII)
       technique. It binds resource acquisition and release to initialization and
       destruction of a variable that holds the resource. But there are times when
- writing a special class for such variable is not worth the effort.
+ writing a special class for such variable is not worth the effort. This is
+ when the <a class="link" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0">Boost.ScopeExit</a> comes into play.
     </p>
 <p>
- This is when <a class="link" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> macro comes into play.
- You put resource acquisition directly in your code and next to it you write
- a code that releases the resource.
+ Programmers can put resource acquisition directly in their code and next to
+ it, they can write code that releases the resource using this library. For
+ example: <sup>[<a name="scope_exit.introduction.f0" href="#ftn.scope_exit.introduction.f0" class="footnote">1</a>]</sup>
     </p>
 <p>
- Read <a class="link" href="scope_exit/tutorial.html" title="Tutorial">Tutorial</a> to find out how to
- write programs with <a class="link" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> or jump straight
- to the <a class="link" href="scope_exit/ref.html" title="Reference">Reference</a> section.
+</p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">world</span><span class="special">::</span><span class="identifier">add_person</span><span class="special">(</span><span class="identifier">person</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">a_person</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">bool</span> <span class="identifier">commit</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
+
+ <span class="identifier">persons_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">a_person</span><span class="special">);</span> <span class="comment">// (1) direct action</span>
+ <span class="comment">// Following block is executed when the enclosing scope exits.</span>
+ <span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(&amp;</span><span class="identifier">commit</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">persons_</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(!</span><span class="identifier">commit</span><span class="special">)</span> <span class="identifier">persons_</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">();</span> <span class="comment">// (2) rollback action</span>
+ <span class="special">}</span> <span class="identifier">BOOST_SCOPE_EXIT_END</span>
+
+ <span class="comment">// ... // (3) other operations</span>
+
+ <span class="identifier">commit</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> <span class="comment">// (4) disable rollback actions</span>
+<span class="special">}</span>
+</pre>
+<p>
     </p>
+<p>
+ Read the <a class="link" href="scope_exit/Tutorial.html" title="Tutorial">Tutorial</a> section to find
+ out how to write programs with <a class="link" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0">Boost.ScopeExit</a>
+ or jump to the Reference section.
+ </p>
+</div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.scope_exit.introduction.f0" href="#scope_exit.introduction.f0" class="para">1</a>] </sup>
+ Older versions of this library used a Boost.Preprocessor
+ sequence to specify the list of captured variables. While maintaining full
+ backward compatibility, it is now possible to specify the captured variables
+ also as a comma-separated list (which is the preferred syntax). See the
+ <a class="link" href="scope_exit/No_Variadic_Macros.html" title="Annex: No Variadic Macros">No Variadic Macros</a> section
+ for more details.
+ </p></div>
 </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: July 08, 2010 at 22:36:27 GMT</small></p></td>
+<td align="left"><p><small>Last revised: February 14, 2012 at 16:13:19 GMT</small></p></td>
 <td align="right"><div class="copyright-footer"></div></td>
 </tr></table>
 <hr>
-<div class="spirit-nav"><a accesskey="n" href="scope_exit/tutorial.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
+<div class="spirit-nav"><a accesskey="n" href="scope_exit/Getting_Started.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
 </body>
 </html>

Added: trunk/libs/scope_exit/doc/html/reference.html
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/doc/html/reference.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Reference</title>
+<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0">
+<link rel="up" href="index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit 1.1.0">
+<link rel="prev" href="scope_exit/Tutorial.html" title="Tutorial">
+<link rel="next" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
+<td align="center">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="scope_exit/Tutorial.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="index.html"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="BOOST_SCOPE_EXIT.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section reference">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="reference"></a>Reference</h2></div></div></div>
+<div class="toc"><dl><dt><span class="section">Header <boost/scope_exit.hpp></span></dt></dl></div>
+<div class="section header_boost_scope_exit_hpp">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.boost.scope_exit_hpp"></a>Header &lt;boost/scope_exit.hpp&gt;</h3></div></div></div>
+<p>Scope exits allow to execute arbitrary code when the enclosing scope exits. </p>
+<pre class="synopsis">
+
+<a class="link" href="BOOST_SCOPE_EXIT.html" title="Macro BOOST_SCOPE_EXIT">BOOST_SCOPE_EXIT</a>(capture_list)
+<a class="link" href="BOOST_SCOPE_EXIT_TPL.html" title="Macro BOOST_SCOPE_EXIT_TPL">BOOST_SCOPE_EXIT_TPL</a>(capture_list)
+<a class="link" href="BOOST_SCOPE_EXIT_ALL.html" title="Macro BOOST_SCOPE_EXIT_ALL">BOOST_SCOPE_EXIT_ALL</a>(capture_list)
+<a class="link" href="BOOST_SCOPE_EXIT_END.html" title="Macro BOOST_SCOPE_EXIT_END">BOOST_SCOPE_EXIT_END</a>
+<a class="link" href="BOOST_SCOPE_EXIT_CONFIG_NO_CPP11.html" title="Macro BOOST_SCOPE_EXIT_CONFIG_NO_CPP11">BOOST_SCOPE_EXIT_CONFIG_NO_CPP11</a></pre>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Alexander Nasonov, Lorenzo Caminiti<p>
+ Distributed under 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>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="scope_exit/Tutorial.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="index.html"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="BOOST_SCOPE_EXIT.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>

Deleted: trunk/libs/scope_exit/doc/html/scope_exit/acknowledge.html
==============================================================================
--- trunk/libs/scope_exit/doc/html/scope_exit/acknowledge.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,66 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
-<title>Acknowledge</title>
-<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
-<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="prev" href="ref.html" title="Reference">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><tr>
-<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
-<td align="center">Home</td>
-<td align="center">Libraries</td>
-<td align="center">People</td>
-<td align="center">FAQ</td>
-<td align="center">More</td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="ref.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="scope_exit.acknowledge"></a> Acknowledge</h2></div></div></div>
-<p>
- (in chronological order)
- </p>
-<p>
- Maxim Yegorushkin for sending me a code where he used a local struct to clean
- up resources.
- </p>
-<p>
- Andrei Alexandrescu for pointing me to scope(exit)
- construct of the D
- programming language.
- </p>
-<p>
- Pavel Vozenilek and Maxim Yanchenko for reviews of early drafts of the library.
- </p>
-<p>
- Steven Watanabe for his valuable ideas.
- </p>
-<p>
- Jody Hagins for good comments that helped to significantly improve the documentation.
- </p>
-<p>
- Richard Webb for testing the library on MSVC compiler.
- </p>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2006 -2009 Alexander Nasonov<p>
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at &lt;ulink url="http://www.boost.org/LICENSE_1_0.txt"&gt;
- http://www.boost.org/LICENSE_1_0.txt &lt;/ulink&gt;)
- </p>
-</div></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="ref.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a>
-</div>
-</body>
-</html>

Deleted: trunk/libs/scope_exit/doc/html/scope_exit/alternatives.html
==============================================================================
--- trunk/libs/scope_exit/doc/html/scope_exit/alternatives.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,303 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
-<title>Alternatives</title>
-<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
-<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="prev" href="tutorial.html" title="Tutorial">
-<link rel="next" href="compilers.html" title="Supported Compilers">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><tr>
-<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
-<td align="center">Home</td>
-<td align="center">Libraries</td>
-<td align="center">People</td>
-<td align="center">FAQ</td>
-<td align="center">More</td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="tutorial.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="compilers.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="scope_exit.alternatives"></a> Alternatives</h2></div></div></div>
-<a name="alternatives.try_catch"></a><h4>
-<a name="id761016"></a>
- try-catch
- </h4>
-<p>
- This is an example of using a badly designed <code class="computeroutput"><span class="identifier">File</span></code>
- class. An instance of <code class="computeroutput"><span class="identifier">File</span></code>
- doesn't close a file in a destructor, a programmer is expected to call the
- <code class="computeroutput"><span class="identifier">close</span></code> member function explicitly.
- </p>
-<pre class="programlisting"><span class="identifier">File</span> <span class="identifier">passwd</span><span class="special">;</span>
-<span class="keyword">try</span> <span class="special">{</span>
- <span class="identifier">passwd</span><span class="special">.</span><span class="identifier">open</span><span class="special">(</span><span class="string">"/etc/passwd"</span><span class="special">);</span>
- <span class="comment">// ...
-</span> <span class="identifier">passwd</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span>
-<span class="special">}</span>
-<span class="keyword">catch</span><span class="special">(...)</span> <span class="special">{</span>
- <span class="identifier">log</span><span class="special">(</span><span class="string">"could not get user info"</span><span class="special">);</span>
- <span class="keyword">if</span><span class="special">(</span><span class="identifier">passwd</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">())</span>
- <span class="identifier">passwd</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span>
- <span class="keyword">throw</span><span class="special">;</span>
-<span class="special">}</span>
-</pre>
-<p>
- Note the following:
- </p>
-<div class="itemizedlist"><ul class="itemizedlist" type="disc">
-<li class="listitem">
- the <code class="computeroutput"><span class="identifier">passwd</span></code> object is defined
- outside of the <code class="computeroutput"><span class="keyword">try</span></code> block because
- this object is required inside the <code class="computeroutput"><span class="keyword">catch</span></code>
- block to close the file,
- </li>
-<li class="listitem">
- the <code class="computeroutput"><span class="identifier">passwd</span></code> object is not
- fully constructed until after the <code class="computeroutput"><span class="identifier">open</span></code>
- member function returns, and
- </li>
-<li class="listitem">
- if opening throws, the <code class="computeroutput"><span class="identifier">passwd</span><span class="special">.</span><span class="identifier">close</span><span class="special">()</span></code> should not be called, hence the call
- to <code class="computeroutput"><span class="identifier">passwd</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code>.
- </li>
-</ul></div>
-<p>
- <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> doesn't have any of these problems:
- </p>
-<pre class="programlisting"><span class="keyword">try</span> <span class="special">{</span>
- <span class="identifier">File</span> <span class="identifier">passwd</span><span class="special">(</span><span class="string">"/etc/passwd"</span><span class="special">);</span>
- <span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(</span> <span class="special">(&amp;</span><span class="identifier">passwd</span><span class="special">)</span> <span class="special">)</span> <span class="special">{</span>
- <span class="identifier">passwd</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span>
- <span class="special">}</span> <span class="identifier">BOOST_SCOPE_EXIT_END</span>
- <span class="comment">// ...
-</span><span class="special">}</span>
-<span class="keyword">catch</span><span class="special">(...)</span> <span class="special">{</span>
- <span class="identifier">log</span><span class="special">(</span><span class="string">"could not get user info"</span><span class="special">);</span>
- <span class="keyword">throw</span><span class="special">;</span>
-<span class="special">}</span>
-</pre>
-<a name="alternatives.raii"></a><h4>
-<a name="id761495"></a>
- RAII
- </h4>
-<p>
- RAII
- is absolutely perfect for the <code class="computeroutput"><span class="identifier">File</span></code>
- class introduced above. Use of a properly designed <code class="computeroutput"><span class="identifier">File</span></code>
- class would look like:
- </p>
-<pre class="programlisting"><span class="keyword">try</span> <span class="special">{</span>
- <span class="identifier">File</span> <span class="identifier">passwd</span><span class="special">(</span><span class="string">"/etc/passwd"</span><span class="special">);</span>
- <span class="comment">// ...
-</span><span class="special">}</span>
-<span class="keyword">catch</span><span class="special">(...)</span> <span class="special">{</span>
- <span class="identifier">log</span><span class="special">(</span><span class="string">"could not get user info"</span><span class="special">);</span>
- <span class="keyword">throw</span><span class="special">;</span>
-<span class="special">}</span>
-</pre>
-<p>
- However, using RAII
- to build up a <a href="http://www.research.att.com/~bs/glossary.html#Gstrong-guarantee" target="_top">strong
- guarantee</a> could introduce a lot of non-reusable RAII
- types. For example:
- </p>
-<pre class="programlisting"><span class="identifier">m_persons</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">person</span><span class="special">);</span>
-<span class="identifier">pop_back_if_not_commit</span> <span class="identifier">pop_back_if_not_commit_guard</span><span class="special">(</span><span class="identifier">commit</span><span class="special">,</span> <span class="identifier">m_persons</span><span class="special">);</span>
-</pre>
-<p>
- The <code class="computeroutput"><span class="identifier">pop_back_if_not_commit</span></code>
- class is either defined out of the scope or as a local class:
- </p>
-<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">pop_back_if_not_commit</span> <span class="special">{</span>
- <span class="keyword">bool</span> <span class="identifier">m_commit</span><span class="special">;</span>
- <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">Person</span><span class="special">&gt;&amp;</span> <span class="identifier">m_vec</span><span class="special">;</span>
- <span class="comment">// ...
-</span> <span class="special">~</span><span class="identifier">pop_back_if_not_commit</span><span class="special">()</span> <span class="special">{</span>
- <span class="keyword">if</span><span class="special">(!</span><span class="identifier">m_commit</span><span class="special">)</span>
- <span class="identifier">m_vec</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">();</span>
- <span class="special">}</span>
-<span class="special">};</span>
-</pre>
-<p>
- In some cases <a href="http://www.research.att.com/~bs/glossary.html#Gstrong-guarantee" target="_top">strong
- guarantee</a> can be accomplished with standard utilities:
- </p>
-<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">auto_ptr</span><span class="special">&lt;</span><span class="identifier">Person</span><span class="special">&gt;</span> <span class="identifier">spSuperMan</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">Superman</span><span class="special">);</span>
-<span class="identifier">m_persons</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">spSuperMan</span><span class="special">.</span><span class="identifier">get</span><span class="special">());</span>
-<span class="identifier">spSuperMan</span><span class="special">.</span><span class="identifier">release</span><span class="special">();</span> <span class="comment">// m_persons successfully took ownership.
-</span></pre>
-<p>
- or with specialized containers such as <a href="../../../../../libs/ptr_container/doc/ptr_container.html" target="_top">Boost
- Pointer Container Library</a> or <a href="../../../../../libs/multi_index/doc/index.html" target="_top">Boost
- Multi-Index Containers Library</a>.
- </p>
-<a name="alternatives._ulink_url__http___www_ddj_com_dept_cpp_184403758__scopeguard__ulink_"></a><h4>
-<a name="id761994"></a>
- ScopeGuard
- </h4>
-<p>
- Imagine that you add a new currency rate:
- </p>
-<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">commit</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
-<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">currency</span><span class="special">(</span><span class="string">"EUR"</span><span class="special">);</span>
-<span class="keyword">double</span> <span class="identifier">rate</span> <span class="special">=</span> <span class="number">1.3326</span><span class="special">;</span>
-<span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">rates</span><span class="special">;</span>
-<span class="keyword">bool</span> <span class="identifier">currency_rate_inserted</span> <span class="special">=</span>
- <span class="identifier">rates</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">currency</span><span class="special">,</span> <span class="identifier">rate</span><span class="special">)).</span><span class="identifier">second</span><span class="special">;</span>
-</pre>
-<p>
- and then continue a transaction. If it cannot be completed, you erase the currency
- from <code class="computeroutput"><span class="identifier">rates</span></code>. This is how you
- can do this with ScopeGuard
- and Boost.Lambda:
- </p>
-<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">;</span>
-
-<span class="identifier">ON_BLOCK_EXIT</span><span class="special">(</span>
- <span class="identifier">if_</span><span class="special">(</span><span class="identifier">currency_rate_inserted</span> <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">_1</span><span class="special">)</span> <span class="special">[</span>
- <span class="identifier">bind</span><span class="special">(</span>
- <span class="keyword">static_cast</span><span class="special">&lt;</span>
- <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">size_type</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span><span class="keyword">double</span><span class="special">&gt;::*)(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;)</span>
- <span class="special">&gt;(&amp;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">erase</span><span class="special">)</span>
- <span class="special">,</span> <span class="special">&amp;</span><span class="identifier">rates</span>
- <span class="special">,</span> <span class="identifier">currency</span>
- <span class="special">)</span>
- <span class="special">]</span>
- <span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">commit</span><span class="special">)</span>
- <span class="special">);</span>
-
-<span class="comment">// ...
-</span>
-<span class="identifier">commit</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span>
-</pre>
-<p>
- Note that
- </p>
-<div class="itemizedlist"><ul class="itemizedlist" type="disc">
-<li class="listitem">
- Boost.lambda expressions are hard to write correctly, for example, overloaded
- function must be explicitly casted, as demonstrated in this example,
- </li>
-<li class="listitem">
- condition in <code class="computeroutput"><span class="identifier">if_</span></code> expression
- refers to <code class="computeroutput"><span class="identifier">commit</span></code> variable
- indirectly through the <code class="computeroutput"><span class="identifier">_1</span></code>
- placeholder,
- </li>
-<li class="listitem">
- setting a breakpoint inside <code class="computeroutput"><span class="identifier">if_</span><span class="special">[</span> <span class="special">...</span> <span class="special">]</span></code>
- requires in-depth knowledge of Boost.Lambda
- and debugging techniques.
- </li>
-</ul></div>
-<p>
- This code will look much better with native lambda expressions proposed for
- C++0x:
- </p>
-<pre class="programlisting"><span class="identifier">ON_BLOCK_EXIT</span><span class="special">(</span>
- <span class="special">[</span><span class="identifier">currency_rate_inserted</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">commit</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">rates</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">currency</span><span class="special">]()</span> <span class="special">-&gt;</span> <span class="keyword">void</span>
- <span class="special">{</span>
- <span class="keyword">if</span><span class="special">(</span><span class="identifier">currency_rate_inserted</span> <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">commit</span><span class="special">)</span>
- <span class="identifier">rates</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">currency</span><span class="special">);</span>
- <span class="special">}</span>
-<span class="special">);</span>
-</pre>
-<p>
- With <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> you can simply do
- </p>
-<pre class="programlisting"><span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(</span> <span class="special">(</span><span class="identifier">currency_rate_inserted</span><span class="special">)(&amp;</span><span class="identifier">commit</span><span class="special">)(&amp;</span><span class="identifier">rates</span><span class="special">)(&amp;</span><span class="identifier">currency</span><span class="special">)</span> <span class="special">)</span>
-<span class="special">{</span>
- <span class="keyword">if</span><span class="special">(</span><span class="identifier">currency_rate_inserted</span> <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">commit</span><span class="special">)</span>
- <span class="identifier">rates</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">currency</span><span class="special">);</span>
-<span class="special">}</span> <span class="identifier">BOOST_SCOPE_EXIT_END</span>
-
-<span class="comment">// ...
-</span>
-<span class="identifier">commit</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span>
-</pre>
-<a name="alternatives.c__0x"></a><h4>
-<a name="id762994"></a>
- C++0x
- </h4>
-<p>
- In future releases <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> will take advantages
- of C++0x features.
- </p>
-<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
- Passing capture list as <a href="../../../../../libs/preprocessor/index.html" target="_top">Boost.Preprocessor
- sequence</a> will be replaced with a traditional macro invocation style:
- </li></ul></div>
-<pre class="programlisting"><span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(</span><span class="identifier">currency_rate_inserted</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">commit</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">rates</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">currency</span><span class="special">)</span>
-<span class="special">{</span>
- <span class="keyword">if</span><span class="special">(</span><span class="identifier">currency_rate_inserted</span> <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">commit</span><span class="special">)</span>
- <span class="identifier">rates</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">currency</span><span class="special">);</span>
-<span class="special">}</span> <span class="identifier">BOOST_SCOPE_EXIT_END</span>
-</pre>
-<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
- <code class="computeroutput"><span class="identifier">BOOST_SCOPE_EXIT_END</span></code> will
- be replaced with a semicolon:
- </li></ul></div>
-<pre class="programlisting"><span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(</span><span class="identifier">currency_rate_inserted</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">commit</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">rates</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">currency</span><span class="special">)</span>
-<span class="special">{</span>
- <span class="keyword">if</span><span class="special">(</span><span class="identifier">currency_rate_inserted</span> <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">commit</span><span class="special">)</span>
- <span class="identifier">rates</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">currency</span><span class="special">);</span>
-<span class="special">};</span>
-</pre>
-<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
- Users will be able to capture local variables implicitly with lambda capture
- defaults <code class="computeroutput"><span class="special">&amp;</span></code> and <code class="computeroutput"><span class="special">=</span></code>:
- </li></ul></div>
-<pre class="programlisting"><span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(&amp;,</span> <span class="identifier">currency_rate_inserted</span><span class="special">)</span>
-<span class="special">{</span>
- <span class="keyword">if</span><span class="special">(</span><span class="identifier">currency_rate_inserted</span> <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">commit</span><span class="special">)</span>
- <span class="identifier">rates</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">currency</span><span class="special">);</span>
-<span class="special">};</span>
-</pre>
-<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
- It will be possible to capture <code class="computeroutput"><span class="keyword">this</span></code>
- pointer.
- </li></ul></div>
-<a name="alternatives.the_d_programming_language"></a><h4>
-<a name="id763445"></a>
- The D Programming Language
- </h4>
-<p>
- <span class="underline">ScopeExit</span> is similar to scope(exit)
- feature built into the D
- programming language.
- </p>
-<p>
- A curious reader may notice that the library doesn't implement <code class="computeroutput"><span class="identifier">scope</span><span class="special">(</span><span class="identifier">success</span><span class="special">)</span></code> and <code class="computeroutput"><span class="identifier">scope</span><span class="special">(</span><span class="identifier">failure</span><span class="special">)</span></code> of the D
- language. Unfortunately, it's not possible in C++ because failure or success
- condition cannot be determined by calling <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">uncaught_exception</span></code>.
- It's not a big problem, though. These two constructs can be expressed in terms
- of scope(exit)
- and a <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">commit</span></code>
- variable as explained in <a class="link" href="tutorial.html" title="Tutorial">Tutorial</a>.
- Refer to Guru of the Week #47
- for more details about <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">uncaught_exception</span></code>
- and if it has any good use at all.
- </p>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2006 -2009 Alexander Nasonov<p>
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at &lt;ulink url="http://www.boost.org/LICENSE_1_0.txt"&gt;
- http://www.boost.org/LICENSE_1_0.txt &lt;/ulink&gt;)
- </p>
-</div></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="tutorial.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="compilers.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>

Deleted: trunk/libs/scope_exit/doc/html/scope_exit/compilers.html
==============================================================================
--- trunk/libs/scope_exit/doc/html/scope_exit/compilers.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,61 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
-<title>Supported Compilers</title>
-<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
-<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="prev" href="alternatives.html" title="Alternatives">
-<link rel="next" href="conf.html" title="Configuration">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><tr>
-<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
-<td align="center">Home</td>
-<td align="center">Libraries</td>
-<td align="center">People</td>
-<td align="center">FAQ</td>
-<td align="center">More</td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="alternatives.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="conf.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="scope_exit.compilers"></a> Supported Compilers</h2></div></div></div>
-<p>
- The library should be usable on any compiler that supports Boost.Typeof
- except
- </p>
-<div class="itemizedlist"><ul class="itemizedlist" type="disc">
-<li class="listitem">
- MSVC 7.1 and 8.0 fail to link if a function with <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a>
- is included by multiple translation units.
- </li>
-<li class="listitem">
- GCC 3.3 can't compile <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> inside
- a template. See <a href="http://lists.boost.org/Archives/boost/2007/02/116235.php" target="_top">this
- thread</a> for more details.
- </li>
-</ul></div>
-<p>
- The author tested the library on GCC 3.3, 3.4, 4.1, 4.2 and Intel 10.1.
- </p>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2006 -2009 Alexander Nasonov<p>
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at &lt;ulink url="http://www.boost.org/LICENSE_1_0.txt"&gt;
- http://www.boost.org/LICENSE_1_0.txt &lt;/ulink&gt;)
- </p>
-</div></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="alternatives.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="conf.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>

Deleted: trunk/libs/scope_exit/doc/html/scope_exit/conf.html
==============================================================================
--- trunk/libs/scope_exit/doc/html/scope_exit/conf.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,49 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
-<title>Configuration</title>
-<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
-<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="prev" href="compilers.html" title="Supported Compilers">
-<link rel="next" href="ref.html" title="Reference">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><tr>
-<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
-<td align="center">Home</td>
-<td align="center">Libraries</td>
-<td align="center">People</td>
-<td align="center">FAQ</td>
-<td align="center">More</td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="compilers.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="ref.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="scope_exit.conf"></a> Configuration</h2></div></div></div>
-<p>
- Normally, no configuration is required for the library but note that the library
- depends on Boost.Typeof
- and you may want to configure or enforce <a href="../../../../../libs/typeof/index.html" target="_top">typeof
- emulation</a>.
- </p>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2006 -2009 Alexander Nasonov<p>
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at &lt;ulink url="http://www.boost.org/LICENSE_1_0.txt"&gt;
- http://www.boost.org/LICENSE_1_0.txt &lt;/ulink&gt;)
- </p>
-</div></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="compilers.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="ref.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>

Deleted: trunk/libs/scope_exit/doc/html/scope_exit/ref.html
==============================================================================
--- trunk/libs/scope_exit/doc/html/scope_exit/ref.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,153 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
-<title>Reference</title>
-<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
-<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="prev" href="conf.html" title="Configuration">
-<link rel="next" href="acknowledge.html" title="Acknowledge">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><tr>
-<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
-<td align="center">Home</td>
-<td align="center">Libraries</td>
-<td align="center">People</td>
-<td align="center">FAQ</td>
-<td align="center">More</td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="conf.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledge.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="scope_exit.ref"></a> Reference</h2></div></div></div>
-<a name="ref.boost_scope_exit"></a><h4>
-<a name="id763687"></a>
- BOOST_SCOPE_EXIT
- </h4>
-<p>
- A <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> declaration has the following
- synopsis:
- </p>
-<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">scope_exit</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
-
-<span class="identifier">BOOST_SCOPE_EXIT</span> <span class="special">(</span> <span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span><span class="special">-</span><span class="identifier">list</span> <span class="special">)</span>
- <span class="identifier">function</span><span class="special">-</span><span class="identifier">body</span>
-<span class="identifier">BOOST_SCOPE_EXIT_END</span>
-</pre>
-<p>
- where
- </p>
-<pre class="programlisting"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span><span class="special">-</span><span class="identifier">list</span><span class="special">:</span>
- <span class="special">(</span> <span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span> <span class="special">)</span>
- <span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span><span class="special">-</span><span class="identifier">list</span> <span class="special">(</span> <span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span> <span class="special">)</span>
-
-<span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span><span class="special">:</span>
- <span class="identifier">identifier</span>
- <span class="special">&amp;</span><span class="identifier">identifier</span>
-</pre>
-<p>
- The <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> declaration schedules an execution
- of <code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">body</span></code>
- at the end of the current scope. The <code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">body</span></code> statements are executed in the reverse
- order of <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> declarations in the given
- scope. The scope must be local.
- </p>
-<p>
- Each <code class="computeroutput"><span class="identifier">identifier</span></code> in <code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span><span class="special">-</span><span class="identifier">list</span></code> must
- be a valid name in enclosing scope and it must appear exactly once in the list.
- If a <code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span></code>
- starts with the ampersand sign <code class="computeroutput"><span class="special">&amp;</span></code>,
- the corresponding <code class="computeroutput"><span class="identifier">identifier</span></code>
- will be available inside <code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">body</span></code>; otherwise, a copy of it will be made
- at the point of <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> declaration and
- that copy will be available inside <code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">body</span></code>. In the latter case, the <code class="computeroutput"><span class="identifier">idenitifer</span></code> must be <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>.
- </p>
-<p>
- Only identifiers listed in <code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span><span class="special">-</span><span class="identifier">list</span></code>, static variables, <code class="computeroutput"><span class="keyword">extern</span></code>
- variables and functions, and enumerations from the enclosing scope can be used
- inside the <code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">body</span></code>.
- </p>
-<div class="note"><table border="0" summary="Note">
-<tr>
-<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
-<th align="left">Note</th>
-</tr>
-<tr><td align="left" valign="top"><p>
- <code class="computeroutput"><span class="keyword">this</span></code> pointer is not an identifier
- and cannot be passed to <code class="computeroutput"> <span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span><span class="special">-</span><span class="identifier">list</span></code>.
- </p></td></tr>
-</table></div>
-<p>
- The <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> uses Boost.Typeof
- to determine types of <code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">exit</span><span class="special">-</span><span class="identifier">capture</span><span class="special">-</span><span class="identifier">list</span></code> elements. In order to compile code in
- typeof emulation mode,
- all types should be registered with BOOST_TYPEOF_REGISTER_TYPE
- or BOOST_TYPEOF_REGISTER_TEMPLATE
- macros, or appropriate Boost.Typeof
- headers should be included.
- </p>
-<a name="ref.boost_scope_exit_tpl"></a><h4>
-<a name="id764391"></a>
- BOOST_SCOPE_EXIT_TPL
- </h4>
-<p>
- This macro is a workaround for various versions of gcc. These compilers don't
- compile <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> declaration inside function
- templates. As a workaround, the <code class="computeroutput"><span class="identifier">_TPL</span></code>
- suffix should be appended to <code class="computeroutput"><span class="identifier">BOOST_SCOPE_EXIT</span></code>.
- </p>
-<p>
- The problem boils down to the following code:
- </p>
-<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">)</span> <span class="special">{</span>
- <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
- <span class="keyword">struct</span> <span class="identifier">Local</span> <span class="special">{</span>
- <span class="keyword">typedef</span> <span class="identifier">__typeof__</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">typeof_i</span><span class="special">;</span>
- <span class="keyword">typedef</span> <span class="identifier">__typeof__</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span> <span class="identifier">typeof_t</span><span class="special">;</span>
- <span class="special">};</span>
- <span class="keyword">typedef</span> <span class="identifier">Local</span><span class="special">::</span><span class="identifier">typeof_i</span> <span class="identifier">i_type</span><span class="special">;</span>
- <span class="keyword">typedef</span> <span class="identifier">Local</span><span class="special">::</span><span class="identifier">typeof_t</span> <span class="identifier">t_type</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">foo</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> <span class="special">}</span>
-</pre>
-<p>
- This can be fixed by adding <code class="computeroutput"><span class="keyword">typename</span></code>
- in front of <code class="computeroutput"><span class="identifier">Local</span><span class="special">::</span><span class="identifier">typeof_i</span></code> and <code class="computeroutput"><span class="identifier">Local</span><span class="special">::</span><span class="identifier">typeof_t</span></code>.
- </p>
-<p>
- See also <a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37920" target="_top">GCC
- bug 37920</a>.
- </p>
-<div class="note"><table border="0" summary="Note">
-<tr>
-<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
-<th align="left">Note</th>
-</tr>
-<tr><td align="left" valign="top"><p>
- Although <code class="computeroutput"><span class="identifier">BOOST_SCOPE_EXIT_TPL</span></code>
- has the same suffix as the <code class="computeroutput"><span class="identifier">BOOST_TYPEOF_TPL</span></code>,
- it doesn't follow a convention of the Boost.Typeof.
- </p></td></tr>
-</table></div>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2006 -2009 Alexander Nasonov<p>
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at &lt;ulink url="http://www.boost.org/LICENSE_1_0.txt"&gt;
- http://www.boost.org/LICENSE_1_0.txt &lt;/ulink&gt;)
- </p>
-</div></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="conf.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledge.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>

Deleted: trunk/libs/scope_exit/doc/html/scope_exit/tutorial.html
==============================================================================
--- trunk/libs/scope_exit/doc/html/scope_exit/tutorial.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,151 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
-<title>Tutorial</title>
-<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
-<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="prev" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">
-<link rel="next" href="alternatives.html" title="Alternatives">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><tr>
-<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
-<td align="center">Home</td>
-<td align="center">Libraries</td>
-<td align="center">People</td>
-<td align="center">FAQ</td>
-<td align="center">More</td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="alternatives.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="scope_exit.tutorial"></a> Tutorial</h2></div></div></div>
-<p>
- Imagine that you want to make many modifications to data members of the <code class="computeroutput"><span class="identifier">World</span></code> class in the <code class="computeroutput"><span class="identifier">World</span><span class="special">::</span><span class="identifier">addPerson</span></code>
- function. You start with adding a new <code class="computeroutput"><span class="identifier">Person</span></code>
- object to a vector of persons:
- </p>
-<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">World</span><span class="special">::</span><span class="identifier">addPerson</span><span class="special">(</span><span class="identifier">Person</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">person</span><span class="special">)</span> <span class="special">{</span>
- <span class="keyword">bool</span> <span class="identifier">commit</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
- <span class="identifier">m_persons</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">person</span><span class="special">);</span> <span class="comment">// (1) direct action
-</span></pre>
-<p>
- Some operation down the road may throw an exception and all changes to involved
- objects should be rolled back. This all-or-nothing semantic is also known as
- <a href="http://www.research.att.com/~bs/glossary.html#Gstrong-guarantee" target="_top">strong
- guarantee</a>.
- </p>
-<p>
- In particular, last added person must be deleted from <code class="computeroutput"><span class="identifier">m_persons</span></code>
- when the function throws. All you need is to define a delayed action (release
- of a resource) right after the direct action (resource acquisition):
- </p>
-<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">World</span><span class="special">::</span><span class="identifier">addPerson</span><span class="special">(</span><span class="identifier">Person</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">aPerson</span><span class="special">)</span> <span class="special">{</span>
- <span class="keyword">bool</span> <span class="identifier">commit</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
- <span class="identifier">m_persons</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">aPerson</span><span class="special">);</span> <span class="comment">// (1) direct action
-</span> <span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(</span> <span class="special">(&amp;</span><span class="identifier">commit</span><span class="special">)(&amp;</span><span class="identifier">m_persons</span><span class="special">)</span> <span class="special">)</span>
- <span class="special">{</span>
- <span class="keyword">if</span><span class="special">(!</span><span class="identifier">commit</span><span class="special">)</span>
- <span class="identifier">m_persons</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">();</span> <span class="comment">// (2) rollback action
-</span> <span class="special">}</span> <span class="identifier">BOOST_SCOPE_EXIT_END</span>
-
- <span class="comment">// ... // (3) other operations
-</span>
- <span class="identifier">commit</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> <span class="comment">// (4) turn all rollback actions into no-op
-</span><span class="special">}</span>
-</pre>
-<p>
- The block below point <code class="computeroutput"><span class="special">(</span><span class="number">1</span><span class="special">)</span></code> is a <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a>
- declaration. Unlike point <code class="computeroutput"><span class="special">(</span><span class="number">1</span><span class="special">)</span></code>, an execution of the <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a>
- body will be delayed until the end of the current scope. In this case it will
- be executed either after point <code class="computeroutput"><span class="special">(</span><span class="number">4</span><span class="special">)</span></code> or on any
- exception.
- </p>
-<p>
- The <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> declaration starts with <code class="computeroutput"><span class="identifier">BOOST_SCOPE_EXIT</span></code> macro invocation which accepts
- Boost.Preprocessor sequence
- of captured variables. If a capture starts with the ampersand sign <code class="computeroutput"><span class="special">&amp;</span></code>, a reference to the captured variable
- will be available inside the <a class="link" href="../index.html" title="Chapter&#160;1.&#160;Boost.ScopeExit">ScopeExit</a> body;
- otherwise, a copy of the variable will be made after the point <code class="computeroutput"><span class="special">(</span><span class="number">1</span><span class="special">)</span></code>
- and only the copy will be available inside the body.
- </p>
-<p>
- In the example above, variables <code class="computeroutput"><span class="identifier">commit</span></code>
- and <code class="computeroutput"><span class="identifier">m_persons</span></code> are passed by
- reference because the final value of the <code class="computeroutput"><span class="identifier">commit</span></code>
- variable should be used to determine whether to execute rollback action or
- not and the action should modify the <code class="computeroutput"><span class="identifier">m_persons</span></code>
- object, not its copy. This is a most common case but passing a variable by
- value is sometimes useful as well.
- </p>
-<p>
- Consider a more complex case where <code class="computeroutput"><span class="identifier">World</span><span class="special">::</span><span class="identifier">addPerson</span></code>
- can save intermediate states at some points and roll back to the last saved
- state. You can use <code class="computeroutput"><span class="identifier">Person</span><span class="special">::</span><span class="identifier">m_evolution</span></code> to store a version of changes
- and increment it to cancel all rollback actions associated with those changes.
- </p>
-<p>
- If you pass a current value of <code class="computeroutput"><span class="identifier">m_evolution</span></code>
- stored in the <code class="computeroutput"><span class="identifier">checkpoint</span></code> variable
- by value, it will remain unchanged until the end of aa scope and you can compare
- it with the final value of the <code class="computeroutput"><span class="identifier">m_evolution</span></code>.
- If the latter wasn't incremented since you saved it, the rollback action inside
- the block should be executed:
- </p>
-<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">World</span><span class="special">::</span><span class="identifier">addPerson</span><span class="special">(</span><span class="identifier">Person</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">aPerson</span><span class="special">)</span> <span class="special">{</span>
- <span class="identifier">m_persons</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">aPerson</span><span class="special">);</span>
-
- <span class="comment">// This block must be no-throw
-</span> <span class="identifier">Person</span><span class="special">&amp;</span> <span class="identifier">person</span> <span class="special">=</span> <span class="identifier">m_persons</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span>
- <span class="identifier">Person</span><span class="special">::</span><span class="identifier">evolution_t</span> <span class="identifier">checkpoint</span> <span class="special">=</span> <span class="identifier">person</span><span class="special">.</span><span class="identifier">m_evolution</span><span class="special">;</span>
-
- <span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(</span> <span class="special">(</span><span class="identifier">checkpoint</span><span class="special">)(&amp;</span><span class="identifier">person</span><span class="special">)(&amp;</span><span class="identifier">m_persons</span><span class="special">)</span> <span class="special">)</span>
- <span class="special">{</span>
- <span class="keyword">if</span><span class="special">(</span><span class="identifier">checkpoint</span> <span class="special">==</span> <span class="identifier">person</span><span class="special">.</span><span class="identifier">m_evolution</span><span class="special">)</span>
- <span class="identifier">m_persons</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">();</span>
- <span class="special">}</span> <span class="identifier">BOOST_SCOPE_EXIT_END</span>
-
- <span class="comment">// ...
-</span>
- <span class="identifier">checkpoint</span> <span class="special">=</span> <span class="special">++</span><span class="identifier">person</span><span class="special">.</span><span class="identifier">m_evolution</span><span class="special">;</span>
-
- <span class="comment">// Assign new id to the person
-</span> <span class="identifier">World</span><span class="special">::</span><span class="identifier">id_t</span> <span class="keyword">const</span> <span class="identifier">prev_id</span> <span class="special">=</span> <span class="identifier">person</span><span class="special">.</span><span class="identifier">m_id</span><span class="special">;</span>
- <span class="identifier">person</span><span class="special">.</span><span class="identifier">m_id</span> <span class="special">=</span> <span class="identifier">m_next_id</span><span class="special">++;</span>
- <span class="identifier">BOOST_SCOPE_EXIT</span><span class="special">(</span> <span class="special">(</span><span class="identifier">checkpoint</span><span class="special">)(&amp;</span><span class="identifier">person</span><span class="special">)(&amp;</span><span class="identifier">m_next_id</span><span class="special">)(</span><span class="identifier">prev_id</span><span class="special">)</span> <span class="special">)</span>
- <span class="special">{</span>
- <span class="keyword">if</span><span class="special">(</span><span class="identifier">checkpoint</span> <span class="special">==</span> <span class="identifier">person</span><span class="special">.</span><span class="identifier">m_evolution</span><span class="special">)</span> <span class="special">{</span>
- <span class="identifier">m_next_id</span> <span class="special">=</span> <span class="identifier">person</span><span class="special">.</span><span class="identifier">m_id</span><span class="special">;</span>
- <span class="identifier">person</span><span class="special">.</span><span class="identifier">m_id</span> <span class="special">=</span> <span class="identifier">prev_id</span><span class="special">;</span>
- <span class="special">}</span>
- <span class="special">}</span> <span class="identifier">BOOST_SCOPE_EXIT_END</span>
-
- <span class="comment">// ...
-</span>
- <span class="identifier">checkpoint</span> <span class="special">=</span> <span class="special">++</span><span class="identifier">person</span><span class="special">.</span><span class="identifier">m_evolution</span><span class="special">;</span>
-<span class="special">}</span>
-</pre>
-<p>
- Full code listing can be found in world.cpp.
- </p>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2006 -2009 Alexander Nasonov<p>
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at &lt;ulink url="http://www.boost.org/LICENSE_1_0.txt"&gt;
- http://www.boost.org/LICENSE_1_0.txt &lt;/ulink&gt;)
- </p>
-</div></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="alternatives.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>

Modified: trunk/libs/scope_exit/doc/scope_exit.qbk
==============================================================================
--- trunk/libs/scope_exit/doc/scope_exit.qbk (original)
+++ trunk/libs/scope_exit/doc/scope_exit.qbk 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,475 +1,437 @@
+
+[/ Copyright (C) 2006-2009, 2012 Alexander Nasonov ]
+[/ Copyright (C) 2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://www.boost.org/libs/scope_exit ]
+
 [library Boost.ScopeExit
- [copyright 2006-2009 Alexander Nasonov]
+ [quickbook 1.5]
+ [version 1.1.0]
+ [copyright 2006-2012 Alexander Nasonov, Lorenzo Caminiti]
     [purpose execute arbitrary code at scope exit]
     [license
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- <ulink url="http://www.boost.org/LICENSE_1_0.txt">
- http://www.boost.org/LICENSE_1_0.txt
- </ulink>)
+ Distributed under 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])
+ ]
+ [authors
+ [Nasonov, Alexander]
+ [Caminiti <email>lorcaminiti_at_[hidden]</email>, Lorenzo]
     ]
- [authors [Nasonov, Alexander]]
     [category utility]
     [id scope_exit]
     [dirname scope_exit]
 ]
 
-[/ Images ]
+[def __Tutorial__ [link scope_exit.Tutorial Tutorial]]
+[def __No_Variadic_Macros__ [link scope_exit.No_Variadic_Macros No Variadic Macros]]
+[def __Reference__ [@reference.html Reference]]
+[def __Boost_ScopeExit__ [link scope_exit Boost.ScopeExit]]
+[def __Boost_Lambda__ [@http://www.boost.org/libs/lambda Boost.Lambda]]
+[def __Boost_Phoenix__ [@http://www.boost.org/libs/phoenix Boost.Phoenix]]
+[def __Boost_Typeof__ [@http://www.boost.org/libs/typeof Boost.Typeof]]
+[def __typeof_emulation__ [@http://www.boost.org/libs/typeof type-of emulation]]
+[def __BOOST_TYPEOF_REGISTER_TYPE__ [@http://www.boost.org/libs/typeof/refe.html#typeof.regtype BOOST_TYPEOF_REGISTER_TYPE]]
+[def __BOOST_TYPEOF_REGISTER_TEMPLATE__ [@http://www.boost.org/libs/typeof/refe.html#typeof.regtemp BOOST_TYPEOF_REGISTER_TEMPLATE]]
+[def __Boost_Preprocessor__ [@http://www.boost.org/libs/preprocessor Boost.Preprocessor]]
+[def __Boost_PointerContainer__ [@http://www.boost.org/libs/ptr_container Boost.PointerContainer]]
+[def __Boost_Multi_Index__ [@http://www.boost.org/libs/multi_index Boost.Multi-Index]]
+[def __ScopeGuard__ [@http://www.ddj.com/dept/cpp/184403758 ScopeGuard]]
+[def __D__ [@http://www.digitalmars.com/d/index.html D]]
+[def __D_scope_exit__ [@http://www.digitalmars.com/d/2.0/statement.html#ScopeGuardStatement scope(exit)]]
+[def __RAII__ [@http://www.research.att.com/~bs/glossary.html#Gresource-acquisition-is-initialization RAII]]
+[def __strong_guarantee__ [@http://www.research.att.com/~bs/glossary.html#Gstrong-guarantee strong guarantee]]
+
+[import ../test/world.cpp]
+[import ../test/world_seq.cpp]
+[import ../test/world_checkpoint.cpp]
+[import ../test/world_this.cpp]
+[import ../test/world_void.cpp]
+[import ../test/world_checkpoint_all.cpp]
+[import ../test/world_tpl.cpp]
+[import ../test/world_lambda.cpp]
+[import ../example/try_catch.cpp]
+[import ../example/scope_guard.cpp]
+
+This library allows to execute arbitrary code when the enclosing scope exits.
+
+[section Introduction]
+
+Nowadays, every C++ developer is familiar with the Resource Acquisition Is Initialization (__RAII__) technique.
+It binds resource acquisition and release to initialization and destruction of a variable that holds the resource.
+But there are times when writing a special class for such variable is not worth the effort.
+This is when the __Boost_ScopeExit__ comes into play.
+
+Programmers can put resource acquisition directly in their code and next to it, they can write code that releases the resource using this library.
+For example:
+[footnote
+Older versions of this library used a __Boost_Preprocessor__ sequence to specify the list of captured variables.
+While maintaining full backward compatibility, it is now possible to specify the captured variables also as a comma-separated list (which is the preferred syntax).
+See the __No_Variadic_Macros__ section for more details.
+]
 
-[def _note_ [$images/note.png]]
+[world]
 
-[/ Links ]
+Read the __Tutorial__ section to find out how to write programs with __Boost_ScopeExit__ or jump to the __Reference__ section.
 
-[def _scope_exit_ [link scope_exit ScopeExit]]
-[def _Tutorial_ [link scope_exit.tutorial Tutorial]]
-[def _Reference_ [link scope_exit.ref Reference]]
-[def _lambda_ [@../../../../libs/lambda/index.html Boost.Lambda]]
-[def _typeof_ [@../../../../libs/typeof/index.html Boost.Typeof]]
-[def _typeof_emulation_ [@../../../../libs/typeof/index.html typeof emulation]]
-[def _typeof_REGISTER_TYPE_ [@../../../../doc/html/typeof/refe.html#typeof.regtype BOOST_TYPEOF_REGISTER_TYPE]]
-[def _typeof_REGISTER_TEMPLATE_ [@../../../../doc/html/typeof/refe.html#typeof.regtemp BOOST_TYPEOF_REGISTER_TEMPLATE]]
-[def _pp_ [@../../../../libs/preprocessor/index.html Boost.Preprocessor]]
-[def _pp_seq_ [@../../../../libs/preprocessor/index.html Boost.Preprocessor sequence]]
-[def _ptr_container_ [@../../../../libs/ptr_container/doc/ptr_container.html Boost Pointer Container Library]]
-[def _multi_index_ [@../../../../libs/multi_index/doc/index.html Boost Multi-Index Containers Library]]
-[def _scope_guard_ [@http://www.ddj.com/dept/cpp/184403758 ScopeGuard]]
-[def _D_ [@http://www.digitalmars.com/d/index.html D]]
-[def _D_scope_exit_ [@http://www.digitalmars.com/d/2.0/statement.html#ScopeGuardStatement scope(exit)]]
-[def _RAII_ [@http://www.research.att.com/~bs/glossary.html#Gresource-acquisition-is-initialization RAII]]
-[def _strong_guarantee_ [@http://www.research.att.com/~bs/glossary.html#Gstrong-guarantee strong guarantee]]
-
-[section:intro Introduction]
-
-Nowadays, every C++ developer is familiar with _RAII_ technique.
-It binds resource acquisition and release to initialization and
-destruction of a variable that holds the resource. But there are
-times when writing a special class for such variable is not worth
-the effort.
-
-This is when _scope_exit_ macro comes into play. You put resource
-acquisition directly in your code and next to it you write a code
-that releases the resource.
-
-Read _Tutorial_ to find out how to write programs with
-_scope_exit_ or jump straight to the _Reference_ section.
-
-[endsect]
-
-[section:tutorial Tutorial]
-
-Imagine that you want to make many modifications to data members
-of the `World` class in the `World::addPerson` function.
-You start with adding a new `Person` object to a vector of persons:
-
- void World::addPerson(Person const& person) {
- bool commit = false;
- m_persons.push_back(person); // (1) direct action
-
-Some operation down the road may throw an exception and all changes
-to involved objects should be rolled back. This all-or-nothing semantic
-is also known as _strong_guarantee_.
-
-In particular, last added person must be deleted from `m_persons` when
-the function throws. All you need is to define a delayed action (release
-of a resource) right after the direct action (resource acquisition):
-
- void World::addPerson(Person const& aPerson) {
- bool commit = false;
- m_persons.push_back(aPerson); // (1) direct action
- BOOST_SCOPE_EXIT( (&commit)(&m_persons) )
- {
- if(!commit)
- m_persons.pop_back(); // (2) rollback action
- } BOOST_SCOPE_EXIT_END
-
- // ... // (3) other operations
-
- commit = true; // (4) turn all rollback actions into no-op
- }
+[endsect]
 
-The block below point `(1)` is a _scope_exit_ declaration.
-Unlike point `(1)`, an execution of the _scope_exit_ body will be
-delayed until the end of the current scope. In this case it will be
-executed either after point `(4)` or on any exception.
-
-The _scope_exit_ declaration starts with `BOOST_SCOPE_EXIT` macro
-invocation which accepts _pp_seq_ of captured variables. If a capture
-starts with the ampersand sign `&`, a reference to the captured variable
-will be available inside the _scope_exit_ body; otherwise, a copy of the
-variable will be made after the point `(1)` and only the copy will be
-available inside the body.
-
-In the example above, variables `commit` and `m_persons` are passed
-by reference because the final value of the `commit` variable should
-be used to determine whether to execute rollback action or not and
-the action should modify the `m_persons` object, not its copy.
-This is a most common case but passing a variable by value is
-sometimes useful as well.
-
-Consider a more complex case where `World::addPerson` can save intermediate
-states at some points and roll back to the last saved state. You can
-use `Person::m_evolution` to store a version of changes and increment it
-to cancel all rollback actions associated with those changes.
-
-If you pass a current value of `m_evolution` stored in the `checkpoint`
-variable by value, it will remain unchanged until the end of aa scope
-and you can compare it with the final value of the `m_evolution`.
-If the latter wasn't incremented since you saved it, the rollback action
-inside the block should be executed:
+[section:Getting_Started Getting Started]
 
- void World::addPerson(Person const& aPerson) {
- m_persons.push_back(aPerson);
-
- // This block must be no-throw
- Person& person = m_persons.back();
- Person::evolution_t checkpoint = person.m_evolution;
-
- BOOST_SCOPE_EXIT( (checkpoint)(&person)(&m_persons) )
- {
- if(checkpoint == person.m_evolution)
- m_persons.pop_back();
- } BOOST_SCOPE_EXIT_END
-
- // ...
-
- checkpoint = ++person.m_evolution;
-
- // Assign new id to the person
- World::id_t const prev_id = person.m_id;
- person.m_id = m_next_id++;
- BOOST_SCOPE_EXIT( (checkpoint)(&person)(&m_next_id)(prev_id) )
- {
- if(checkpoint == person.m_evolution) {
- m_next_id = person.m_id;
- person.m_id = prev_id;
- }
- } BOOST_SCOPE_EXIT_END
-
- // ...
-
- checkpoint = ++person.m_evolution;
- }
+This section explains how to setup a system to use this library.
+
+[section Compilers and Platforms]
+
+The library should be usable on any compiler that supports __Boost_Typeof__ except:
 
-Full code listing can be found in [@../../example/world.cpp world.cpp].
+* MSVC 7.1 and 8.0 fail to link if a function with __Boost_ScopeExit__ is included by multiple translation units.
+Furthermore, on MSVC 7.1 and 8.0 it is possible to capture the object `this_` only with native __Boost_Typeof__ (and not in __typeof_emulation__ mode).
+* GCC 3.3 cannot compile __Boost_ScopeExit__ inside a template (see [@http://lists.boost.org/Archives/boost/2007/02/116235.php] for more details).
+
+The authors tested the library on GCC 3.3, 3.4, 4.1, 4.2, 4.5.3 (with and without C++11 features [^-std=c++0x]), MSVC 8.0, and Intel 10.1 under Linux, Cygwin, and Windows 7.
 
 [endsect]
 
-[section:alt_relwork Alternatives and Related Work]
+[section Installation]
 
-[h3 try-catch]
+This library is composed of header files only.
+Therefore there is no pre-compiled object file which needs to be installed.
+Programmers can simply instruct the compiler where to find the library header files (`-I` option on GCC, `/I` option on MSVC, etc) and compile code using the library.
 
-This is an example of using a badly designed `File` class. An
-instance of `File` doesn't close a file in a destructor, a programmer
-is expected to call the `close` member function explicitly.
+The library implementation uses __Boost_Typeof__ to automatically deduce the types of the __Boost_ScopeExit__ captured variables (see the __Tutorial__ section).
+In order to compile code in __typeof_emulation__ mode, all types should be properly registered with __BOOST_TYPEOF_REGISTER_TYPE__ or __BOOST_TYPEOF_REGISTER_TEMPLATE__ macros, or appropriate __Boost_Typeof__ headers should be included.
 
- File passwd;
- try {
- passwd.open("/etc/passwd");
- // ...
- passwd.close();
- }
- catch(...) {
- log("could not get user info");
- if(passwd.is_open())
- passwd.close();
- throw;
- }
+[endsect]
 
-Note the following:
+[endsect]
 
-* the `passwd` object is defined outside of the `try` block because
-this object is required inside the `catch` block to close the file,
-* the `passwd` object is not fully constructed until after the `open`
-member function returns, and
-* if opening throws, the `passwd.close()` should not be called,
-hence the call to `passwd.is_open()`.
+[section:Tutorial Tutorial]
 
-_scope_exit_ doesn't have any of these problems:
+This section illustrates how to use this library.
 
- try {
- File passwd("/etc/passwd");
- BOOST_SCOPE_EXIT( (&passwd) ) {
- passwd.close();
- } BOOST_SCOPE_EXIT_END
- // ...
- }
- catch(...) {
- log("could not get user info");
- throw;
- }
+[section Capturing Variables]
+
+Imagine that we want to make many modifications to data members of some `world` class in its `world::add_person` member function.
+We start with adding a new `person` object to a vector of persons:
+
+ void world::add_person(person const& a_person) {
+ bool commit = false;
+
+ persons_.push_back(a_person); // (1) direct action
+ ...
+
+Some operations down the road may throw an exception and all changes to involved objects should be rolled back.
+This all-or-nothing semantic is also known as __strong_guarantee__.
+
+In particular, the last added person must be deleted from `persons_` if the function throws.
+All we need is to define a delayed action (release of a resource) right after the direct action (resource acquisition).
+For example (see also [@../../test/world.cpp =world.cpp=]):
+
+[world]
+
+The block below point =(1)= is a __Boost_ScopeExit__ declaration.
+Unlike point =(1)=, an execution of the __Boost_ScopeExit__ body will be delayed until the end of the current scope. In this case it will be executed either after point =(4)= or on any exception.
+(On various versions of the GCC compiler, it is necessary to use [macroref BOOST_SCOPE_EXIT_TPL] instead of [macroref BOOST_SCOPE_EXIT] within templates, see later in this section for details.)
+
+The __Boost_ScopeExit__ declaration starts with the [macroref BOOST_SCOPE_EXIT] macro invocation which accepts a comma-separated list of captured variables (a __Boost_Preprocessor__ sequence is also accepted here for compilers that do not support variadic macros and for backward compatibility with older versions of this library, see the __No_Variadic_Macros__ section).
+If a capture starts with the ampersand sign `&`, a reference to the captured variable will be available inside the __Boost_ScopeExit__ body; otherwise, a copy of the variable will be made after the __Boost_ScopeExit__ declaration at point =(1)= and only the copy will be available inside the body (in this case, the captured variable's type must be `CopyConstructible`).
+
+In the example above, the variables `commit` and `persons_` are captured by reference because the final value of the `commit` variable should be used to determine whether to execute rollback actions or not and the action should modify the `persons_` object, not its copy.
+This is the most common case but passing a variable by value is sometimes useful as well.
+
+Finally, the end of the __Boost_ScopeExit__ body must be marked by the [macroref BOOST_SCOPE_EXIT_END] macro which must follow the closing curly bracket `}` of the __Boost_ScopeExit__ body.
+On C++11 it is also possible (but not required) to use a semi-column `;` instead of the [macroref BOOST_SCOPE_EXIT_END] macro.
+[footnote
+The macro [macroref BOOST_SCOPE_EXIT_END] can still be used on C++11 to write portable code that can be used on both C++03 and C++11 compilers.
+Using `;` instead of [macroref BOOST_SCOPE_EXIT_END] on C++03 compilers will generate a (possibly cryptic) compiler error.
+]
 
-[h3 RAII]
+[important
+In order to comply with the STL exception safety requirements, the __Boost_ScopeExit__ body must never throw (because the library implementation executes the body within a destructor).
+This is true for all __Boost_ScopeExit__ macros (including [macroref BOOST_SCOPE_EXIT_TPL] and [macroref BOOST_SCOPE_EXIT_ALL]) on both C++03 and C++11.
+]
+
+Consider a more complex example where `world::add_person` can save intermediate states at some point and roll back to the last saved state.
+We use `person::evolution_` to store a version of the changes and increment it to cancel all rollback actions associated with those changes.
+If we pass a current value of `evolution_` stored in the `checkpoint` variable by value, it remains unchanged within the __Boost_ScopeExit__ body so we can compare it with the final value of `evolution_`.
+If the latter was not incremented since we saved it, the rollback action inside the __Boost_ScopeExit__ body should be executed.
+For example (see also [@../../test/world_checkpoint.cpp =world_checkpoint.cpp=]):
+
+[world_checkpoint]
+
+When multiple __Boost_ScopeExit__ blocks are declared within the same enclosing scope, the __Boost_ScopeExit__ bodies are executed in the reversed order of their declarations.
+
+[endsect]
+
+[section Capturing The Object `this`]
 
-_RAII_ is absolutely perfect for the `File` class introduced above.
-Use of a properly designed `File` class would look like:
+Within a member function, it is also possible to capture the object `this`.
+However, the special symbol `this_` must be used instead of `this` in the __Boost_ScopeExit__ declaration and body to capture and access the object.
+For example (see also [@../../test/world_this.cpp =world_this.cpp=]):
+
+[world_this_]
+
+On C++11, it is possible (but not required) to directly use `this` instead of the special symbol `this_`.
+[footnote
+The special symbol `this_` can still be used on C++11 to write portable code that can be used on both C++03 and C++11 compilers.
+Unfortunately, using `this` instead of `this_` on C++03 compilers leads to undefined behaviour (it will likely generate a compiler error but that is not guaranteed).
+]
+For example (see also [@../../test/world_this.cpp =world_this.cpp=]):
+
+[world_this]
+
+It is never possible to capture the object `this_` (or `this`) by reference because C++ does not allow to take a reference to `this`.
+If the enclosing member function is constant then the captured object will also be constant, otherwise the captured object will be mutable.
+
+[endsect]
+
+[section Capturing No Variable]
+
+It is possible to declare __Boost_ScopeExit__ code that captures no variable.
+In this case, the list of captured variables is replaced by the `void` keyword (similarly to the C syntax that allows to declare a function with no parameter using [^['result-type function-name]]`(void)`).
+[footnote
+*Rationale.*
+Unfortunately, it is not possible to simply invoke the __Boost_ScopeExit__ macro with no parameters `BOOST_SCOPE_EXIT()` because the preprocessor cannot detect emptiness of a macro parameter when the parameter can start with a non-alphanumeric symbol (which is the case when capturing a variable by reference `&variable`).
+]
+For example, this can be useful when the __Boost_ScopeExit__ body only needs to access global variables (see also [@../../test/world_void.cpp =world_void.cpp=]):
+
+[world_void]
+
+This same syntax is supported for both compilers with and without variadic macro support.
+
+[endsect]
+
+[section Capturing All Variables (C++11 Only)]
+
+On C++11 compliers, it is also possible to capture all the variables in scope without naming them one by one using the special macro [macroref BOOST_SCOPE_EXIT_ALL] instead of [macroref BOOST_SCOPE_EXIT].
+[footnote
+*Rationale.*
+The [macroref BOOST_SCOPE_EXIT_ALL] macro is only defined on C++11 compilers.
+Using [macroref BOOST_SCOPE_EXIT_ALL] on C++03 compilers will generate a (possibly cryptic) compiler error.
+Note that a new macro [macroref BOOST_SCOPE_EXIT_ALL] needed to be introduced instead of reusing [macroref BOOST_SCOPE_EXIT] because `BOOST_SCOPE_EXIT(&)` and `BOOST_SCOPE_EXIT(=)` could not be distinguished from `BOOST_SCOPE_EXIT(void)` or `BOOST_SCOPE_EXIT(this_)` using the preprocessor because the symbols `&` and `=` are neither prefxied or postfixed by alphanumeric tokens (this is not an issue for [macroref BOOST_SCOPE_EXIT_ALL] which always has `&` or `=` as the first capture so the first capture token is never compared with neither `void` or `this_` for this macro).
+]
+
+Following the same syntax adopted by C++11 lambdas, the [macroref BOOST_SCOPE_EXIT_ALL] macro accepts a comma-separated list of captures which must start with either `&` or `=` to capture all variables in scope respectively by reference or by value (note that no variable name is specified by these leading captures).
+Additional captures of specific variables can follow the leading `&` or `=` and they will override the default reference or value captures.
+For example (see also [@../../test/world_checkpoint_all.cpp =world_checkpoint_all.cpp=]):
+
+[world_checkpoint_all]
+
+The first __Boost_ScopeExit__ declaration captures all variables in scope by reference but `checkpoint` and `this_` which are explicitly captured by value (in particular, `p` and `persons_` are captured by reference).
+The second __Boost_ScopeExit__ declaration instead captures all variables in scope by value but `p` which is captured by reference (in particular, `checkpoint`, `prev_id`, and `this` are captured by value).
+
+[endsect]
+
+[section GCC Template Workaround]
+
+Various versions of the GCC compiler do not compile [macroref BOOST_SCOPE_EXIT] inside templates (see the __Reference__ section for more information).
+As a workaround, [macroref BOOST_SCOPE_EXIT_TPL] should be used instead of [macroref BOOST_SCOPE_EXIT] in these cases:
+[footnote
+GCC versions compliant with C++11 do not present this issue and given that [macroref BOOST_SCOPE_EXIT_ALL] is only available on C++11 compilers, there is no need for a `BOOST_SCOPE_EXIT_ALL_TPL` macro.
+]
+
+[world_tpl]
+
+The [macroref BOOST_SCOPE_EXIT_TPL] macro has the exact same syntax of [macroref BOOST_SCOPE_EXIT].
+
+[endsect]
+
+[endsect]
+
+[xinclude reference.xml]
+
+[section:Alternatives Annex: Alternatives]
+
+This section presents some alternatives and work related to __Boost_ScopeExit__.
+
+[h5 Try-Catch]
+
+This is an example of using a badly designed `file` class.
+An instance of `file` does not close the file in its destructor, a programmer is expected to call the `close` member function explicitly.
+For example (see also [@../../example/try_catch.cpp =try_catch.cpp=]):
+
+[try_catch_bad]
+
+Note the following issues with this approach:
+
+* The `passwd` object is defined outside of the `try` block because this object is required inside the `catch` block to close the file.
+* The `passwd` object is not fully constructed until after the `open`
+member function returns.
+* If opening throws, the `passwd.close()` should not be called, hence the call to `passwd.is_open()`.
+
+The __Boost_ScopeExit__ approach does not have any of these issues.
+For example (see also [@../../example/try_catch.cpp =try_catch.cpp=]):
+
+[try_catch_good]
+
+[h5 RAII]
+
+__RAII__ is absolutely perfect for the `file` class introduced above.
+Use of a properly designed `file` class would look like:
 
         try {
- File passwd("/etc/passwd");
+ file passwd("/etc/passwd");
             // ...
- }
- catch(...) {
- log("could not get user info");
+ } catch(...) {
+ std::clog << "could not get user info" << std::endl;
             throw;
         }
 
-However, using _RAII_ to build up a _strong_guarantee_ could introduce
-a lot of non-reusable _RAII_ types. For example:
+However, using __RAII__ to build up a __strong_guarantee__ could introduce a lot of non-reusable __RAII__ types.
+For example:
 
- m_persons.push_back(person);
- pop_back_if_not_commit pop_back_if_not_commit_guard(commit, m_persons);
+ persons_.push_back(a_person);
+ pop_back_if_not_commit pop_back_if_not_commit_guard(commit, persons_);
 
-The `pop_back_if_not_commit` class is either defined out of the scope or
-as a local class:
+The `pop_back_if_not_commit` class is either defined out of the scope or as a local class:
 
         class pop_back_if_not_commit {
- bool m_commit;
- std::vector<Person>& m_vec;
+ bool commit_;
+ std::vector<person>& vec_;
             // ...
             ~pop_back_if_not_commit() {
- if(!m_commit)
- m_vec.pop_back();
+ if(!commit_) vec_.pop_back();
             }
         };
 
-In some cases _strong_guarantee_ can be accomplished with standard utilities:
+In some cases __strong_guarantee__ can be accomplished with standard utilities:
 
- std::auto_ptr<Person> spSuperMan(new Superman);
- m_persons.push_back(spSuperMan.get());
- spSuperMan.release(); // m_persons successfully took ownership.
+ std::auto_ptr<Person> superman_ptr(new superman());
+ persons_.push_back(superman_ptr.get());
+ superman_ptr.release(); // persons_ successfully took ownership
 
-or with specialized containers such as _ptr_container_ or
-_multi_index_.
+Or with specialized containers such as __Boost_PointerContainer__ or __Boost_Multi_Index__.
 
-[h3 _scope_guard_]
+[h5 Scope Guards]
 
-Imagine that you add a new currency rate:
+Imagine that a new currency rate is introduced before performing a transaction:
 
- bool commit = false;
- std::string currency("EUR");
- double rate = 1.3326;
- std::map<std::string, double> rates;
- bool currency_rate_inserted =
- rates.insert(std::make_pair(currency, rate)).second;
+[scope_guard_decl]
         
-and then continue a transaction. If it cannot be completed, you erase
-the currency from `rates`. This is how you can do this with _scope_guard_
-and _lambda_:
+If the transaction does not complete, the currency must be erased from `rates`.
+This can be done with __ScopeGuard__ and __Boost_Lambda__ (or __Boost_Phoenix__):
         
- using namespace boost::lambda;
-
- ON_BLOCK_EXIT(
- if_(currency_rate_inserted && !_1) [
- bind(
- static_cast<
- std::map<std::string,double>::size_type (std::map<std::string,double>::*)(std::string const&)
- >(&std::map<std::string,double>::erase)
- , &rates
- , currency
- )
- ]
- , boost::cref(commit)
- );
-
- // ...
-
- commit = true;
+ using namespace boost::lambda;
 
-Note that
+ ON_BLOCK_EXIT(
+ if_(currency_rate_inserted && !_1) [
+ bind(
+ static_cast<
+ std::map<std::string, double>::size_type
+ (std::map<std::string, double>::*)(std::string const&)
+ >(&std::map<std::string, double>::erase)
+ , &rates
+ , currency
+ )
+ ]
+ , boost::cref(commit)
+ );
 
-* Boost.lambda expressions are hard to write correctly, for example,
-overloaded function must be explicitly casted, as demonstrated in
-this example,
-* condition in `if_` expression refers to `commit` variable indirectly
-through the `_1` placeholder,
-* setting a breakpoint inside `if_[ ... ]` requires in-depth knowledge
-of _lambda_ and debugging techniques.
-
-This code will look much better with native lambda expressions proposed
-for C++0x:
-
- ON_BLOCK_EXIT(
- [currency_rate_inserted, &commit, &rates, &currency]() -> void
- {
- if(currency_rate_inserted && !commit)
- rates.erase(currency);
- }
- );
+ // ...
 
-With _scope_exit_ you can simply do
+ commit = true;
 
- BOOST_SCOPE_EXIT( (currency_rate_inserted)(&commit)(&rates)(&currency) )
- {
- if(currency_rate_inserted && !commit)
- rates.erase(currency);
- } BOOST_SCOPE_EXIT_END
-
- // ...
-
- commit = true;
+Note the following issues with this approach:
 
-[h3 C++0x]
+* __Boost_Lambda__ expressions are hard to write correctly (e.g., overloaded functions must be explicitly casted, as demonstrated in the example above).
+* The condition in the `if_` expression refers to `commit` variable indirectly through the `_1` placeholder reducing readability.
+* Setting a breakpoint inside `if_[...]` requires in-depth knowledge of __Boost_Lambda__ and debugging techniques.
 
-In future releases _scope_exit_ will take advantages of C++0x features.
+This code will look much better with C++11 lambdas:
 
-* Passing capture list as _pp_seq_ will be replaced with a traditional
-macro invocation style:
+ ON_BLOCK_EXIT(
+ [currency_rate_inserted, &commit, &rates, &currency]() {
+ if(currency_rate_inserted && !commit) rates.erase(currency);
+ }
+ );
+
+ // ...
+
+ commit = true;
 
- BOOST_SCOPE_EXIT(currency_rate_inserted, &commit, &rates, &currency)
- {
- if(currency_rate_inserted && !commit)
- rates.erase(currency);
- } BOOST_SCOPE_EXIT_END
-
-* `BOOST_SCOPE_EXIT_END` will be replaced with a semicolon:
+With __Boost_ScopeExit__ we can simply do the following (see also [@../../example/scope_guard.cpp =scope_guard.cpp=]):
 
- BOOST_SCOPE_EXIT(currency_rate_inserted, &commit, &rates, &currency)
- {
- if(currency_rate_inserted && !commit)
- rates.erase(currency);
- };
+[scope_guard_exit]
 
-* Users will be able to capture local variables implicitly with lambda
-capture defaults `&` and `=`:
+[h5 The D Programming Language]
 
- BOOST_SCOPE_EXIT(&, currency_rate_inserted)
- {
- if(currency_rate_inserted && !commit)
- rates.erase(currency);
- };
+__Boost_ScopeExit__ is similar to __D_scope_exit__ feature built into the __D__ programming language.
 
-* It will be possible to capture `this` pointer.
+A curious reader may notice that the library does not implement `scope(success)` and `scope(failure)` of the __D__ language.
+Unfortunately, these are not possible in C++ because failure or success conditions cannot be determined by calling `std::uncaught_exception` (see [@http://www.gotw.ca/gotw/047.htm Guru of the Week #47] for more details about `std::uncaught_exception` and if it has any good use at all).
+However, this is not a big problem because these two __D__'s constructs can be expressed in terms of __D_scope_exit__ and a `bool commit` variable as explained in the __Tutorial__ section.
 
-[h3 The D Programming Language]
+[h5 C++11 Lambdas]
 
-_ScopeExit_ is similar to _D_scope_exit_ feature built
-into the _D_ programming language.
+Using C++11 lambdas, it is relatively easy to implement the __Boost_ScopeExit__ construct.
+For example (see also [@../../test/world_lambda.cpp =world_lambda.cpp=]):
 
-A curious reader may notice that the library doesn't implement
-`scope(success)` and `scope(failure)` of the _D_ language.
-Unfortunately, it's not possible in C++ because failure or success
-condition cannot be determined by calling `std::uncaught_exception`.
-It's not a big problem, though. These two constructs can be
-expressed in terms of _D_scope_exit_ and a `bool commit` variable
-as explained in _Tutorial_. Refer to
-[@http://www.gotw.ca/gotw/047.htm Guru of the Week #47]
-for more details about `std::uncaught_exception` and if it has
-any good use at all.
+[world_lambda]
+
+However, this library allows to program the __Boost_ScopeExit__ construct in a way that is portable between C++03 and C++11 compilers.
 
 [endsect]
 
-[section:compilers Supported Compilers]
+[section:No_Variadic_Macros Annex: No Variadic Macros]
 
-The library should be usable on any compiler that supports _typeof_
-except
+This section presents an alternative syntax for compilers without variadic macro support.
 
-* MSVC 7.1 and 8.0 fail to link if a function with _scope_exit_
-is included by multiple translation units.
-* GCC 3.3 can't compile _scope_exit_ inside a template. See
-[@http://lists.boost.org/Archives/boost/2007/02/116235.php this thread]
-for more details.
+[h5 Sequence Syntax]
 
-The author tested the library on GCC 3.3, 3.4, 4.1, 4.2 and Intel 10.1.
+Most modern compilers support variadic macros (notably, these include GCC, MSVC, and all C++11 compilers).
+However, in the rare case that programmers need to use this library on a complier without variaidc macros, this library also allows to specify the capture list using a __Boost_Preprocessor__ sequence where tokens are separated by round parenthesis `()`:
 
-[endsect]
+ (capture1) (capture2) ... // All compilers.
 
-[section:conf Configuration]
+Instead of the comma-separated list that we have seen so far which requires variadic macros:
 
-Normally, no configuration is required for the library but
-note that the library depends on _typeof_ and you may want
-to configure or enforce _typeof_emulation_.
+ capture1, capture2, ... // Only compilers with variadic macros.
 
-[endsect]
+For example, the following syntax is accepted on all compilers with and without variadic macros (see also [@../../test/world_seq.cpp =world_seq.cpp=]):
 
-[section:ref Reference]
+[world_seq]
 
-[h3 BOOST_SCOPE_EXIT]
+Furthermore, older versions of this library used to only support the __Boost_Preprocessor__ sequence syntax so the above syntax is also supported for backward compatibility.
+However, in the current version of this library and on compilers with variadic macros, the comma-separated syntax we have seen so far is preferred because more readable (see also [@../../test/world.cpp =world.cpp=]):
 
-A _scope_exit_ declaration has the following synopsis:
+[world]
 
- #include <boost/scope_exit.hpp>
+Note how the same macros accept both syntaxes on compilers with variadic macros and only the __Boost_Preprocessor__ sequence syntax on compilers without variadic macros.
+Finally, an empty capture list is always specified using `void` on compilers with and without variaidc macros (see also [@../../test/world_void.cpp =world_void.cpp=]):
 
- BOOST_SCOPE_EXIT ( scope-exit-capture-list )
- function-body
- BOOST_SCOPE_EXIT_END
+[world_void]
 
-where
+[h5 Examples]
 
- scope-exit-capture-list:
- ( scope-exit-capture )
- scope-exit-capture-list ( scope-exit-capture )
-
- scope-exit-capture:
- identifier
- &identifier
-
-The _scope_exit_ declaration schedules an execution of `scope-exit-body`
-at the end of the current scope. The `scope-exit-body` statements are
-executed in the reverse order of _scope_exit_ declarations in the given
-scope. The scope must be local.
-
-Each `identifier` in `scope-exit-capture-list` must be a valid name
-in enclosing scope and it must appear exactly once in the list.
-If a `scope-exit-capture` starts with the ampersand sign `&`, the
-corresponding `identifier` will be available inside `scope-exit-body`;
-otherwise, a copy of it will be made at the point of _scope_exit_
-declaration and that copy will be available inside `scope-exit-body`.
-In the latter case, the `idenitifer` must be `CopyConstructible`.
-
-Only identifiers listed in `scope-exit-capture-list`, static variables,
-`extern` variables and functions, and enumerations from the enclosing
-scope can be used inside the `scope-exit-body`.
-
-[note `this` pointer is not an identifier and cannot be passed to
-` scope-exit-capture-list`.]
-
-The _scope_exit_ uses _typeof_ to determine types of
-`scope-exit-capture-list` elements. In order to compile code in
-_typeof_emulation_ mode, all types should be registered with
-_typeof_REGISTER_TYPE_ or _typeof_REGISTER_TEMPLATE_ macros,
-or appropriate _typeof_ headers should be included.
-
-[h3 BOOST_SCOPE_EXIT_TPL]
-
-This macro is a workaround for various versions of gcc. These compilers
-don't compile _scope_exit_ declaration inside function templates. As a
-workaround, the `_TPL` suffix should be appended to `BOOST_SCOPE_EXIT`.
-
-The problem boils down to the following code:
-
- template<class T> void foo(T const& t) {
- int i = 0;
- struct Local {
- typedef __typeof__(i) typeof_i;
- typedef __typeof__(t) typeof_t;
- };
- typedef Local::typeof_i i_type;
- typedef Local::typeof_t t_type;
- }
-
- int main() { foo(0); }
+The following is a list of most of the examples presented in this documentation reprogrammed using the __Boost_Preprocessor__ sequence syntax instead of the comma-separated list:
 
-This can be fixed by adding `typename` in front of `Local::typeof_i` and
-`Local::typeof_t`.
+[table
+ [ [Files] ]
+ [ [[@../../test/world_checkpoint_seq.cpp =world_checkpoint_seq.cpp=]] ]
+ [ [[@../../test/world_this_seq.cpp =world_this_seq.cpp=]] ]
+ [ [[@../../test/world_checkpoint_all_seq.cpp =world_checkpoint_all_seq.cpp=]] ]
+ [ [[@../../test/world_tpl_seq.cpp =world_tpl_seq.cpp=]] ]
+ [ [[@../../example/try_catch_seq.cpp =try_catch_seq.cpp=]] ]
+ [ [[@../../example/scope_guard_seq.cpp =scope_guard_seq.cpp=]] ]
+]
 
-See also [@http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37920 GCC bug 37920].
+[endsect]
 
-[note Although `BOOST_SCOPE_EXIT_TPL` has the same suffix as the
-`BOOST_TYPEOF_TPL`, it doesn't follow a convention of the _typeof_.]
+[section:Acknowledgements Acknowledgements]
 
-[endsect]
+Alexander Nasonov is the original library author.
 
-[section:acknowledge Acknowledge]
+Lorenzo Caminiti added variadic macro support, capture of the object `this_`, empty captures using `void`, and `BOOST_SCOPE_EXIT_ALL`.
 
-(in chronological order)
+/Thanks to the following people (in chronological order)./
 
-Maxim Yegorushkin for sending me a code where he used a local struct
-to clean up resources.
+Maxim Yegorushkin for sharing code where he used a local struct to clean up resources.
 
-Andrei Alexandrescu for pointing me to _D_scope_exit_ construct of
-the _D_ programming language.
+Andrei Alexandrescu for pointing out the __D_scope_exit__ construct of the __D__ programming language.
 
-Pavel Vozenilek and Maxim Yanchenko for reviews of early drafts of
-the library.
+Pavel Vozenilek and Maxim Yanchenko for reviews of early drafts of the library.
 
 Steven Watanabe for his valuable ideas.
 
@@ -477,4 +439,7 @@
 
 Richard Webb for testing the library on MSVC compiler.
 
+Adam Butcher for a workaround to error C2355 when deducing the type of `this` on some MSVC versions.
+
 [endsect]
+

Added: trunk/libs/scope_exit/example/Jamfile.v2
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/example/Jamfile.v2 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,16 @@
+
+# Copyright (C) 2006-2009, 2012 Alexander Nasonov
+# Copyright (C) 2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://www.boost.org/libs/scope_exit
+
+import testing ;
+
+run try_catch.cpp ;
+run try_catch_seq.cpp ;
+
+run scope_guard.cpp ;
+run scope_guard_seq.cpp ;
+

Added: trunk/libs/scope_exit/example/scope_guard.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/example/scope_guard.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,37 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <map>
+#include <string>
+#include <utility>
+
+int main(void) {
+ //[scope_guard_decl
+ bool commit = false;
+ std::string currency("EUR");
+ double rate = 1.3326;
+ std::map<std::string, double> rates;
+ bool currency_rate_inserted =
+ rates.insert(std::make_pair(currency, rate)).second;
+ // Transaction...
+ //]
+
+ //[scope_guard_exit
+ BOOST_SCOPE_EXIT(currency_rate_inserted, &commit, &rates, &currency) {
+ if(currency_rate_inserted && !commit) rates.erase(currency);
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ commit = true;
+ //]
+
+ return 0;
+}
+

Added: trunk/libs/scope_exit/example/scope_guard_seq.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/example/scope_guard_seq.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,34 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <map>
+#include <string>
+#include <utility>
+
+int main(void) {
+ bool commit = false;
+ std::string currency("EUR");
+ double rate = 1.3326;
+ std::map<std::string, double> rates;
+ bool currency_rate_inserted =
+ rates.insert(std::make_pair(currency, rate)).second;
+
+ BOOST_SCOPE_EXIT( (currency_rate_inserted) (&commit) (&rates)
+ (&currency) ) {
+ if(currency_rate_inserted && !commit)
+ rates.erase(currency);
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ commit = true;
+
+ return 0;
+}
+

Added: trunk/libs/scope_exit/example/try_catch.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/example/try_catch.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <iostream>
+
+struct file {
+ file() : open_(false) {}
+ file(char const* path) : open_(false) { open(path); }
+
+ void open(char const* path) { open_ = true; }
+ void close(void) { open_ = false; }
+
+ bool is_open(void) const { return open_; }
+private:
+ bool open_;
+};
+
+void bad(void) {
+ //[try_catch_bad
+ file passwd;
+ try {
+ passwd.open("/etc/passwd");
+ // ...
+ passwd.close();
+ } catch(...) {
+ std::clog << "could not get user info" << std::endl;
+ if(passwd.is_open()) passwd.close();
+ throw;
+ }
+ //]
+}
+
+void good(void) {
+ //[try_catch_good
+ try {
+ file passwd("/etc/passwd");
+ BOOST_SCOPE_EXIT(&passwd) {
+ passwd.close();
+ } BOOST_SCOPE_EXIT_END
+ } catch(...) {
+ std::clog << "could not get user info" << std::endl;
+ throw;
+ }
+ //]
+}
+
+int main(void) {
+ bad();
+ good();
+ return 0;
+}
+

Added: trunk/libs/scope_exit/example/try_catch_seq.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/example/try_catch_seq.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <iostream>
+
+struct file {
+ file() : open_(false) {}
+ file(char const* path) : open_(false) { open(path); }
+
+ void open(char const* path) { open_ = true; }
+ void close(void) { open_ = false; }
+
+ bool is_open(void) const { return open_; }
+private:
+ bool open_;
+};
+
+void bad(void) {
+ //[try_catch_bad_seq
+ file passwd;
+ try {
+ passwd.open("/etc/passwd");
+ // ...
+ passwd.close();
+ } catch(...) {
+ std::clog << "could not get user info" << std::endl;
+ if(passwd.is_open()) passwd.close();
+ throw;
+ }
+ //]
+}
+
+void good(void) {
+ //[try_catch_good_seq
+ try {
+ file passwd("/etc/passwd");
+ BOOST_SCOPE_EXIT( (&passwd) ) {
+ passwd.close();
+ } BOOST_SCOPE_EXIT_END
+ } catch(...) {
+ std::clog << "could not get user info" << std::endl;
+ throw;
+ }
+ //]
+}
+
+int main(void) {
+ bad();
+ good();
+ return 0;
+}
+

Deleted: trunk/libs/scope_exit/example/world.cpp
==============================================================================
--- trunk/libs/scope_exit/example/world.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,114 +0,0 @@
-// Copyright Alexander Nasonov 2009
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#include <vector>
-#include <ostream>
-
-#include <boost/foreach.hpp>
-#include <boost/scope_exit.hpp>
-
-// The following is required for typeof emulation mode:
-#include <boost/typeof/typeof.hpp>
-#include <boost/typeof/std/vector.hpp>
-#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
-
-class World;
-class Person
-{
- friend class World;
-public:
- typedef unsigned int id_t;
- typedef unsigned int evolution_t;
-
- Person()
- : m_id(0)
- , m_evolution(0)
- {}
-
- friend std::ostream& operator<<(std::ostream& o, Person const& p)
- {
- return o << "Person(" << p.m_id << ", " << p.m_evolution << ')';
- }
-private:
- id_t m_id;
- evolution_t m_evolution;
-};
-
-BOOST_TYPEOF_REGISTER_TYPE(Person)
-
-class World
-{
-public:
- typedef unsigned int id_t;
-
- World()
- : m_next_id(1)
- {}
- void addPerson(Person const& aPerson);
-
- friend std::ostream& operator<<(std::ostream& o, World const& w)
- {
- o << "World(" << w.m_next_id << ", {";
- BOOST_FOREACH(Person const& p, w.m_persons)
- {
- o << ' ' << p << ',';
- }
- return o << "})";
- }
-private:
- id_t m_next_id;
- std::vector<Person> m_persons;
-};
-
-BOOST_TYPEOF_REGISTER_TYPE(World)
-
-void World::addPerson(Person const& aPerson) {
- m_persons.push_back(aPerson);
-
- // This block must be no-throw
- Person& person = m_persons.back();
- Person::evolution_t checkpoint = person.m_evolution;
-
- BOOST_SCOPE_EXIT( (checkpoint)(&person)(&m_persons) )
- {
- if(checkpoint == person.m_evolution)
- m_persons.pop_back();
- } BOOST_SCOPE_EXIT_END
-
- // ...
-
- checkpoint = ++person.m_evolution;
-
- // Assign new id to the person
- World::id_t const prev_id = person.m_id;
- person.m_id = m_next_id++;
- BOOST_SCOPE_EXIT( (checkpoint)(&person)(&m_next_id)(prev_id) )
- {
- if(checkpoint == person.m_evolution) {
- m_next_id = person.m_id;
- person.m_id = prev_id;
- }
- } BOOST_SCOPE_EXIT_END
-
- // ...
-
- checkpoint = ++person.m_evolution;
-}
-
-#include <iostream>
-
-int main()
-{
- Person adam, eva;
- std::cout << adam << '\n';
- std::cout << eva << '\n';
-
- World w;
- w.addPerson(adam);
- w.addPerson(eva);
- std::cout << w << '\n';
-}
-

Modified: trunk/libs/scope_exit/index.html
==============================================================================
--- trunk/libs/scope_exit/index.html (original)
+++ trunk/libs/scope_exit/index.html 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,16 +1,15 @@
-
-<!--
-Copyright 2009 Alexander Nasonov.
-Distributed under the Boost Software License, Version 1.0. (See accompanying
-file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
--->
-
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
-<head>
+ <head>
     <meta http-equiv="refresh" content="0; URL=doc/html/index.html">
-</head>
-<body>
-Automatic redirection failed, please go to
-doc/html/index.html
-</body>
+ </head>
+ <body>
+ Automatic redirection failed, click this
+ link &nbsp;<hr>
+ <p>© Copyright Alexander Nasonov, Lorenzo Caminiti, 2006-2012</p>
+ <p>Distributed under the Boost Software License, Version 1.0 (see
+ accompanying file <a href="../../LICENSE_1_0.txt">
+ LICENSE_1_0.txt</a> or a copy at
+ www.boost.org/LICENSE_1_0.txt)</p>
+ </body>
 </html>

Modified: trunk/libs/scope_exit/test/Jamfile.v2
==============================================================================
--- trunk/libs/scope_exit/test/Jamfile.v2 (original)
+++ trunk/libs/scope_exit/test/Jamfile.v2 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,25 +1,64 @@
-# Copyright Alexander Nasonov 2007
-#
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or copy at
-# http://www.boost.org/LICENSE_1_0.txt)
 
-# TODO: get rid of dummy .cpp files that only #include other .cpp file.
+# Copyright (C) 2006-2009, 2012 Alexander Nasonov
+# Copyright (C) 2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://www.boost.org/libs/scope_exit
 
 import testing ;
 
-run native.cpp ../../../libs/test/build//boost_test_exec_monitor : : : <define>BOOST_TYPEOF_NATIVE : ;
-run emulation.cpp ../../../libs/test/build//boost_test_exec_monitor : : : <define>BOOST_TYPEOF_EMULATION : ;
-
-run native_tpl.cpp ../../../libs/test/build//boost_test_exec_monitor : : : <define>BOOST_TYPEOF_NATIVE : ;
-run emulation_tpl.cpp ../../../libs/test/build//boost_test_exec_monitor : : : <define>BOOST_TYPEOF_EMULATION : ;
-
-compile-fail native_const_error.cpp : <define>BOOST_TYPEOF_NATIVE ;
-compile-fail emulation_const_error.cpp : <define>BOOST_TYPEOF_EMULATION ;
-
-compile-fail native_cv_error.cpp : <define>BOOST_TYPEOF_NATIVE ;
-compile-fail emulation_cv_error.cpp : <define>BOOST_TYPEOF_EMULATION ;
-
-run native_tu_test.cpp native_tu1.cpp native_tu2.cpp ../../../libs/test/build//boost_test_exec_monitor : : : <define>BOOST_TYPEOF_NATIVE : ;
-run emulation_tu_test.cpp native_tu1.cpp native_tu2.cpp ../../../libs/test/build//boost_test_exec_monitor : : : <define>BOOST_TYPEOF_EMULATION : ;
+project
+ : requirements
+ <library>/boost/test//boost_test_exec_monitor
+ <library>/boost//unit_test_framework
+ <link>static
+ ;
+
+test-suite world_tests
+ : [ run world.cpp ]
+ [ run world_seq.cpp ]
+
+ [ run world_void.cpp ]
+
+ [ run world_this.cpp ]
+ [ run world_this_seq.cpp ]
+
+ [ run world_tpl.cpp ]
+ [ run world_tpl_seq.cpp ]
+
+ [ run world_checkpoint.cpp ]
+ [ run world_checkpoint_seq.cpp ]
+
+ [ run world_checkpoint_all.cpp ]
+ [ run world_checkpoint_all_seq.cpp ]
+
+ [ run world_lambda.cpp ]
+ ;
+
+test-suite native_tests
+ : [ run native.cpp : : : <define>BOOST_TYPEOF_NATIVE ]
+ [ run native_tpl.cpp : : : <define>BOOST_TYPEOF_NATIVE ]
+ [ run native_this.cpp : : : <define>BOOST_TYPEOF_NATIVE ]
+ [ compile-fail native_const_error.cpp : <define>BOOST_TYPEOF_NATIVE ]
+ [ compile-fail native_cv_error.cpp : <define>BOOST_TYPEOF_NATIVE ]
+ # Following test is known to fail on MSVC 7.1 and 8.0.
+ [ run native_tu_test.cpp native_tu1.cpp native_tu2.cpp : : :
+ <define>BOOST_TYPEOF_NATIVE ]
+ ;
+
+test-suite emulation_tests
+ : [ run native.cpp : : : <define>BOOST_TYPEOF_EMULATION : emulation : ]
+ [ run native_tpl.cpp : : : <define>BOOST_TYPEOF_EMULATION :
+ emulation_tpl : ]
+ [ run native_this.cpp : : : <define>BOOST_TYPEOF_EMULATION :
+ emulation_this : ]
+ [ compile-fail native_const_error.cpp : <define>BOOST_TYPEOF_EMULATION :
+ emulation_const_error : ]
+ [ compile-fail native_cv_error.cpp : <define>BOOST_TYPEOF_EMULATION :
+ emulation_cv_error : ]
+ # Following test is known to fail on MSVC 7.1 and 8.0.
+ [ run native_tu_test.cpp native_tu1.cpp native_tu2.cpp : : :
+ <define>BOOST_TYPEOF_EMULATION : emulation_tu_test : ]
+ ;
 

Deleted: trunk/libs/scope_exit/test/emulation.cpp
==============================================================================
--- trunk/libs/scope_exit/test/emulation.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,8 +0,0 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#include "native.cpp"
-

Deleted: trunk/libs/scope_exit/test/emulation_const_error.cpp
==============================================================================
--- trunk/libs/scope_exit/test/emulation_const_error.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,7 +0,0 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#include "native_const_error.cpp"

Deleted: trunk/libs/scope_exit/test/emulation_cv_error.cpp
==============================================================================
--- trunk/libs/scope_exit/test/emulation_cv_error.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,7 +0,0 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#include "native_cv_error.cpp"

Deleted: trunk/libs/scope_exit/test/emulation_tpl.cpp
==============================================================================
--- trunk/libs/scope_exit/test/emulation_tpl.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,8 +0,0 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#include "native_tpl.cpp"
-

Deleted: trunk/libs/scope_exit/test/emulation_tu_test.cpp
==============================================================================
--- trunk/libs/scope_exit/test/emulation_tu_test.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
+++ (empty file)
@@ -1,7 +0,0 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#include "native_tu_test.cpp"

Modified: trunk/libs/scope_exit/test/native.cpp
==============================================================================
--- trunk/libs/scope_exit/test/native.cpp (original)
+++ trunk/libs/scope_exit/test/native.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,140 +1,122 @@
-// Copyright Alexander Nasonov 2007-2008, 2011
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
 
-#include <iostream>
-#include <ostream>
-#include <string>
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
 
 #include <boost/scope_exit.hpp>
-
 #include <boost/typeof/typeof.hpp>
 #include <boost/typeof/std/string.hpp>
 #include <boost/test/unit_test.hpp>
+#include <iostream>
+#include <ostream>
+#include <string>
 
 using namespace boost::unit_test;
 
 std::string g_str;
 
 template<int Dummy = 0>
-struct Holder
-{
+struct Holder {
     static long g_long;
 };
 
 template<int Dummy> long Holder<Dummy>::g_long;
 
-void test_non_local()
-{
+void test_non_local(void) {
     // ... and one local variable as well:
     int i = 0;
 
- BOOST_SCOPE_EXIT( (i) )
- {
- BOOST_CHECK(i == 0);
- BOOST_CHECK(Holder<>::g_long == 3);
- BOOST_CHECK(g_str == "try: g_str");
+ BOOST_SCOPE_EXIT(void) {
+ BOOST_CHECK( Holder<>::g_long == 3 );
     } BOOST_SCOPE_EXIT_END
 
- BOOST_SCOPE_EXIT( (&i) )
- {
- BOOST_CHECK(i == 3);
- BOOST_CHECK(Holder<>::g_long == 3);
- BOOST_CHECK(g_str == "try: g_str");
+ BOOST_SCOPE_EXIT(i) {
+ BOOST_CHECK( i == 0 );
+ BOOST_CHECK( Holder<>::g_long == 3 );
+ BOOST_CHECK( g_str == "try: g_str" );
+ } BOOST_SCOPE_EXIT_END
+
+ BOOST_SCOPE_EXIT(&i) {
+ BOOST_CHECK( i == 3 );
+ BOOST_CHECK( Holder<>::g_long == 3 );
+ BOOST_CHECK( g_str == "try: g_str" );
     } BOOST_SCOPE_EXIT_END
 
     {
         g_str = "";
         Holder<>::g_long = 1;
 
- BOOST_SCOPE_EXIT( (&i) )
- {
+ BOOST_SCOPE_EXIT(&i) {
             i = 1;
             g_str = "g_str";
         } BOOST_SCOPE_EXIT_END
 
- BOOST_SCOPE_EXIT( (&i) )
- {
- try
- {
- i = 2;
- Holder<>::g_long = 2;
- throw 0;
- } catch(...) {}
+ BOOST_SCOPE_EXIT(&i) {
+ try {
+ i = 2;
+ Holder<>::g_long = 2;
+ throw 0;
+ } catch(...) {}
         } BOOST_SCOPE_EXIT_END
 
- BOOST_CHECK(i == 0);
- BOOST_CHECK(g_str == "");
- BOOST_CHECK(Holder<>::g_long == 1);
+ BOOST_CHECK( i == 0 );
+ BOOST_CHECK( g_str == "" );
+ BOOST_CHECK( Holder<>::g_long == 1 );
     }
 
- BOOST_CHECK(Holder<>::g_long == 2);
- BOOST_CHECK(g_str == "g_str");
- BOOST_CHECK(i == 1); // Check that first declared is executed last
-
- BOOST_SCOPE_EXIT( (&i) )
- {
- BOOST_CHECK(i == 3);
- BOOST_CHECK(Holder<>::g_long == 3);
- BOOST_CHECK(g_str == "try: g_str");
+ BOOST_CHECK( Holder<>::g_long == 2 );
+ BOOST_CHECK( g_str == "g_str" );
+ BOOST_CHECK( i == 1 ); // Check that first declared is executed last.
+
+ BOOST_SCOPE_EXIT(&i) {
+ BOOST_CHECK( i == 3 );
+ BOOST_CHECK( Holder<>::g_long == 3 );
+ BOOST_CHECK( g_str == "try: g_str" );
     } BOOST_SCOPE_EXIT_END
 
- BOOST_SCOPE_EXIT( (i) )
- {
- BOOST_CHECK(i == 1);
- BOOST_CHECK(Holder<>::g_long == 3);
- BOOST_CHECK(g_str == "try: g_str");
+ BOOST_SCOPE_EXIT(i) {
+ BOOST_CHECK( i == 1 );
+ BOOST_CHECK( Holder<>::g_long == 3 );
+ BOOST_CHECK( g_str == "try: g_str" );
     } BOOST_SCOPE_EXIT_END
 
- try
- {
- BOOST_SCOPE_EXIT( (&i) )
- {
+ try {
+ BOOST_SCOPE_EXIT(&i) {
             i = 3;
             g_str = "try: g_str";
         } BOOST_SCOPE_EXIT_END
         
- BOOST_SCOPE_EXIT( (&i) )
- {
+ BOOST_SCOPE_EXIT(&i) {
             i = 4;
             Holder<>::g_long = 3;
         } BOOST_SCOPE_EXIT_END
 
- BOOST_CHECK(i == 1);
- BOOST_CHECK(g_str == "g_str");
- BOOST_CHECK(Holder<>::g_long == 2);
+ BOOST_CHECK( i == 1 );
+ BOOST_CHECK( g_str == "g_str" );
+ BOOST_CHECK( Holder<>::g_long == 2 );
 
         throw 0;
- }
- catch(int)
- {
- BOOST_CHECK(Holder<>::g_long == 3);
- BOOST_CHECK(g_str == "try: g_str");
- BOOST_CHECK(i == 3); // Check that first declared is executed last
+ } catch(int) {
+ BOOST_CHECK( Holder<>::g_long == 3 );
+ BOOST_CHECK( g_str == "try: g_str" );
+ BOOST_CHECK( i == 3 ); // Check that first declared is executed last.
     }
 }
 
-bool foo()
-{
- return true;
-}
+bool foo(void) { return true; }
 
-bool foo2()
-{
- return false;
-}
+bool foo2(void) { return false; }
 
-void test_types()
-{
- bool (*pf)() = 0;
- bool (&rf)() = foo;
+void test_types(void) {
+ bool (*pf)(void) = 0;
+ bool (&rf)(void) = foo;
     bool results[2] = {};
 
     {
- BOOST_SCOPE_EXIT( (&results)(&pf)(&rf) )
- {
+ BOOST_SCOPE_EXIT(&results, &pf, &rf) {
             results[0] = pf();
             results[1] = rf();
         }
@@ -142,16 +124,15 @@
 
         pf = &foo;
 
- BOOST_CHECK(results[0] == false);
- BOOST_CHECK(results[1] == false);
+ BOOST_CHECK( results[0] == false );
+ BOOST_CHECK( results[1] == false );
     }
 
- BOOST_CHECK(results[0] == true);
- BOOST_CHECK(results[1] == true);
+ BOOST_CHECK( results[0] == true );
+ BOOST_CHECK( results[1] == true );
 
     {
- BOOST_SCOPE_EXIT( (&results)(pf) )
- {
+ BOOST_SCOPE_EXIT(&results, pf) {
             results[0] = !pf();
             results[1] = !pf();
             pf = &foo2; // modify a copy
@@ -160,61 +141,56 @@
 
         pf = 0;
 
- BOOST_CHECK(results[0] == true);
- BOOST_CHECK(results[1] == true);
+ BOOST_CHECK( results[0] == true );
+ BOOST_CHECK( results[1] == true );
     }
 
- BOOST_CHECK(pf == 0);
- BOOST_CHECK(results[0] == false);
- BOOST_CHECK(results[1] == false);
+ BOOST_CHECK( pf == 0 );
+ BOOST_CHECK( results[0] == false );
+ BOOST_CHECK( results[1] == false );
 }
 
-void test_cxx0x()
-{
-#if defined(BOOST_SCOPE_EXIT_AUX_CXX0X)
+void test_cpp11(void) {
+#if !defined(BOOST_NO_LAMBDAS) && !defined(BOOST_SCOPE_EXIT_CONFIG_NO_CPP11)
     int i = 0, j = 1;
 
     {
- BOOST_SCOPE_EXIT((=))
- {
+ BOOST_SCOPE_EXIT_ALL(=) {
             i = j = 1; // modify copies
         };
     }
- BOOST_CHECK(i == 0);
- BOOST_CHECK(j == 1);
+ BOOST_CHECK( i == 0 );
+ BOOST_CHECK( j == 1 );
 
     {
- BOOST_SCOPE_EXIT((&))
- {
+ BOOST_SCOPE_EXIT_ALL(&) {
             i = 1;
             j = 2;
         };
- BOOST_CHECK(i == 0);
- BOOST_CHECK(j == 1);
+ BOOST_CHECK( i == 0 );
+ BOOST_CHECK( j == 1 );
     }
- BOOST_CHECK(i == 1);
- BOOST_CHECK(j == 2);
+ BOOST_CHECK( i == 1 );
+ BOOST_CHECK( j == 2 );
 
     {
- BOOST_SCOPE_EXIT((=)(&j))
- {
+ BOOST_SCOPE_EXIT_ALL(=, &j) {
             i = 2; // modify a copy
             j = 3;
         };
- BOOST_CHECK(i == 1);
- BOOST_CHECK(j == 2);
+ BOOST_CHECK( i == 1 );
+ BOOST_CHECK( j == 2 );
     }
- BOOST_CHECK(i == 1);
- BOOST_CHECK(j == 3);
-
+ BOOST_CHECK( i == 1 );
+ BOOST_CHECK( j == 3 );
 #endif
 }
 
-test_suite* init_unit_test_suite( int, char* [] )
-{
+test_suite* init_unit_test_suite(int, char* []) {
     framework::master_test_suite().p_name.value = "Unit test for ScopeExit";
- framework::master_test_suite().add( BOOST_TEST_CASE( &test_non_local ));
- framework::master_test_suite().add( BOOST_TEST_CASE( &test_types ));
- framework::master_test_suite().add( BOOST_TEST_CASE( &test_cxx0x ));
+ framework::master_test_suite().add(BOOST_TEST_CASE(&test_non_local));
+ framework::master_test_suite().add(BOOST_TEST_CASE(&test_types));
+ framework::master_test_suite().add(BOOST_TEST_CASE(&test_cpp11));
     return 0;
 }
+

Modified: trunk/libs/scope_exit/test/native_const_error.cpp
==============================================================================
--- trunk/libs/scope_exit/test/native_const_error.cpp (original)
+++ trunk/libs/scope_exit/test/native_const_error.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,16 +1,16 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
 
 #include <boost/scope_exit.hpp>
 
-int main()
-{
+int main(void) {
     int const i = 0;
- BOOST_SCOPE_EXIT( (&i) )
- {
+ BOOST_SCOPE_EXIT(&i) {
         i = 5;
     } BOOST_SCOPE_EXIT_END
 }

Modified: trunk/libs/scope_exit/test/native_cv_error.cpp
==============================================================================
--- trunk/libs/scope_exit/test/native_cv_error.cpp (original)
+++ trunk/libs/scope_exit/test/native_cv_error.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,21 +1,19 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
 
-#include <string>
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
 
 #include <boost/scope_exit.hpp>
-
 #include <boost/typeof/typeof.hpp>
 #include <boost/typeof/std/string.hpp>
+#include <string>
 
-int main()
-{
+int main(void) {
     std::string const volatile s;
- BOOST_SCOPE_EXIT( (&s) )
- {
+ BOOST_SCOPE_EXIT(&s) {
         s = "";
     } BOOST_SCOPE_EXIT_END
 }

Added: trunk/libs/scope_exit/test/native_this.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/native_this.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <boost/typeof/typeof.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#include <boost/test/unit_test.hpp>
+
+using namespace boost::unit_test;
+
+struct this_tester;
+BOOST_TYPEOF_REGISTER_TYPE(this_tester) // Register before capture of `this_`.
+
+struct this_tester {
+ void check(void) {
+ int target;
+ BOOST_SCOPE_EXIT(&target, this_) {
+ BOOST_CHECK( this_->value_ == target );
+ } BOOST_SCOPE_EXIT_END
+#if !defined(BOOST_NO_LAMBDAS) && !defined(BOOST_SCOPE_EXIT_CONFIG_NO_CPP11)
+ BOOST_SCOPE_EXIT_ALL(&, this) {
+ BOOST_CHECK( this->value_ == target );
+ };
+#endif
+ value_ = target = 3;
+ }
+private:
+ int value_;
+};
+
+void test_this(void) { this_tester().check(); }
+
+test_suite* init_unit_test_suite(int, char* []) {
+ framework::master_test_suite().p_name.value = "Unit test for ScopeExit";
+ framework::master_test_suite().add(BOOST_TEST_CASE(&test_this));
+ return 0;
+}
+

Modified: trunk/libs/scope_exit/test/native_tpl.cpp
==============================================================================
--- trunk/libs/scope_exit/test/native_tpl.cpp (original)
+++ trunk/libs/scope_exit/test/native_tpl.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,76 +1,71 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
 
-#include <iostream>
-#include <ostream>
-#include <vector>
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
 
 #include <boost/scope_exit.hpp>
-
 #include <boost/rational.hpp>
 #include <boost/typeof/typeof.hpp>
 #include <boost/typeof/std/vector.hpp>
 #include <boost/test/unit_test.hpp>
+#include <iostream>
+#include <ostream>
+#include <vector>
 
 using namespace boost::unit_test;
 
 template<class type>
-void tpl_long( type tval
- , type& t
- , type const& tc
- , type volatile& tv
- , type const volatile& tcv
- )
-{
+void tpl_long(
+ type tval
+ , type & t
+ , type const& tc
+ , type volatile& tv
+ , type const volatile& tcv
+) {
     int i = 0; // non-dependent name
     type const remember(tval);
 
     {
- BOOST_SCOPE_EXIT_TPL( (&tval)(&t)(&tc)(&tv)(&tcv)(&i) )
- {
+ BOOST_SCOPE_EXIT_TPL(&tval, &t, &tc, &tv, &tcv, &i) {
             tval = 1;
             ++t;
             ++tv;
- }
- BOOST_SCOPE_EXIT_END
+ } BOOST_SCOPE_EXIT_END
 
- BOOST_CHECK(t == remember);
- BOOST_CHECK(tval == remember);
+ BOOST_CHECK( t == remember );
+ BOOST_CHECK( tval == remember );
     }
 
- BOOST_CHECK(tval == 1);
- BOOST_CHECK(t == remember + 2);
+ BOOST_CHECK( tval == 1 );
+ BOOST_CHECK( t == remember + 2 );
 }
 
 template<class Vector, int Value>
-void tpl_vector( Vector vval
- , Vector& v
- , Vector const& vc
- )
-{
+void tpl_vector(
+ Vector vval
+ , Vector & v
+ , Vector const& vc
+) {
     Vector const remember(vval);
 
     {
- BOOST_SCOPE_EXIT_TPL( (&vval)(&v)(&vc) )
- {
+ BOOST_SCOPE_EXIT_TPL(&vval, &v, &vc) {
             v.push_back(-Value);
             vval.push_back(Value);
- }
- BOOST_SCOPE_EXIT_END
+ } BOOST_SCOPE_EXIT_END
 
- BOOST_CHECK(v.size() == remember.size());
- BOOST_CHECK(vval.size() == remember.size());
+ BOOST_CHECK( v.size() == remember.size() );
+ BOOST_CHECK( vval.size() == remember.size() );
     }
 
- BOOST_CHECK(v.size() == 1 + remember.size());
- BOOST_CHECK(vval.size() == 1 + remember.size());
+ BOOST_CHECK( v.size() == 1 + remember.size() );
+ BOOST_CHECK( vval.size() == 1 + remember.size() );
 }
 
-void test_tpl()
-{
+void test_tpl(void) {
     long l = 137;
     tpl_long(l, l, l, l, l);
 
@@ -78,10 +73,9 @@
     tpl_vector<std::vector<int>, 13>(v, v, v);
 }
 
-test_suite* init_unit_test_suite( int, char* [] )
-{
+test_suite* init_unit_test_suite(int, char* []) {
     framework::master_test_suite().p_name.value = "Unit test for ScopeExit TPL";
- framework::master_test_suite().add( BOOST_TEST_CASE( &test_tpl ));
+ framework::master_test_suite().add(BOOST_TEST_CASE(&test_tpl));
     return 0;
 }
 

Modified: trunk/libs/scope_exit/test/native_tu1.cpp
==============================================================================
--- trunk/libs/scope_exit/test/native_tu1.cpp (original)
+++ trunk/libs/scope_exit/test/native_tu1.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,13 +1,14 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
 
 #include "tu_test.hpp"
 
-int tu1()
-{
+int tu1(void) {
     return inline_f() + template_f(1);
 }
 

Modified: trunk/libs/scope_exit/test/native_tu2.cpp
==============================================================================
--- trunk/libs/scope_exit/test/native_tu2.cpp (original)
+++ trunk/libs/scope_exit/test/native_tu2.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,13 +1,14 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
 
 #include "tu_test.hpp"
 
-int tu2()
-{
+int tu2(void) {
     return inline_f() + template_f(2);
 }
 

Modified: trunk/libs/scope_exit/test/native_tu_test.cpp
==============================================================================
--- trunk/libs/scope_exit/test/native_tu_test.cpp (original)
+++ trunk/libs/scope_exit/test/native_tu_test.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,24 +1,24 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
 
 #include "tu_test.hpp"
-
 #include <boost/test/unit_test.hpp>
 
 using namespace boost::unit_test;
 
-void test()
-{
- BOOST_CHECK(tu1() == 1);
- BOOST_CHECK(tu2() == 2);
+void test(void) {
+ BOOST_CHECK( tu1() == 1 );
+ BOOST_CHECK( tu2() == 2 );
 }
 
-test_suite* init_unit_test_suite( int, char* [] )
-{
+test_suite* init_unit_test_suite(int, char* []) {
     framework::master_test_suite().p_name.value = "TU unit test for ScopeExit";
- framework::master_test_suite().add( BOOST_TEST_CASE( &test ));
+ framework::master_test_suite().add(BOOST_TEST_CASE(&test));
     return 0;
 }
+

Modified: trunk/libs/scope_exit/test/tu_test.hpp
==============================================================================
--- trunk/libs/scope_exit/test/tu_test.hpp (original)
+++ trunk/libs/scope_exit/test/tu_test.hpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -1,37 +1,36 @@
-// Copyright Alexander Nasonov 2007-2008
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
 
 #include <boost/scope_exit.hpp>
 
-int tu1();
-int tu2();
+int tu1(void);
+int tu2(void);
 
-inline int inline_f()
-{
+inline int inline_f(void) {
     int i = 99;
     {
- BOOST_SCOPE_EXIT( (&i) ) { i = -1; } BOOST_SCOPE_EXIT_END
+ BOOST_SCOPE_EXIT(&i) { i = -1; } BOOST_SCOPE_EXIT_END
     }
     return i;
 }
 
 #if !defined(BOOST_SCOPE_EXIT_AUX_GCC) || BOOST_SCOPE_EXIT_AUX_GCC >= 304
 template<class Int>
-Int template_f(Int i)
-{
+Int template_f(Int i) {
     {
- BOOST_SCOPE_EXIT_TPL( (&i) ) { ++i; } BOOST_SCOPE_EXIT_END
+ BOOST_SCOPE_EXIT_TPL(&i) { ++i; } BOOST_SCOPE_EXIT_END
     }
     return i;
 }
 #else
-inline int template_f(int i)
-{
+inline int template_f(int i) {
     {
- BOOST_SCOPE_EXIT( (&i) ) { ++i; } BOOST_SCOPE_EXIT_END
+ BOOST_SCOPE_EXIT(&i) { ++i; } BOOST_SCOPE_EXIT_END
     }
     return i;
 }

Added: trunk/libs/scope_exit/test/world.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,48 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorld
+#include <boost/test/unit_test.hpp>
+#include <vector>
+
+struct person; BOOST_TYPEOF_REGISTER_TYPE(person)
+struct person {};
+
+struct world; BOOST_TYPEOF_REGISTER_TYPE(world)
+struct world {
+ void add_person(person const& a_person);
+ std::vector<person> persons_;
+};
+
+//[world
+void world::add_person(person const& a_person) {
+ bool commit = false;
+
+ persons_.push_back(a_person); // (1) direct action
+ // Following block is executed when the enclosing scope exits.
+ BOOST_SCOPE_EXIT(&commit, &persons_) {
+ if(!commit) persons_.pop_back(); // (2) rollback action
+ } BOOST_SCOPE_EXIT_END
+
+ // ... // (3) other operations
+
+ commit = true; // (4) disable rollback actions
+}
+//]
+
+BOOST_AUTO_TEST_CASE( test_world ) {
+ world w;
+ person p;
+ w.add_person(p);
+ BOOST_CHECK( w.persons_.size() == 1 );
+}
+

Added: trunk/libs/scope_exit/test/world_checkpoint.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_checkpoint.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,109 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <boost/foreach.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorldCheckpoint
+#include <boost/test/unit_test.hpp>
+#include <vector>
+#include <iostream>
+#include <sstream>
+
+class person; BOOST_TYPEOF_REGISTER_TYPE(person)
+class person {
+ friend class world;
+public:
+ typedef unsigned int id_t;
+ typedef unsigned int evolution_t;
+
+ person(void) : id_(0), evolution_(0) {}
+
+ friend std::ostream& operator<<(std::ostream& o, person const& p) {
+ return o << "person(" << p.id_ << ", " << p.evolution_ << ")";
+ }
+private:
+ id_t id_;
+ evolution_t evolution_;
+};
+
+class world; BOOST_TYPEOF_REGISTER_TYPE(world)
+class world {
+public:
+ typedef unsigned int id_t;
+
+ world(void) : next_id_(1) {}
+
+ void add_person(person const& a_person);
+
+ friend std::ostream& operator<<(std::ostream& o, world const& w) {
+ o << "world(" << w.next_id_ << ", {";
+ BOOST_FOREACH(person const& p, w.persons_) {
+ o << " " << p << ", ";
+ }
+ return o << "})";
+ }
+private:
+ id_t next_id_;
+ std::vector<person> persons_;
+};
+
+//[world_checkpoint
+void world::add_person(person const& a_person) {
+ persons_.push_back(a_person);
+
+ // This block must be no-throw.
+ person& p = persons_.back();
+ person::evolution_t checkpoint = p.evolution_;
+ BOOST_SCOPE_EXIT(checkpoint, &p, &persons_) {
+ if(checkpoint == p.evolution_) persons_.pop_back();
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ checkpoint = ++p.evolution_;
+
+ // Assign new identifier to the person.
+ world::id_t const prev_id = p.id_;
+ p.id_ = next_id_++;
+ BOOST_SCOPE_EXIT(checkpoint, &p, &next_id_, prev_id) {
+ if(checkpoint == p.evolution_) {
+ next_id_ = p.id_;
+ p.id_ = prev_id;
+ }
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ checkpoint = ++p.evolution_;
+}
+//]
+
+BOOST_AUTO_TEST_CASE( test_world_checkpoint ) {
+ person adam, eva;
+ std::ostringstream oss;
+ oss << adam;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "person(0, 0)" );
+
+ oss.str("");
+ oss << eva;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "person(0, 0)" );
+
+ world w;
+ w.add_person(adam);
+ w.add_person(eva);
+ oss.str("");
+ oss << w;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "world(3, { person(1, 2), person(2, 2), })" );
+}
+

Added: trunk/libs/scope_exit/test/world_checkpoint_all.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_checkpoint_all.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,118 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/config.hpp>
+#ifndef BOOST_NO_LAMBDAS
+
+#include <boost/scope_exit.hpp>
+#include <boost/foreach.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorldCheckpointAll
+#include <boost/test/unit_test.hpp>
+#include <vector>
+#include <iostream>
+#include <sstream>
+
+class person; BOOST_TYPEOF_REGISTER_TYPE(person)
+class person {
+ friend class world;
+public:
+ typedef unsigned int id_t;
+ typedef unsigned int evolution_t;
+
+ person(void) : id_(0), evolution_(0) {}
+
+ friend std::ostream& operator<<(std::ostream& o, person const& p) {
+ return o << "person(" << p.id_ << ", " << p.evolution_ << ")";
+ }
+private:
+ id_t id_;
+ evolution_t evolution_;
+};
+
+class world; BOOST_TYPEOF_REGISTER_TYPE(world)
+class world {
+public:
+ typedef unsigned int id_t;
+
+ world(void) : next_id_(1) {}
+
+ void add_person(person const& a_person);
+
+ friend std::ostream& operator<<(std::ostream& o, world const& w) {
+ o << "world(" << w.next_id_ << ", {";
+ BOOST_FOREACH(person const& p, w.persons_) {
+ o << " " << p << ", ";
+ }
+ return o << "})";
+ }
+private:
+ id_t next_id_;
+ std::vector<person> persons_;
+};
+
+//[world_checkpoint_all
+void world::add_person(person const& a_person) {
+ persons_.push_back(a_person);
+
+ // This block must be no-throw.
+ person& p = persons_.back();
+ person::evolution_t checkpoint = p.evolution_;
+ BOOST_SCOPE_EXIT_ALL(&, checkpoint, this_) { // Capture all by ref (C++11).
+ if(checkpoint == p.evolution_) this_->persons_.pop_back();
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ checkpoint = ++p.evolution_;
+
+ // Assign new identifier to the person.
+ world::id_t const prev_id = p.id_;
+ p.id_ = next_id_++;
+ BOOST_SCOPE_EXIT_ALL(=, &p, this) { // Capture all by value, `this` (C++11).
+ if(checkpoint == p.evolution_) {
+ this->next_id_ = p.id_;
+ p.id_ = prev_id;
+ }
+ }; // Use `;` instead of `SCOPE_EXIT_END` (C++11).
+
+ // ...
+
+ checkpoint = ++p.evolution_;
+}
+//]
+
+BOOST_AUTO_TEST_CASE( test_world_checkpoint_all ) {
+ person adam, eva;
+ std::ostringstream oss;
+ oss << adam;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "person(0, 0)" );
+
+ oss.str("");
+ oss << eva;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "person(0, 0)" );
+
+ world w;
+ w.add_person(adam);
+ w.add_person(eva);
+ oss.str("");
+ oss << w;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "world(3, { person(1, 2), person(2, 2), })" );
+}
+
+#else // No lambdas (trivial test).
+
+int main(void) { return 0; }
+
+#endif
+

Added: trunk/libs/scope_exit/test/world_checkpoint_all_seq.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_checkpoint_all_seq.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,118 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/config.hpp>
+#ifndef BOOST_NO_LAMBDAS
+
+#include <boost/scope_exit.hpp>
+#include <boost/foreach.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorldCheckpointAllSeq
+#include <boost/test/unit_test.hpp>
+#include <vector>
+#include <iostream>
+#include <sstream>
+
+class person; BOOST_TYPEOF_REGISTER_TYPE(person)
+class person {
+ friend class world;
+public:
+ typedef unsigned int id_t;
+ typedef unsigned int evolution_t;
+
+ person(void) : id_(0), evolution_(0) {}
+
+ friend std::ostream& operator<<(std::ostream& o, person const& p) {
+ return o << "person(" << p.id_ << ", " << p.evolution_ << ")";
+ }
+private:
+ id_t id_;
+ evolution_t evolution_;
+};
+
+class world; BOOST_TYPEOF_REGISTER_TYPE(world)
+class world {
+public:
+ typedef unsigned int id_t;
+
+ world(void) : next_id_(1) {}
+
+ void add_person(person const& a_person);
+
+ friend std::ostream& operator<<(std::ostream& o, world const& w) {
+ o << "world(" << w.next_id_ << ", {";
+ BOOST_FOREACH(person const& p, w.persons_) {
+ o << " " << p << ", ";
+ }
+ return o << "})";
+ }
+private:
+ id_t next_id_;
+ std::vector<person> persons_;
+};
+
+//[world_checkpoint_all_seq
+void world::add_person(person const& a_person) {
+ persons_.push_back(a_person);
+
+ // This block must be no-throw.
+ person& p = persons_.back();
+ person::evolution_t checkpoint = p.evolution_;
+ BOOST_SCOPE_EXIT_ALL( (&) (checkpoint) (this_) ) {
+ if(checkpoint == p.evolution_) this_->persons_.pop_back();
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ checkpoint = ++p.evolution_;
+
+ // Assign new identifier to the person.
+ world::id_t const prev_id = p.id_;
+ p.id_ = next_id_++;
+ BOOST_SCOPE_EXIT_ALL( (=) (&p) (this) ) {
+ if(checkpoint == p.evolution_) {
+ this->next_id_ = p.id_;
+ p.id_ = prev_id;
+ }
+ };
+
+ // ...
+
+ checkpoint = ++p.evolution_;
+}
+//]
+
+BOOST_AUTO_TEST_CASE( test_world_checkpoint_all_seq ) {
+ person adam, eva;
+ std::ostringstream oss;
+ oss << adam;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "person(0, 0)" );
+
+ oss.str("");
+ oss << eva;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "person(0, 0)" );
+
+ world w;
+ w.add_person(adam);
+ w.add_person(eva);
+ oss.str("");
+ oss << w;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "world(3, { person(1, 2), person(2, 2), })" );
+}
+
+#else // No lambdas (trivial test).
+
+int main(void) { return 0; }
+
+#endif
+

Added: trunk/libs/scope_exit/test/world_checkpoint_seq.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_checkpoint_seq.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,109 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <boost/foreach.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorldCheckpointSeq
+#include <boost/test/unit_test.hpp>
+#include <vector>
+#include <iostream>
+#include <sstream>
+
+class person; BOOST_TYPEOF_REGISTER_TYPE(person)
+class person {
+ friend class world;
+public:
+ typedef unsigned int id_t;
+ typedef unsigned int evolution_t;
+
+ person(void) : id_(0), evolution_(0) {}
+
+ friend std::ostream& operator<<(std::ostream& o, person const& p) {
+ return o << "person(" << p.id_ << ", " << p.evolution_ << ")";
+ }
+private:
+ id_t id_;
+ evolution_t evolution_;
+};
+
+class world; BOOST_TYPEOF_REGISTER_TYPE(world)
+class world {
+public:
+ typedef unsigned int id_t;
+
+ world(void) : next_id_(1) {}
+
+ void add_person(person const& a_person);
+
+ friend std::ostream& operator<<(std::ostream& o, world const& w) {
+ o << "world(" << w.next_id_ << ", {";
+ BOOST_FOREACH(person const& p, w.persons_) {
+ o << " " << p << ", ";
+ }
+ return o << "})";
+ }
+private:
+ id_t next_id_;
+ std::vector<person> persons_;
+};
+
+//[world_checkpoint_seq
+void world::add_person(person const& a_person) {
+ persons_.push_back(a_person);
+
+ // This block must be no-throw.
+ person& p = persons_.back();
+ person::evolution_t checkpoint = p.evolution_;
+ BOOST_SCOPE_EXIT( (checkpoint) (&p) (&persons_) ) { // Sequence, not commas.
+ if(checkpoint == p.evolution_) persons_.pop_back();
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ checkpoint = ++p.evolution_;
+
+ // Assign new identifier to the person.
+ world::id_t const prev_id = p.id_;
+ p.id_ = next_id_++;
+ BOOST_SCOPE_EXIT( (checkpoint) (&p) (&next_id_) (prev_id) ) {
+ if(checkpoint == p.evolution_) {
+ next_id_ = p.id_;
+ p.id_ = prev_id;
+ }
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ checkpoint = ++p.evolution_;
+}
+//]
+
+BOOST_AUTO_TEST_CASE( test_world_checkpoint_seq ) {
+ person adam, eva;
+ std::ostringstream oss;
+ oss << adam;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "person(0, 0)" );
+
+ oss.str("");
+ oss << eva;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "person(0, 0)" );
+
+ world w;
+ w.add_person(adam);
+ w.add_person(eva);
+ oss.str("");
+ oss << w;
+ std::cout << oss.str() << std::endl;
+ BOOST_CHECK( oss.str() == "world(3, { person(1, 2), person(2, 2), })" );
+}
+

Added: trunk/libs/scope_exit/test/world_lambda.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_lambda.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,59 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/config.hpp>
+#ifndef BOOST_NO_LAMBDAS
+
+#define BOOST_TEST_MODULE TestWorldLambda
+#include <boost/test/unit_test.hpp>
+#include <vector>
+
+struct person {};
+
+struct world {
+ void add_person(person const& a_person);
+ std::vector<person> persons_;
+};
+
+//[world_lambda
+#include <functional>
+
+struct scope_exit {
+ scope_exit(std::function<void (void)> f) : f_(f) {}
+ ~scope_exit(void) { f_(); }
+private:
+ std::function<void (void)> f_;
+};
+
+void world::add_person(person const& a_person) {
+ bool commit = false;
+
+ persons_.push_back(a_person);
+ scope_exit on_exit1([&commit, &persons_]() { // Use C++11 lambda.
+ if(!commit) persons_.pop_back();
+ });
+
+ // ...
+
+ commit = true;
+}
+//]
+
+BOOST_AUTO_TEST_CASE( test_world_lambda ) {
+ world w;
+ person p;
+ w.add_person(p);
+ BOOST_CHECK( w.persons_.size() == 1 );
+}
+
+#else // No lambdas (trivial test).
+
+int main(void) { return 0; }
+
+#endif
+

Added: trunk/libs/scope_exit/test/world_seq.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_seq.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,47 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorldSeq
+#include <boost/test/unit_test.hpp>
+#include <vector>
+
+struct person; BOOST_TYPEOF_REGISTER_TYPE(person)
+struct person {};
+
+struct world; BOOST_TYPEOF_REGISTER_TYPE(world)
+struct world {
+ void add_person(person const& a_person);
+ std::vector<person> persons_;
+};
+
+//[world_seq
+void world::add_person(person const& a_person) {
+ bool commit = false;
+
+ persons_.push_back(a_person);
+ BOOST_SCOPE_EXIT( (&commit) (&persons_) ) {
+ if(!commit) persons_.pop_back();
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ commit = true;
+}
+//]
+
+BOOST_AUTO_TEST_CASE( test_world_seq ) {
+ world w;
+ person p;
+ w.add_person(p);
+ BOOST_CHECK( w.persons_.size() == 1 );
+}
+

Added: trunk/libs/scope_exit/test/world_this.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_this.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorldThis
+#include <boost/test/unit_test.hpp>
+#include <boost/config.hpp>
+#include <vector>
+
+struct person; BOOST_TYPEOF_REGISTER_TYPE(person)
+struct person {};
+
+struct world; BOOST_TYPEOF_REGISTER_TYPE(world)
+struct world {
+ void add_person(person const& a_person);
+ std::vector<person> persons_;
+};
+
+void world::add_person(person const& a_person) {
+ bool commit = false;
+
+ persons_.push_back(a_person);
+#ifdef BOOST_NO_LAMBDAS
+ //[world_this_
+ BOOST_SCOPE_EXIT(&commit, this_) { // Capture object `this_`.
+ if(!commit) this_->persons_.pop_back();
+ } BOOST_SCOPE_EXIT_END
+ //]
+#else
+ //[world_this
+ BOOST_SCOPE_EXIT(&commit, this) { // Use `this` (C++11).
+ if(!commit) this->persons_.pop_back();
+ }; // Use `;` instead of `BOOST_SCOPE_EXIT_END` (C++11).
+ //]
+#endif
+
+ // ...
+
+ commit = true;
+}
+
+BOOST_AUTO_TEST_CASE( test_world_this ) {
+ world w;
+ person p;
+ w.add_person(p);
+ BOOST_CHECK( w.persons_.size() == 1 );
+}
+

Added: trunk/libs/scope_exit/test/world_this_seq.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_this_seq.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorldThisSeq
+#include <boost/test/unit_test.hpp>
+#include <boost/config.hpp>
+#include <vector>
+
+struct person; BOOST_TYPEOF_REGISTER_TYPE(person)
+struct person {};
+
+struct world; BOOST_TYPEOF_REGISTER_TYPE(world)
+struct world {
+ void add_person(person const& a_person);
+ std::vector<person> persons_;
+};
+
+void world::add_person(person const& a_person) {
+ bool commit = false;
+
+ persons_.push_back(a_person);
+#ifdef BOOST_NO_LAMBDAS
+ //[world_this_
+ BOOST_SCOPE_EXIT( (&commit) (this_) ) { // Capture object `this_`.
+ if(!commit) this_->persons_.pop_back();
+ } BOOST_SCOPE_EXIT_END
+ //]
+#else
+ //[world_this
+ BOOST_SCOPE_EXIT( (&commit) (this) ) { // Use `this` (C++11).
+ if(!commit) this->persons_.pop_back();
+ }; // Use `;` instead of `BOOST_SCOPE_EXIT_END` (C++11).
+ //]
+#endif
+
+ // ...
+
+ commit = true;
+}
+
+BOOST_AUTO_TEST_CASE( test_world_this_seq ) {
+ world w;
+ person p;
+ w.add_person(p);
+ BOOST_CHECK( w.persons_.size() == 1 );
+}
+

Added: trunk/libs/scope_exit/test/world_tpl.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_tpl.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,49 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorldTpl
+#include <boost/test/unit_test.hpp>
+#include <vector>
+
+struct person; BOOST_TYPEOF_REGISTER_TYPE(peron)
+struct person {};
+
+template<typename Person> struct world; BOOST_TYPEOF_REGISTER_TEMPLATE(world, 1)
+template<typename Person>
+struct world {
+ void add_person(Person const& a_person);
+ std::vector<Person> persons_;
+};
+
+//[world_tpl
+template<typename Person>
+void world<Person>::add_person(Person const& a_person) {
+ bool commit = false;
+ persons_.push_back(a_person);
+
+ BOOST_SCOPE_EXIT_TPL(&commit, this_) { // Use `_TPL` postfix.
+ if(!commit) this_->persons_.pop_back();
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ commit = true;
+}
+//]
+
+BOOST_AUTO_TEST_CASE( test_world_tpl ) {
+ world<person> w;
+ person p;
+ w.add_person(p);
+ BOOST_CHECK( w.persons_.size() == 1 );
+}
+

Added: trunk/libs/scope_exit/test/world_tpl_seq.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_tpl_seq.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,49 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorldTplSeq
+#include <boost/test/unit_test.hpp>
+#include <vector>
+
+struct person; BOOST_TYPEOF_REGISTER_TYPE(person)
+struct person {};
+
+template<typename Person> struct world; BOOST_TYPEOF_REGISTER_TEMPLATE(world, 1)
+template<typename Person>
+struct world {
+ void add_person(Person const& a_person);
+ std::vector<Person> persons_;
+};
+
+//[world_tpl_seq
+template<typename Person>
+void world<Person>::add_person(Person const& a_person) {
+ bool commit = false;
+ persons_.push_back(a_person);
+
+ BOOST_SCOPE_EXIT_TPL( (&commit) (this_) ) {
+ if(!commit) this_->persons_.pop_back();
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ commit = true;
+}
+//]
+
+BOOST_AUTO_TEST_CASE( test_world_tpl_seq ) {
+ world<person> w;
+ person p;
+ w.add_person(p);
+ BOOST_CHECK( w.persons_.size() == 1 );
+}
+

Added: trunk/libs/scope_exit/test/world_void.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/scope_exit/test/world_void.cpp 2012-02-14 20:19:41 EST (Tue, 14 Feb 2012)
@@ -0,0 +1,46 @@
+
+// Copyright (C) 2006-2009, 2012 Alexander Nasonov
+// Copyright (C) 2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://www.boost.org/libs/scope_exit
+
+#include <boost/scope_exit.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/typeof/std/vector.hpp>
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+#define BOOST_TEST_MODULE TestWorldVoid
+#include <boost/test/unit_test.hpp>
+#include <vector>
+
+struct person; BOOST_TYPEOF_REGISTER_TYPE(person)
+struct person {};
+
+struct world_t; BOOST_TYPEOF_REGISTER_TYPE(world_t)
+//[world_void
+struct world_t {
+ std::vector<person> persons;
+ bool commit;
+} world; // Global variable.
+
+void add_person(person const& a_person) {
+ world.commit = false;
+ world.persons.push_back(a_person);
+
+ BOOST_SCOPE_EXIT(void) { // No captures.
+ if(!world.commit) world.persons.pop_back();
+ } BOOST_SCOPE_EXIT_END
+
+ // ...
+
+ world.commit = true;
+}
+//]
+
+BOOST_AUTO_TEST_CASE( test_world_void ) {
+ person p;
+ add_person(p);
+ BOOST_CHECK( world.persons.size() == 1 );
+}
+


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