<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<title>Rename leap to leap_second</title>

	<style>
	p {text-align:justify}
	li {text-align:justify}
	blockquote.note
	{
		background-color:#E0E0E0;
		padding-left: 15px;
		padding-right: 15px;
		padding-top: 1px;
		padding-bottom: 1px;
	}
	ins {color:#00A000}
	del {color:#A00000}
	code {white-space:pre;}
	table, th, td {
		border: 1px solid black;
		border-collapse: collapse;
		padding: 10px;
	}
	</style>
</head>
<body>

<address align=right>
Document number: P1981R0<br>
<br/>
<br/>
<a href="mailto:howard.hinnant@gmail.com">Howard E. Hinnant</a><br/>
2019-11-09<br/>
</address>
<hr/>
<h1 align=center>Rename leap to leap_second</h1>

<p><a href="https://github.com/cplusplus/nbballot/issues/341"><b>Addresses DE 345</b></a></p>

<h2>Contents</h2>

<ul>
<li><a href="#Introduction">Introduction</a></li>
<li><a href="#Wording">Wording</a></li>
</ul>

<a name="Introduction"></a><h2>Introduction</h2>

<p>
The LEWG in Belfast requested that I write a paper which provides wording
for <a href="https://github.com/cplusplus/nbballot/issues/341">DE 345</a>
as modified by the discussion in LEWG.  The LEWG chose the name
<code>leap_second</code> as a replacement for <code>leap</code>, and
identified the need to also change the data member of <code>tzdb</code>
from <code>leaps</code> to <code>leap_seconds</code> for consistency.
</p>

<a name="Wording"></a><h2>Wording</h2>

<ol>
<li>
<p>
Modify the synopsis in [time.syn] as indicated:
</p>
<blockquote><pre>
...
<i>// 27.11.8, leap second support</i>
class leap<ins>_second</ins>;

bool operator==(const leap<ins>_second</ins>&amp; x, const leap<ins>_second</ins>&amp; y);
strong_ordering operator&lt;=&gt;(const leap<ins>_second</ins>&amp; x, const leap<ins>_second</ins>&amp; y);

template&lt;class Duration&gt;
  bool operator==(const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y);
template&lt;class Duration&gt;
  bool operator&lt; (const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y);
template&lt;class Duration&gt;
  bool operator&lt; (const sys_time&lt;Duration&gt;&amp; x, const leap<ins>_second</ins>&amp; y);
template&lt;class Duration&gt;
  bool operator&gt; (const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y);
template&lt;class Duration&gt;
  bool operator&gt; (const sys_time&lt;Duration&gt;&amp; x, const leap<ins>_second</ins>&amp; y);
template&lt;class Duration&gt;
  bool operator&lt;=(const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y);
template&lt;class Duration&gt;
  bool operator&lt;=(const sys_time&lt;Duration&gt;&amp; x, const leap<ins>_second</ins>&amp; y);
template&lt;class Duration&gt;
  bool operator&gt;=(const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y);
template&lt;class Duration&gt;
  bool operator&gt;=(const sys_time&lt;Duration&gt;&amp; x, const leap<ins>_second</ins>&amp; y);
template&lt;three_way_comparable_with&lt;sys_seconds&gt; Duration&gt;
  auto operator&lt;=&gt;(const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y);
</pre></blockquote>
</li>

<li>
<p>
Modify the synopsis in [time.zone.db.tzdb] as indicated:
</p>
<blockquote><pre>
namespace std::chrono {
  struct tzdb {
    string              version;
    vector&lt;time_zone&gt;   zones;
    vector&lt;link&gt;        links;
    vector&lt;leap<ins>_second</ins>&gt; leap<ins>_second</ins>s;

    const time_zone* locate_zone(string_view tz_name) const;
    const time_zone* current_zone() const;
  };
}
</pre></blockquote>
</li>

<li>
<p>
Modify the title of [time.zone.leap] as indicated:
</p>
<blockquote><p>
<b>Class leap<ins>_second</ins></b>
</p></blockquote>
</li>

<li>
<p>
Modify the synopsis in [time.zone.leap.overview] as indicated:
</p>
<blockquote><pre>
namespace std::chrono {
  class leap<ins>_second</ins> {
  public:
    leap<ins>_second</ins>(const leap<ins>_second</ins>&amp;)
    leap<ins>_second</ins>&amp; operator=(const leap<ins>_second</ins>&amp;) = default;

    <i>// unspecified additional constructors</i>

    constexpr sys_seconds date() const noexcept;
  };
}
</pre></blockquote>
</li>

<li>
<p>
Modify [time.zone.leap.overview]/p1 as indicated:
</p>
<blockquote><p>
1 Objects of type <code>leap<ins>_second</ins></code> representing the
date of the leap second insertions are constructed and stored in the
time zone database when initialized.
</p></blockquote>
</li>

<li>
<p>
Modify [time.zone.leap.overview]/p2 as indicated:
</p>
<blockquote>
<p>
2 [<i>Example:</i>
</p>
<blockquote><pre>
for (auto&amp; l : get_tzdb().leap<ins>_second</ins>s)
  if (l &lt;= 2018y/March/17d)
    cout &lt;&lt; l.date() &lt;&lt; ’\n’;
</pre></blockquote>
<p>...</p>
</blockquote>
</li>

<li>
<p>
Modify [time.zone.leap.overview]/p1 as indicated:
</p>
<blockquote><p>
1 Objects of type <code>leap<ins>_second</ins></code> representing the
date of the leap second insertions are constructed and stored in the
time zone database when initialized.
</p></blockquote>
</li>

<li>
<p>
Modify [time.zone.leap.nonmembers] as indicated:
</p>

<blockquote>
<pre>
constexpr bool operator==(const leap<ins>_second</ins>&amp; x, const leap<ins>_second</ins>&amp; y) noexcept;
</pre>
<blockquote><p>
1 <i>Returns:</i> <code>x.date() == y.date()</code>.
</p></blockquote>

<pre>
constexpr strong_ordering operator&lt;=&gt;(const leap<ins>_second</ins>&amp; x, const leap<ins>_second</ins>&amp; y) noexcept;
</pre>
<blockquote><p>
2 <i>Returns:</i> <code>x.date() &lt;=&gt; y.date()</code>.
</p></blockquote>

<pre>
template&lt;class Duration&gt;
  constexpr bool operator==(const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y) noexcept;
</pre>
<blockquote><p>
3 <i>Returns:</i> <code>x.date() == y</code>.
</p></blockquote>

<pre>
template&lt;class Duration&gt;
  constexpr bool operator&lt;(const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y) noexcept;
</pre>
<blockquote><p>
4 <i>Returns:</i> <code>x.date() &lt; y</code>.
</p></blockquote>

<pre>
template&lt;class Duration&gt;
  constexpr bool operator&lt;(const sys_time&lt;Duration&gt;&amp; x, const leap<ins>_second</ins>&amp; y) noexcept;
</pre>
<blockquote><p>
5 <i>Returns:</i> <code>x &lt; y.date()</code>.
</p></blockquote>

<pre>
template&lt;class Duration&gt;
  constexpr bool operator&gt;(const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y) noexcept;
</pre>
<blockquote><p>
6 <i>Returns:</i> <code>y &lt; x</code>.
</p></blockquote>

<pre>
template&lt;class Duration&gt;
  constexpr bool operator&gt;(const sys_time&lt;Duration&gt;&amp; x, const leap<ins>_second</ins>&amp; y) noexcept;
</pre>
<blockquote><p>
7 <i>Returns:</i> <code>y &lt; x</code>.
</p></blockquote>

<pre>
template&lt;class Duration&gt;
  constexpr bool operator&lt;=(const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y) noexcept;
</pre>
<blockquote><p>
8 <i>Returns:</i> <code>!(y &lt; x)</code>.
</p></blockquote>

<pre>
template&lt;class Duration&gt;
  constexpr bool operator&lt;=(const sys_time&lt;Duration&gt;&amp; x, const leap<ins>_second</ins>&amp; y) noexcept;
</pre>
<blockquote><p>
9 <i>Returns:</i> <code>!(y &lt; x)</code>.
</p></blockquote>

<pre>
template&lt;class Duration&gt;
  constexpr bool operator&gt;=(const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y) noexcept;
</pre>
<blockquote><p>
10 <i>Returns:</i> <code>!(x &lt; y)</code>.
</p></blockquote>

<pre>
template&lt;class Duration&gt;
  constexpr bool operator&gt;=(const sys_time&lt;Duration&gt;&amp; x, const leap<ins>_second</ins>&amp; y) noexcept;
</pre>
<blockquote><p>
11 <i>Returns:</i> <code>!(x &lt; y)</code>.
</p></blockquote>

<pre>
template&lt;three_way_comparable_with&lt;sys_seconds&gt; Duration&gt;
  constexpr auto operator&lt;=&gt;(const leap<ins>_second</ins>&amp; x, const sys_time&lt;Duration&gt;&amp; y) noexcept;
</pre>
<blockquote><p>
12 <i>Returns:</i> <code>x.date() &lt;=&gt; y</code>.
</p></blockquote>

</blockquote>
</li>

</ol>

</body>
</html>
