<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 1305: preconditions for atomic_future</title>
<meta property="og:title" content="Issue 1305: preconditions for atomic_future">
<meta property="og:description" content="C++ library issue. Status: Resolved">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue1305.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#Resolved">Resolved</a> status.</em></p>
<h3 id="1305"><a href="lwg-defects.html#1305">1305</a>. preconditions for <code>atomic_future</code></h3>
<p><b>Section:</b> 99 [futures.atomic_future] <b>Status:</b> <a href="lwg-active.html#Resolved">Resolved</a>
 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2010-01-23 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#futures.atomic_future">issues</a> in [futures.atomic_future].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#Resolved">Resolved</a> status.</p>
<p><b>Discussion:</b></p>

<p>
The revised futures package in the current working paper simplified the
<code>is_ready/has_exception/has_value</code> set of APIs, replacing them with a
single 'valid' method.  This method is used in many places to signal pre- and
post- conditions, but that edit is not complete.  
</p>

<p>
Atomic future retains the extended earlier API, and provides defined,
synchronized behaviour for all calls.  However, some preconditions and throws
clauses are missing, which can easily be built around the new <code>valid()</code>
api.  Note that for consistency, I suggest <code>is_ready/has_exception/has_value
throw</code> an exception if <code>valid()</code> is not <code>true</code>, rather than
return <code>false</code>.  I think this is implied by the existing pre-condition on
<code>is_ready</code>.
</p>

<p><i>[
2010-01-23 See discussion starting with Message c++std-lib-26666.
]</i></p>


<p><i>[
2010 Pittsburgh:  Moved to <del>NAD Editorial</del><ins>Resolved</ins>.  Rationale added below.
]</i></p>




<p><b>Rationale:</b></p>
<p>
Solved by
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3058.html">N3058</a>.
</p>


<p id="res-1305"><b>Proposed resolution:</b></p>
<p>
Insert the following extra paragraphs:
</p>

<p>
In 99 [futures.atomic_future]
</p>

<blockquote><pre>
bool is_ready() const;
</pre>
<blockquote>
<p>
17 <i><del>Precondition</del> <ins>Requires</ins>:</i> <code>valid() == true</code>.
</p>

<p>
18 <i>Returns:</i> <code>true</code> only if the associated state is ready.
</p>

<p><ins>
<i>Throws:</i> <code>future_error</code> with an error condition of
<code>no_state</code> if the precondition is not met.
</ins></p>

</blockquote>
</blockquote>

<blockquote><pre>
bool has_exception() const;
</pre>
<blockquote>

<p><ins>
<i>Requires:</i> <code>valid() == true</code>.
</ins></p>

<p>
19 <i>Returns:</i> <code>true</code> only if the associated state is ready and
contains an exception.
</p>

<p><ins>
<i>Throws:</i> <code>future_error</code> with an error condition of
<code>no_state</code> if the precondition is not met.
</ins></p>

</blockquote>
</blockquote>

<blockquote><pre>
bool has_value() const;
</pre>
<blockquote>

<p><ins>
<i>Requires:</i> <code>valid() == true</code>.
</ins></p>

<p>
20 <i>Returns:</i> <code>true</code> only if the associated state is ready and
contains a value.
</p>

<p><ins>
<i>Throws:</i> <code>future_error</code> with an error condition of
<code>no_state</code> if the precondition is not met.
</ins></p>

</blockquote>
</blockquote>

<blockquote><pre>
void wait() const;
</pre>
<blockquote>

<p><ins>
<i>Requires:</i> <code>valid() == true</code>.
</ins></p>

<p>
22 <i>Effects:</i> blocks until ...
</p>

<p><ins>
<i>Throws:</i> <code>future_error</code> with an error condition of
<code>no_state</code> if the precondition is not met.
</ins></p>

</blockquote>
</blockquote>

<blockquote><pre>
template &lt;class Rep, class Period&gt;
  bool wait_for(const chrono::duration&lt;Rep, Period&gt;&amp; rel_time) const;
</pre>
<blockquote>

<p><ins>
<i>Requires:</i> <code>valid() == true</code>.
</ins></p>

<p>
23 <i>Effects:</i> blocks until ...
</p>

<p>
24 <i>Returns:</i> <code>true</code> only if ...
</p>

<p><ins>
<i>Throws:</i> <code>future_error</code> with an error condition of
<code>no_state</code> if the precondition is not met.
</ins></p>

</blockquote>
</blockquote>

<blockquote><pre>
template &lt;class Clock, class Duration&gt;
  bool wait_until(const chrono::time_point&lt;Clock, Duration&gt;&amp; abs_time) const;
</pre>
<blockquote>

<p><ins>
<i>Requires:</i> <code>valid() == true</code>.
</ins></p>

<p>
25 <i>Effects:</i> blocks until ...
</p>

<p>
26 <i>Returns:</i> <code>true</code> only if ...
</p>

<p><ins>
<i>Throws:</i> <code>future_error</code> with an error condition of
<code>no_state</code> if the precondition is not met.
</ins></p>

</blockquote>
</blockquote>






</body>
</html>
