boost/libs/contract/doc/html/BOOST_CO_idm45028038515616.html
2021-10-05 21:37:46 +02:00

165 lines
21 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Macro BOOST_CONTRACT_PUBLIC_FUNCTION</title>
<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="index.html" title="Chapter 1. Boost.Contract 1.0.0">
<link rel="up" href="reference.html#header.boost.contract_macro_hpp" title="Header &lt;boost/contract_macro.hpp&gt;">
<link rel="prev" href="BOOST_CO_idm45028038532624.html" title="Macro BOOST_CONTRACT_STATIC_PUBLIC_FUNCTION">
<link rel="next" href="BOOST_CO_idm45028038483696.html" title="Macro BOOST_CONTRACT_PUBLIC_FUNCTION_OVERRIDE">
</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"><a href="../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="BOOST_CO_idm45028038532624.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.contract_macro_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_CO_idm45028038483696.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="refentry">
<a name="BOOST_CO_idm45028038515616"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2><span class="refentrytitle">Macro BOOST_CONTRACT_PUBLIC_FUNCTION</span></h2>
<p>BOOST_CONTRACT_PUBLIC_FUNCTION — Program contracts that can be completely disabled at compile-time for non-static public functions that do not override. </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.contract_macro_hpp" title="Header &lt;boost/contract_macro.hpp&gt;">boost/contract_macro.hpp</a>&gt;
</span>BOOST_CONTRACT_PUBLIC_FUNCTION(...)</pre></div>
<div class="refsect1">
<a name="idm45909315872656"></a><h2>Description</h2>
<p>This is used together with <code class="computeroutput"><a class="link" href="BOOST_CO_idm45028038745840.html" title="Macro BOOST_CONTRACT_PRECONDITION">BOOST_CONTRACT_PRECONDITION</a></code>, <code class="computeroutput"><a class="link" href="BOOST_CO_idm45028038734160.html" title="Macro BOOST_CONTRACT_POSTCONDITION">BOOST_CONTRACT_POSTCONDITION</a></code>, <code class="computeroutput"><a class="link" href="BOOST_CONTRACT_EXCEPT.html" title="Macro BOOST_CONTRACT_EXCEPT">BOOST_CONTRACT_EXCEPT</a></code>, and <code class="computeroutput"><a class="link" href="BOOST_CONTRACT_OLD.html" title="Macro BOOST_CONTRACT_OLD">BOOST_CONTRACT_OLD</a></code> to specify preconditions, postconditions, exception guarantees, and old value copies at body that can be completely disabled at compile-time for non-static public functions (virtual or not, void or not) that do not override:</p>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">{</span>
<span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
<span class="identifier">BOOST_CONTRACT_INVARIANT</span><span class="special">(</span><span class="special">{</span> <span class="comment">// Optional (as for static and volatile).</span>
<span class="identifier">BOOST_CONTRACT_ASSERT</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="keyword">public</span><span class="special">:</span>
<span class="comment">// Non-virtual (same if void).</span>
<span class="identifier">t</span> <span class="identifier">f</span><span class="special">(</span><span class="special">...</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">t</span> <span class="identifier">result</span><span class="special">;</span>
<span class="identifier">BOOST_CONTRACT_OLD_PTR</span><span class="special">(</span><span class="identifier">old_type</span><span class="special">)</span><span class="special">(</span><span class="identifier">old_var</span><span class="special">)</span><span class="special">;</span>
<span class="identifier">BOOST_CONTRACT_PUBLIC_FUNCTION</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
<span class="identifier">BOOST_CONTRACT_PRECONDITION</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">{</span> <span class="comment">// Optional.</span>
<span class="identifier">BOOST_CONTRACT_ASSERT</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">BOOST_CONTRACT_OLD</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">{</span> <span class="comment">// Optional.</span>
<span class="identifier">old_var</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">old_expr</span><span class="special">)</span><span class="special">;</span>
<span class="special">...</span>
<span class="special">}</span><span class="special">)</span>
<span class="identifier">BOOST_CONTRACT_POSTCONDITION</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">{</span> <span class="comment">// Optional.</span>
<span class="identifier">BOOST_CONTRACT_ASSERT</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">BOOST_CONTRACT_EXCEPT</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">{</span> <span class="comment">// Optional.</span>
<span class="identifier">BOOST_CONTRACT_ASSERT</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="comment">// Trailing `;` is required.</span>
<span class="special">...</span> <span class="comment">// Function body (use `return result = return_expr`).</span>
<span class="special">}</span>
<span class="comment">// Virtual and void.</span>
<span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">g</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">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">BOOST_CONTRACT_OLD_PTR</span><span class="special">(</span><span class="identifier">old_type</span><span class="special">)</span><span class="special">(</span><span class="identifier">old_var</span><span class="special">)</span><span class="special">;</span>
<span class="identifier">BOOST_CONTRACT_PUBLIC_FUNCTION</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
<span class="special">...</span>
<span class="identifier">BOOST_CONTRACT_OLD</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">{</span> <span class="comment">// Optional.</span>
<span class="identifier">old_var</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">old_expr</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="comment">// Trailing `;` is required.</span>
<span class="special">...</span> <span class="comment">// Function body.</span>
<span class="special">}</span>
<span class="comment">// Virtual and non-void.</span>
<span class="keyword">virtual</span> <span class="identifier">t</span> <span class="identifier">h</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">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">t</span> <span class="identifier">result</span><span class="special">;</span>
<span class="identifier">BOOST_CONTRACT_OLD_PTR</span><span class="special">(</span><span class="identifier">old_type</span><span class="special">)</span><span class="special">(</span><span class="identifier">old_var</span><span class="special">)</span><span class="special">;</span>
<span class="identifier">BOOST_CONTRACT_PUBLIC_FUNCTION</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
<span class="special">...</span>
<span class="identifier">BOOST_CONTRACT_OLD</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">{</span> <span class="comment">// Optional.</span>
<span class="identifier">old_var</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">old_expr</span><span class="special">)</span><span class="special">;</span>
<span class="special">...</span>
<span class="special">}</span><span class="special">)</span>
<span class="identifier">BOOST_CONTRACT_POSTCONDITION</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">(</span><span class="identifier">t</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span> <span class="comment">// Optional</span>
<span class="identifier">BOOST_CONTRACT_ASSERT</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="special">;</span> <span class="comment">// Trailing `;` is required.</span>
<span class="special">...</span> <span class="comment">// Function body (use `return result = return_expr`).</span>
<span class="special">}</span>
<span class="special">...</span>
<span class="special">}</span><span class="special">;</span>
</pre>
<p>For optimization, this can be omitted for non-virtual public functions that do not have preconditions, postconditions and exception guarantees, within classes that have no invariants. Virtual public functions should always use <code class="computeroutput"><a class="link" href="BOOST_CO_idm45028038515616.html" title="Macro BOOST_CONTRACT_PUBLIC_FUNCTION">BOOST_CONTRACT_PUBLIC_FUNCTION</a></code> otherwise this library will not be able to correctly use them for subcontracting.</p>
<p>This is an overloaded variadic macro and it can be used in the following different ways (note that no code is generated when <code class="computeroutput"><a class="link" href="BOOST_CO_idm45028039583904.html" title="Macro BOOST_CONTRACT_NO_PUBLIC_FUNCTIONS">BOOST_CONTRACT_NO_PUBLIC_FUNCTIONS</a></code> is defined).</p>
<p>1. <code class="computeroutput">BOOST_CONTRACT_PUBLIC_FUNCTION(obj)</code> expands to code equivalent to the following (for non-virtual public functions that are not static and do not override, returning void or not):</p>
<pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">BOOST_CONTRACT_NO_PUBLIC_FUNCTIONS</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">internal_var</span> <span class="special">=</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span>
<span class="preprocessor">#endif</span>
</pre>
<p>2. <code class="computeroutput">BOOST_CONTRACT_PUBLIC_FUNCTION(v, obj)</code> expands to code equivalent to the following (for virtual public functions that do not override, returning void):</p>
<pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">BOOST_CONTRACT_NO_PUBLIC_FUNCTIONS</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">internal_var</span> <span class="special">=</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">obj</span><span class="special">)</span>
<span class="preprocessor">#endif</span>
</pre>
<p>3. <code class="computeroutput">BOOST_CONTRACT_PUBLIC_FUNCTION(v, r, obj)</code> expands to code equivalent to the following (for virtual public functions that do not override, not returning void):</p>
<pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">BOOST_CONTRACT_NO_PUBLIC_FUNCTIONS</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">internal_var</span> <span class="special">=</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">r</span><span class="special">,</span> <span class="identifier">obj</span><span class="special">)</span>
<span class="preprocessor">#endif</span>
</pre>
<p>Where (these are all variadic macro parameters so they can contain commas not protected by round parenthesis):</p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem"><p><code class="computeroutput"><span class="bold"><strong>v</strong></span></code> is the extra parameter of type <code class="computeroutput"><a class="link" href="boost/contract/virtual_.html" title="Class virtual_">boost::contract::virtual_</a></code><code class="computeroutput">*</code> and default value <code class="computeroutput">0</code> from the enclosing virtual public function declaring the contract. </p></li>
<li class="listitem"><p><code class="computeroutput"><span class="bold"><strong>r</strong></span></code> is a reference to the return value of the enclosing virtual public function declaring the contract. This is usually a local variable declared by the enclosing virtual public function just before the contract, but programmers must set it to the actual value being returned by the function at each <code class="computeroutput">return</code> statement. </p></li>
<li class="listitem"><p><code class="computeroutput"><span class="bold"><strong>obj</strong></span></code> is the object <code class="computeroutput">this</code> from the scope of the enclosing public function declaring the contract. This object might be mutable, <code class="computeroutput">const</code>, <code class="computeroutput">volatile</code>, or <code class="computeroutput">const volatile</code> depending on the cv-qualifier of the enclosing function (volatile public functions will check volatile class invariants, see <a class="link" href="boost_contract/extras.html#boost_contract.extras.volatile_public_functions" title="Volatile Public Functions">
Volatile Public Functions</a>). </p></li>
<li class="listitem"><p><code class="computeroutput"><span class="bold"><strong>internal_var</strong></span></code> is a variable name internally generated by this library (this name is unique but only on different line numbers so this macro cannot be expanded multiple times on the same line).</p></li>
</ul></div>
<p>
</p>
<p><span class="bold"><strong>See Also:</strong></span></p>
<p> <a class="link" href="boost_contract/extras.html#boost_contract.extras.disable_contract_compilation__macro_interface_" title="Disable Contract Compilation (Macro Interface)">
Disable Contract Compilation</a>, <a class="link" href="boost_contract/tutorial.html#boost_contract.tutorial.public_functions" title="Public Functions"> Public Functions</a>, <a class="link" href="boost_contract/tutorial.html#boost_contract.tutorial.virtual_public_functions" title="Virtual Public Functions">
Virtual Public Functions</a> </p>
<p>
</p>
<p>
</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 © 2008-2019 Lorenzo Caminiti<p>
Distributed under the Boost Software License, Version 1.0 (see accompanying
file LICENSE_1_0.txt or a copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="BOOST_CO_idm45028038532624.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.boost.contract_macro_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_CO_idm45028038483696.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>