<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="mpark/wg21" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <meta name="dcterms.date" content="2021-09-12" />
  <title>ranges::iota, ranges::shift_left, and ranges::shift_right</title>
  <style>
      code{white-space: pre-wrap;}
      span.smallcaps{font-variant: small-caps;}
      span.underline{text-decoration: underline;}
      div.column{display: inline-block; vertical-align: top; width: 50%;}
      div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
      ul.task-list{list-style: none;}
      pre > code.sourceCode { white-space: pre; position: relative; }
      pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
      pre > code.sourceCode > span:empty { height: 1.2em; }
      code.sourceCode > span { color: inherit; text-decoration: inherit; }
      div.sourceCode { margin: 1em 0; }
      pre.sourceCode { margin: 0; }
      @media screen {
      div.sourceCode { overflow: auto; }
      }
      @media print {
      pre > code.sourceCode { white-space: pre-wrap; }
      pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
      }
      pre.numberSource code
        { counter-reset: source-line 0; }
      pre.numberSource code > span
        { position: relative; left: -4em; counter-increment: source-line; }
      pre.numberSource code > span > a:first-child::before
        { content: counter(source-line);
          position: relative; left: -1em; text-align: right; vertical-align: baseline;
          border: none; display: inline-block;
          -webkit-touch-callout: none; -webkit-user-select: none;
          -khtml-user-select: none; -moz-user-select: none;
          -ms-user-select: none; user-select: none;
          padding: 0 4px; width: 4em;
          color: #aaaaaa;
        }
      pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
      div.sourceCode
        {  background-color: #f6f8fa; }
      @media screen {
      pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
      }
      code span. { } /* Normal */
      code span.al { color: #ff0000; } /* Alert */
      code span.an { } /* Annotation */
      code span.at { } /* Attribute */
      code span.bn { color: #9f6807; } /* BaseN */
      code span.bu { color: #9f6807; } /* BuiltIn */
      code span.cf { color: #00607c; } /* ControlFlow */
      code span.ch { color: #9f6807; } /* Char */
      code span.cn { } /* Constant */
      code span.co { color: #008000; font-style: italic; } /* Comment */
      code span.cv { color: #008000; font-style: italic; } /* CommentVar */
      code span.do { color: #008000; } /* Documentation */
      code span.dt { color: #00607c; } /* DataType */
      code span.dv { color: #9f6807; } /* DecVal */
      code span.er { color: #ff0000; font-weight: bold; } /* Error */
      code span.ex { } /* Extension */
      code span.fl { color: #9f6807; } /* Float */
      code span.fu { } /* Function */
      code span.im { } /* Import */
      code span.in { color: #008000; } /* Information */
      code span.kw { color: #00607c; } /* Keyword */
      code span.op { color: #af1915; } /* Operator */
      code span.ot { } /* Other */
      code span.pp { color: #6f4e37; } /* Preprocessor */
      code span.re { } /* RegionMarker */
      code span.sc { color: #9f6807; } /* SpecialChar */
      code span.ss { color: #9f6807; } /* SpecialString */
      code span.st { color: #9f6807; } /* String */
      code span.va { } /* Variable */
      code span.vs { color: #9f6807; } /* VerbatimString */
      code span.wa { color: #008000; font-weight: bold; } /* Warning */
      code.diff {color: #898887}
      code.diff span.va {color: #006e28}
      code.diff span.st {color: #bf0303}
  </style>
  <style type="text/css">
body {
margin: 5em;
font-family: serif;

hyphens: auto;
line-height: 1.35;
}
div.wrapper {
max-width: 60em;
margin: auto;
}
ul {
list-style-type: none;
padding-left: 2em;
margin-top: -0.2em;
margin-bottom: -0.2em;
}
a {
text-decoration: none;
color: #4183C4;
}
a.hidden_link {
text-decoration: none;
color: inherit;
}
li {
margin-top: 0.6em;
margin-bottom: 0.6em;
}
h1, h2, h3, h4 {
position: relative;
line-height: 1;
}
a.self-link {
position: absolute;
top: 0;
left: calc(-1 * (3.5rem - 26px));
width: calc(3.5rem - 26px);
height: 2em;
text-align: center;
border: none;
transition: opacity .2s;
opacity: .5;
font-family: sans-serif;
font-weight: normal;
font-size: 83%;
}
a.self-link:hover { opacity: 1; }
a.self-link::before { content: "§"; }
ul > li:before {
content: "\2014";
position: absolute;
margin-left: -1.5em;
}
:target { background-color: #C9FBC9; }
:target .codeblock { background-color: #C9FBC9; }
:target ul { background-color: #C9FBC9; }
.abbr_ref { float: right; }
.folded_abbr_ref { float: right; }
:target .folded_abbr_ref { display: none; }
:target .unfolded_abbr_ref { float: right; display: inherit; }
.unfolded_abbr_ref { display: none; }
.secnum { display: inline-block; min-width: 35pt; }
.header-section-number { display: inline-block; min-width: 35pt; }
.annexnum { display: block; }
div.sourceLinkParent {
float: right;
}
a.sourceLink {
position: absolute;
opacity: 0;
margin-left: 10pt;
}
a.sourceLink:hover {
opacity: 1;
}
a.itemDeclLink {
position: absolute;
font-size: 75%;
text-align: right;
width: 5em;
opacity: 0;
}
a.itemDeclLink:hover { opacity: 1; }
span.marginalizedparent {
position: relative;
left: -5em;
}
li span.marginalizedparent { left: -7em; }
li ul > li span.marginalizedparent { left: -9em; }
li ul > li ul > li span.marginalizedparent { left: -11em; }
li ul > li ul > li ul > li span.marginalizedparent { left: -13em; }
div.footnoteNumberParent {
position: relative;
left: -4.7em;
}
a.marginalized {
position: absolute;
font-size: 75%;
text-align: right;
width: 5em;
}
a.enumerated_item_num {
position: relative;
left: -3.5em;
display: inline-block;
margin-right: -3em;
text-align: right;
width: 3em;
}
div.para { margin-bottom: 0.6em; margin-top: 0.6em; text-align: justify; }
div.section { text-align: justify; }
div.sentence { display: inline; }
span.indexparent {
display: inline;
position: relative;
float: right;
right: -1em;
}
a.index {
position: absolute;
display: none;
}
a.index:before { content: "⟵"; }

a.index:target {
display: inline;
}
.indexitems {
margin-left: 2em;
text-indent: -2em;
}
div.itemdescr {
margin-left: 3em;
}
.bnf {
font-family: serif;
margin-left: 40pt;
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.ncbnf {
font-family: serif;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: 40pt;
}
.ncsimplebnf {
font-family: serif;
font-style: italic;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: 40pt;
background: inherit; 
}
span.textnormal {
font-style: normal;
font-family: serif;
white-space: normal;
display: inline-block;
}
span.rlap {
display: inline-block;
width: 0px;
}
span.descr { font-style: normal; font-family: serif; }
span.grammarterm { font-style: italic; }
span.term { font-style: italic; }
span.terminal { font-family: monospace; font-style: normal; }
span.nonterminal { font-style: italic; }
span.tcode { font-family: monospace; font-style: normal; }
span.textbf { font-weight: bold; }
span.textsc { font-variant: small-caps; }
a.nontermdef { font-style: italic; font-family: serif; }
span.emph { font-style: italic; }
span.techterm { font-style: italic; }
span.mathit { font-style: italic; }
span.mathsf { font-family: sans-serif; }
span.mathrm { font-family: serif; font-style: normal; }
span.textrm { font-family: serif; }
span.textsl { font-style: italic; }
span.mathtt { font-family: monospace; font-style: normal; }
span.mbox { font-family: serif; font-style: normal; }
span.ungap { display: inline-block; width: 2pt; }
span.textit { font-style: italic; }
span.texttt { font-family: monospace; }
span.tcode_in_codeblock { font-family: monospace; font-style: normal; }
span.phantom { color: white; }

span.math { font-style: normal; }
span.mathblock {
display: block;
margin-left: auto;
margin-right: auto;
margin-top: 1.2em;
margin-bottom: 1.2em;
text-align: center;
}
span.mathalpha {
font-style: italic;
}
span.synopsis {
font-weight: bold;
margin-top: 0.5em;
display: block;
}
span.definition {
font-weight: bold;
display: block;
}
.codeblock {
margin-left: 1.2em;
line-height: 127%;
}
.outputblock {
margin-left: 1.2em;
line-height: 127%;
}
div.itemdecl {
margin-top: 2ex;
}
code.itemdeclcode {
white-space: pre;
display: block;
}
span.textsuperscript {
vertical-align: super;
font-size: smaller;
line-height: 0;
}
.footnotenum { vertical-align: super; font-size: smaller; line-height: 0; }
.footnote {
font-size: small;
margin-left: 2em;
margin-right: 2em;
margin-top: 0.6em;
margin-bottom: 0.6em;
}
div.minipage {
display: inline-block;
margin-right: 3em;
}
div.numberedTable {
text-align: center;
margin: 2em;
}
div.figure {
text-align: center;
margin: 2em;
}
table {
border: 1px solid black;
border-collapse: collapse;
margin-left: auto;
margin-right: auto;
margin-top: 0.8em;
text-align: left;
hyphens: none; 
}
td, th {
padding-left: 1em;
padding-right: 1em;
vertical-align: top;
}
td.empty {
padding: 0px;
padding-left: 1px;
}
td.left {
text-align: left;
}
td.right {
text-align: right;
}
td.center {
text-align: center;
}
td.justify {
text-align: justify;
}
td.border {
border-left: 1px solid black;
}
tr.rowsep, td.cline {
border-top: 1px solid black;
}
tr.even, tr.odd {
border-bottom: 1px solid black;
}
tr.capsep {
border-top: 3px solid black;
border-top-style: double;
}
tr.header {
border-bottom: 3px solid black;
border-bottom-style: double;
}
th {
border-bottom: 1px solid black;
}
span.centry {
font-weight: bold;
}
div.table {
display: block;
margin-left: auto;
margin-right: auto;
text-align: center;
width: 90%;
}
span.indented {
display: block;
margin-left: 2em;
margin-bottom: 1em;
margin-top: 1em;
}
ol.enumeratea { list-style-type: none; background: inherit; }
ol.enumerate { list-style-type: none; background: inherit; }

code.sourceCode > span { display: inline; }
</style>
  <style type="text/css">a {
color : #4183C4;
text-decoration: underline;
}
a.marginalized {
text-decoration: none;
}
a.self-link {
text-decoration: none;
}
h1#toctitle {
border-bottom: 1px solid #cccccc;
}
#TOC li {
margin-top: 1px;
margin-bottom: 1px;
}
#TOC ul>li:before { display: none; }
h3.subtitle { margin-top: -15px; }
h1:target { background-color: transparent; }
h2:target { background-color: transparent; }
h3:target { background-color: transparent; }
h4:target { background-color: transparent; }
h5:target { background-color: transparent; }
h6:target { background-color: transparent; }
.marginalized:target { background-color: transparent; }
code span.co { font-family: monospace; }
table tr {
background-color: white;
}
table tr:nth-child(2n) {
background-color: #f6f8fa;
}
#title-block-header > table tr:nth-child(2n) {
background-color: white;
}
td > div.sourceCode {
background-color: inherit;
}
table {
border-collapse: collapse;
}
table td, table th {
border: 1px solid #cccccc;
}
table th {
border-bottom: 1px solid black;
text-align: center;
}
table tr:first-child th {
border-top: 0;
}
table tr:last-child td {
border-bottom: 0;
}
table tr td:first-child,
table tr th:first-child {
border-left: 0;
}
table tr td:last-child,
table tr th:last-child {
border-right: 0;
}
table tbody tr:first-child td {
border-top: 1px solid black;
}
#title-block-header td { border: 0; }
@media all {
body {
margin: 2em;
}
}
@media screen and (min-width: 480px) {
body {
margin: 5em;
}
}
#refs code{padding-left: 0px; text-indent: 0px;}
:root {
--diff-ins: #e6ffed;
--diff-strongins: #acf2bd;
--diff-del: #ffdddd;
--diff-strongdel: #ff8888;
}
span.diffins {
background-color: var(--diff-strongins);
}
span.diffdel {
background-color: var(--diff-strongdel);
}
div.rm { text-decoration: line-through; }
div.rm code.sourceCode { text-decoration: line-through; }
div.addu, span.addu {
color: #006e28;
background-color: var(--diff-ins);
}

div.rm pre, div.add pre { background-color: #f6f8fa; }
div.addu pre { background-color: var(--diff-ins); }
div.add, div.add pre, div.add blockquote { background-color: var(--diff-ins); }
div.addu blockquote {
border-left: 4px solid #00a000;
padding: 0 15px;
color: #006e28;
text-decoration: none;
}
div.addu blockquote code.sourceCode { text-decoration: none; }
div.addu blockquote pre { text-decoration: none; }
div.addu blockquote pre code { text-decoration: none; }
code.diff span.va { color: #000000; background-color: var(--diff-ins); }
code.diff span.st { color: #000000; background-color: var(--diff-del); }
blockquote { background-color: #f6f8fa; }
</style>
  <link href="data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAVoJEAN6CRADegkQAWIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wCCRAAAgkQAAIJEAACCRAAsgkQAvoJEAP+CRAD/gkQA/4JEAP+CRADAgkQALoJEAACCRAAAgkQAAP///wD///8AgkQAAIJEABSCRACSgkQA/IJEAP99PQD/dzMA/3czAP99PQD/gkQA/4JEAPyCRACUgkQAFIJEAAD///8A////AHw+AFiBQwDqgkQA/4BBAP9/PxP/uZd6/9rJtf/bybX/upd7/39AFP+AQQD/gkQA/4FDAOqAQgBc////AP///wDKklv4jlEa/3o7AP+PWC//8+3o///////////////////////z7un/kFox/35AAP+GRwD/mVYA+v///wD///8A0Zpk+NmibP+0d0T/8evj///////+/fv/1sKz/9bCs//9/fr//////+/m2/+NRwL/nloA/5xYAPj///8A////ANKaZPjRmGH/5cKh////////////k149/3UwAP91MQD/lmQ//86rhv+USg3/m1YA/5hSAP+bVgD4////AP///wDSmmT4zpJY/+/bx///////8+TV/8mLT/+TVx//gkIA/5lVAP+VTAD/x6B//7aEVv/JpH7/s39J+P///wD///8A0ppk+M6SWP/u2sf///////Pj1f/Nj1T/2KFs/8mOUv+eWhD/lEsA/8aee/+0glT/x6F7/7J8Rvj///8A////ANKaZPjRmGH/48Cf///////+/v7/2qt//82PVP/OkFX/37KJ/86siv+USg7/mVQA/5hRAP+bVgD4////AP///wDSmmT40ppk/9CVXP/69O////////7+/v/x4M//8d/P//7+/f//////9u7n/6tnJf+XUgD/nFgA+P///wD///8A0ppk+NKaZP/RmWL/1qNy//r07///////////////////////+vXw/9akdP/Wnmn/y5FY/6JfFvj///8A////ANKaZFTSmmTo0ppk/9GYYv/Ql1//5cWm//Hg0P/x4ND/5cWm/9GXYP/RmGH/0ppk/9KaZOjVnmpY////AP///wDSmmQA0ppkEtKaZI7SmmT60ppk/9CWX//OkVb/zpFW/9CWX//SmmT/0ppk/NKaZJDSmmQS0ppkAP///wD///8A0ppkANKaZADSmmQA0ppkKtKaZLrSmmT/0ppk/9KaZP/SmmT/0ppkvNKaZCrSmmQA0ppkANKaZAD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkUtKaZNzSmmTc0ppkVNKaZADSmmQA0ppkANKaZADSmmQA////AP5/AAD4HwAA4AcAAMADAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAADgBwAA+B8AAP5/AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAyCRACMgkQA6oJEAOqCRACQgkQAEIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRABigkQA5oJEAP+CRAD/gkQA/4JEAP+CRADqgkQAZoJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAA4gkQAwoJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQAxIJEADyCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAP///wD///8A////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAWgkQAmIJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAJyCRAAYgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAdIJEAPCCRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAPSCRAB4gkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQASoJEANKCRAD/gkQA/4JEAP+CRAD/g0YA/39AAP9zLgD/bSQA/2shAP9rIQD/bSQA/3MuAP9/PwD/g0YA/4JEAP+CRAD/gkQA/4JEAP+CRADUgkQAToJEAACCRAAAgkQAAP///wD///8A////AP///wB+PwAAgkUAIoJEAKiCRAD/gkQA/4JEAP+CRAD/hEcA/4BBAP9sIwD/dTAA/5RfKv+viF7/vp56/76ee/+wiF7/lWAr/3YxAP9sIwD/f0AA/4RHAP+CRAD/gkQA/4JEAP+CRAD/gkQArIJEACaBQwAA////AP///wD///8A////AIBCAEBzNAD6f0EA/4NFAP+CRAD/gkQA/4VIAP92MwD/bSUA/6N1Tv/ezsL/////////////////////////////////38/D/6V3Uv9uJgD/dTEA/4VJAP+CRAD/gkQA/4JEAP+BQwD/fUAA/4FDAEj///8A////AP///wD///8AzJRd5qBlKf91NgD/dDUA/4JEAP+FSQD/cy4A/3YyAP/PuKP//////////////////////////////////////////////////////9K7qP94NQD/ciwA/4VJAP+CRAD/fkEA/35BAP+LSwD/mlYA6v///wD///8A////AP///wDdpnL/4qx3/8KJUv+PUhf/cTMA/3AsAP90LgD/4dK+/////////////////////////////////////////////////////////////////+TYxf91MAD/dTIA/31CAP+GRwD/llQA/6FcAP+gWwD8////AP///wD///8A////ANGZY/LSm2X/4ap3/92mcP+wdT3/byQA/8mwj////////////////////////////////////////////////////////////////////////////+LYxv9zLgP/jUoA/59bAP+hXAD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/RmWL/1p9q/9ubXv/XqXj////////////////////////////7+fD/vZyG/6BxS/+gcUr/vJuE//r37f//////////////////////3MOr/5dQBf+dVQD/nVkA/5xYAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmWP/yohJ//jo2P//////////////////////4NTG/4JDFf9lGAD/bSQA/20kAP9kGAD/fz8S/+Xb0f//////5NG9/6txN/+LOgD/m1QA/51aAP+cWAD/m1cA/5xYAP+cWADy////AP///wD///8A////ANKaZPLSmmT/0ppk/8+TWf/Unmv//v37//////////////////////+TWRr/VwsA/35AAP+ERgD/g0UA/4JGAP9lHgD/kFga/8KXX/+TRwD/jT4A/49CAP+VTQD/n10A/5xYAP+OQQD/lk4A/55cAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/y4tO/92yiP//////////////////////8NnE/8eCQP+rcTT/ez0A/3IyAP98PgD/gEMA/5FSAP+USwD/jj8A/5lUAP+JNwD/yqV2/694Mf+HNQD/jkAA/82rf/+laBj/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/LiUr/4byY///////////////////////gupX/0I5P/+Wuev/Lklz/l1sj/308AP+QSwD/ol0A/59aAP+aVQD/k0oA/8yoh///////+fXv/6pwO//Lp3v///////Pr4f+oay7y////AP///wD///8A////ANKaZPLSmmT/0ppk/8uJSv/hvJj//////////////////////+G7l//Jhkb/0ppk/96nc//fqXX/x4xO/6dkFP+QSQD/llEA/5xXAP+USgD/yaOA///////38uv/qG05/8ijdv//////8efb/6ZpLPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/zIxO/9yxh///////////////////////7dbA/8iEQf/Sm2X/0Zlj/9ScZv/eqHf/2KJv/7yAQf+XTgD/iToA/5lSAP+JNgD/yKFv/611LP+HNQD/jT8A/8qmeP+kZRT/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/Pk1n/1J5q//78+//////////////////+/fv/1aFv/8iEQv/Tm2b/0ppl/9GZY//Wn2z/1pZc/9eldf/Bl2b/kUcA/4w9AP+OQAD/lUwA/59eAP+cWQD/jT8A/5ZOAP+eXADy////AP///wD///8A////ANKaZPLSmmT/0ppk/9KZY//KiEn/8d/P///////////////////////47+f/05tm/8iCP//KiEj/yohJ/8eCP//RmGH//vfy///////n1sP/rXQ7/4k4AP+TTAD/nVoA/5xYAP+cVwD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/0ptl/8uLTf/aq37////////////////////////////+/fz/6c2y/961jv/etY7/6Myx//78+v//////////////////////3MWv/5xXD/+ORAD/mFQA/51ZAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmmT/0ppk/8mFRP/s1b//////////////////////////////////////////////////////////////////////////////+PD/0JFU/7NzMv+WUQD/kUsA/5tXAP+dWQDy////AP///wD///8A////ANKaZP/SmmT/0ppk/9KaZP/Sm2X/z5NZ/8yMT//z5NX/////////////////////////////////////////////////////////////////9Ofa/8yNUP/UmGH/36p5/8yTWv+qaSD/kksA/5ROAPz///8A////AP///wD///8A0ppk5NKaZP/SmmT/0ppk/9KaZP/TnGf/zY9T/82OUv/t1sD//////////////////////////////////////////////////////+7Yw//OkFX/zI5R/9OcZ//SmmP/26V0/9ymdf/BhUf/ol8R6P///wD///8A////AP///wDSmmQ80ppk9tKaZP/SmmT/0ppk/9KaZP/TnGj/zpFW/8qJSv/dson/8uHS//////////////////////////////////Lj0//etIv/y4lL/86QVf/TnGj/0ppk/9KaZP/RmWP/05xn/9ymdfjUnWdC////AP///wD///8A////ANKaZADSmmQc0ppkotKaZP/SmmT/0ppk/9KaZP/Tm2b/0Zli/8qJSf/NjlH/16Z3/+G8mP/myKr/5siq/+G8mP/Xp3f/zY5S/8qISf/RmGH/05tm/9KaZP/SmmT/0ppk/9KaZP/SmmSm0pljINWdaQD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkQtKaZMrSmmT/0ppk/9KaZP/SmmT/0ptl/9GYYf/Nj1P/y4lL/8qISP/KiEj/y4lK/82PU//RmGH/0ptl/9KaZP/SmmT/0ppk/9KaZP/SmmTO0ppkRtKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZGzSmmTu0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmTw0ppkcNKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZBLSmmSQ0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppklNKaZBTSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQy0ppkutKaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppkvtKaZDbSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkXNKaZODSmmT/0ppk/9KaZP/SmmT/0ppk5NKaZGDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkBtKaZIbSmmTo0ppk6tKaZIrSmmQK0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP/8P///+B///+AH//+AAf//AAD//AAAP/AAAA/gAAAHwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA+AAAAfwAAAP/AAAP/8AAP//gAH//+AH///4H////D//" rel="icon" />
  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  <![endif]-->
  
</head>
<body>
<div class="wrapper">
<header id="title-block-header">
<h1 class="title" style="text-align:center"><code class="sourceCode cpp">ranges<span class="op">::</span>iota</code>, <code class="sourceCode cpp">ranges<span class="op">::</span>shift_left</code>, and <code class="sourceCode cpp">ranges<span class="op">::</span>shift_right</code></h1>

<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P2440R0</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2021-09-12</td>
  </tr>
  <tr>
    <td style="vertical-align:top">Project:</td>
    <td>Programming Language C++</td>
  </tr>
  <tr>
    <td style="vertical-align:top">Audience:</td>
    <td>
      LEWG<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      Tim Song<br>&lt;<a href="mailto:t.canens.cpp@gmail.com" class="email">t.canens.cpp@gmail.com</a>&gt;<br>
    </td>
  </tr>
</table>

</header>
<div style="clear:both">
<div id="TOC" role="doc-toc">
<h1 id="toctitle">Contents</h1>
<ul>
<li><a href="#abstract"><span class="toc-section-number">1</span> Abstract<span></span></a></li>
<li><a href="#discussion"><span class="toc-section-number">2</span> Discussion<span></span></a>
<ul>
<li><a href="#rangesiota"><span class="toc-section-number">2.1</span> <code class="sourceCode cpp">ranges<span class="op">::</span>iota</code><span></span></a></li>
<li><a href="#rangesshift_left-and-rangesshift_right"><span class="toc-section-number">2.2</span> <code class="sourceCode cpp">ranges<span class="op">::</span>shift_left</code> and <code class="sourceCode cpp">ranges<span class="op">::</span>shift_right</code><span></span></a></li>
</ul></li>
<li><a href="#wording"><span class="toc-section-number">3</span> Wording<span></span></a>
<ul>
<li><a href="#rangesiota-1"><span class="toc-section-number">3.1</span> <code class="sourceCode cpp">ranges<span class="op">::</span>iota</code><span></span></a></li>
<li><a href="#rangesshift_left-and-rangesshift_right-1"><span class="toc-section-number">3.2</span> <code class="sourceCode cpp">ranges<span class="op">::</span>shift_left</code> and <code class="sourceCode cpp">ranges<span class="op">::</span>shift_right</code><span></span></a></li>
</ul></li>
<li><a href="#bibliography"><span class="toc-section-number">4</span> References<span></span></a></li>
</ul>
</div>
<h1 data-number="1" style="border-bottom:1px solid #cccccc" id="abstract"><span class="header-section-number">1</span> Abstract<a href="#abstract" class="self-link"></a></h1>
<p>This paper proposes adding the algorithms <code class="sourceCode cpp">ranges<span class="op">::</span>iota</code>, <code class="sourceCode cpp">ranges<span class="op">::</span>shift_left</code>, and <code class="sourceCode cpp">ranges<span class="op">::</span>shift_right</code>, to match their <code class="sourceCode cpp">std</code> counterparts.</p>
<h1 data-number="2" style="border-bottom:1px solid #cccccc" id="discussion"><span class="header-section-number">2</span> Discussion<a href="#discussion" class="self-link"></a></h1>
<h2 data-number="2.1" id="rangesiota"><span class="header-section-number">2.1</span> <code class="sourceCode cpp">ranges<span class="op">::</span>iota</code><a href="#rangesiota" class="self-link"></a></h2>
<p>As <span class="citation" data-cites="P2214R0">[<a href="#ref-P2214R0" role="doc-biblioref">P2214R0</a>]</span> explains, while conceptification of other numeric algorithms is a far more complex endeavor (see, e.g., <span class="citation" data-cites="P1813R0">[<a href="#ref-P1813R0" role="doc-biblioref">P1813R0</a>]</span>), <code class="sourceCode cpp">iota</code> is straightforward:</p>
<blockquote>
<p>We already have <code class="sourceCode cpp">views<span class="op">::</span>iota</code> in C++20, which importantly means that we already have all the correct constraints in place. In that sense, it almost takes less time to adopt <code class="sourceCode cpp">ranges<span class="op">::</span>iota</code> than it would take to discuss whether or not it’s worth spending time adopting it.</p>
</blockquote>
<p>The <code class="sourceCode cpp">ranges<span class="op">::</span>iota</code> algorithm isn’t redundant to <code class="sourceCode cpp">views<span class="op">::</span>iota</code> either: the algorithm determines the number of values to write based on the output range, while using <code class="sourceCode cpp">ranges<span class="op">::</span>copy</code> or similar algorithms with <code class="sourceCode cpp">views<span class="op">::</span>iota</code> requires that information to be computed upfront. When you already have a range, <code class="sourceCode cpp">ranges<span class="op">::</span>iota</code> can be more convenient and efficient.</p>
<p>Following the law of useful returns, this paper proposes returning both the end of the range and the final value.</p>
<h2 data-number="2.2" id="rangesshift_left-and-rangesshift_right"><span class="header-section-number">2.2</span> <code class="sourceCode cpp">ranges<span class="op">::</span>shift_left</code> and <code class="sourceCode cpp">ranges<span class="op">::</span>shift_right</code><a href="#rangesshift_left-and-rangesshift_right" class="self-link"></a></h2>
<p>These were proposed in <span class="citation" data-cites="P1243R3">[<a href="#ref-P1243R3" role="doc-biblioref">P1243R3</a>]</span> but removed in Prague due to concerns about the return type of <code class="sourceCode cpp">shift_left</code> losing information about the original end of the range. There were particularly concerns about difficulty in recovering the original end if sentinels are involved, since the elements between the end of the new range and the previous end could have been moved from.</p>
<p>However, this argument overlooks the fact that:</p>
<ul>
<li>when the returned range is not empty, we can simply take its <code class="sourceCode cpp">end<span class="op">()</span></code> and advance it by the shift amount <code class="sourceCode cpp">n</code> to obtain the original end. This is a potentially linear time operation, but it is not impossible to recover the information.</li>
<li>when the returned range is empty (that is, the shift amount is greater than the size of the range), simply adding <code class="sourceCode cpp">n</code> is not possible, but in this case the algorithm may not necessarily have computed the end iterator of the original range: all it needs is the size, which can be computed from <code class="sourceCode cpp">last <span class="op">-</span> first</code> if their types model <code class="sourceCode cpp">sized_sentinel_for</code>, or from the range if its type models <code class="sourceCode cpp">sized_range</code>. Additionally, we guarantee that in this case the range is unchanged, so the sentinel remains usable.</li>
</ul>
<p>Moreover, the standard library already provides a view factory for users who want to iterate <code class="sourceCode cpp"><span class="op">[</span>new_last, last<span class="op">)</span></code>: <code class="sourceCode cpp">views<span class="op">::</span>counted</code>. In some cases, using <code class="sourceCode cpp">counted_iterator</code> might even be more efficient by reducing iterator comparisons to integer comparisons (comparing <code class="sourceCode cpp">counted_iterator</code>s only need to compare the counter).</p>
<p>Meanwhile, just returning a <code class="sourceCode cpp">subrange</code> that represents the new range of elements instead of a more complex, bespoke type that users need to decompose themselves is substantially more convenient, and it is hardly unprecedented for some algorithms to not return the end of the range despite necessarily computing it (e.g., <code class="sourceCode cpp">ranges<span class="op">::</span>count</code>, <code class="sourceCode cpp">ranges<span class="op">::</span>min<span class="op">/</span>max<span class="op">/</span>minmax_element</code>), and here we don’t even necessarily compute it. It also allows <code class="sourceCode cpp">shift_left</code> and <code class="sourceCode cpp">shift_right</code> to have the same return type, without having to complicate the latter.</p>
<p>This paper therefore proposes maintaining the <span class="citation" data-cites="P1243R3">[<a href="#ref-P1243R3" role="doc-biblioref">P1243R3</a>]</span> design: <code class="sourceCode cpp">ranges<span class="op">::</span>shift_left</code> and <code class="sourceCode cpp">ranges<span class="op">::</span>shift_right</code> should return a <code class="sourceCode cpp">subrange</code> that represents the new range after the shift.</p>
<h1 data-number="3" style="border-bottom:1px solid #cccccc" id="wording"><span class="header-section-number">3</span> Wording<a href="#wording" class="self-link"></a></h1>
<h2 data-number="3.1" id="rangesiota-1"><span class="header-section-number">3.1</span> <code class="sourceCode cpp">ranges<span class="op">::</span>iota</code><a href="#rangesiota-1" class="self-link"></a></h2>
<div>
<ol type="1">
<li>Edit <span>25.9 <a href="https://wg21.link/numeric.ops.overview">[numeric.ops.overview]</a></span>, header <code class="sourceCode cpp"><span class="op">&lt;</span>numeric<span class="op">&gt;</span></code> synopsis, as indicated:</li>
</ol>
<blockquote>
<div>
<div class="sourceCode" id="cb1"><pre class="sourceCode diff"><code class="sourceCode diff"><span id="cb1-1"><a href="#cb1-1"></a></span>
<span id="cb1-2"><a href="#cb1-2"></a> namespace std {</span>
<span id="cb1-3"><a href="#cb1-3"></a><span class="va">+  namespace ranges {</span></span>
<span id="cb1-4"><a href="#cb1-4"></a><span class="va">+    // <span>25.5 <a href="https://wg21.link/algorithms.results">[algorithms.results]</a></span>, algorithm result types</span></span>
<span id="cb1-5"><a href="#cb1-5"></a><span class="va">+</span></span>
<span id="cb1-6"><a href="#cb1-6"></a><span class="va">+    template&lt;class O, class T&gt;</span></span>
<span id="cb1-7"><a href="#cb1-7"></a><span class="va">+      struct out_value_result;</span></span>
<span id="cb1-8"><a href="#cb1-8"></a><span class="va">+  }</span></span>
<span id="cb1-9"><a href="#cb1-9"></a></span>
<span id="cb1-10"><a href="#cb1-10"></a>   // [...]</span>
<span id="cb1-11"><a href="#cb1-11"></a></span>
<span id="cb1-12"><a href="#cb1-12"></a>   // <span>25.10.13 <a href="https://wg21.link/numeric.iota">[numeric.iota]</a></span>, iota</span>
<span id="cb1-13"><a href="#cb1-13"></a>   template&lt;class ForwardIterator, class T&gt;</span>
<span id="cb1-14"><a href="#cb1-14"></a>     constexpr void iota(ForwardIterator first, ForwardIterator last, T value);</span>
<span id="cb1-15"><a href="#cb1-15"></a></span>
<span id="cb1-16"><a href="#cb1-16"></a><span class="va">+  namespace ranges {</span></span>
<span id="cb1-17"><a href="#cb1-17"></a><span class="va">+    template&lt;class O, class T&gt;</span></span>
<span id="cb1-18"><a href="#cb1-18"></a><span class="va">+      using iota_result = out_value_result&lt;O, T&gt;;</span></span>
<span id="cb1-19"><a href="#cb1-19"></a><span class="va">+</span></span>
<span id="cb1-20"><a href="#cb1-20"></a><span class="va">+    template&lt;input_or_output_iterator O, sentinel_for&lt;O&gt; S, weakly_incrementable T&gt;</span></span>
<span id="cb1-21"><a href="#cb1-21"></a><span class="va">+      requires indirectly_writable&lt;O, const T&amp;&gt;</span></span>
<span id="cb1-22"><a href="#cb1-22"></a><span class="va">+      constexpr iota_result&lt;O, T&gt; iota(O first, S last, T value);</span></span>
<span id="cb1-23"><a href="#cb1-23"></a><span class="va">+</span></span>
<span id="cb1-24"><a href="#cb1-24"></a><span class="va">+    template&lt;weakly_incrementable T, output_range&lt;const T&amp;&gt; R&gt;</span></span>
<span id="cb1-25"><a href="#cb1-25"></a><span class="va">+      constexpr iota_result&lt;borrowed_iterator_t&lt;R&gt;, T&gt; iota(R&amp;&amp; r, T value);</span></span>
<span id="cb1-26"><a href="#cb1-26"></a><span class="va">+  }</span></span>
<span id="cb1-27"><a href="#cb1-27"></a></span>
<span id="cb1-28"><a href="#cb1-28"></a>   // [...]</span>
<span id="cb1-29"><a href="#cb1-29"></a> }</span></code></pre></div>
</div>
</blockquote>
<ol start="2" type="1">
<li>Add the following to <span>25.5 <a href="https://wg21.link/algorithms.results">[algorithms.results]</a></span>:</li>
</ol>
<blockquote>
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb2-1"><a href="#cb2-1"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb2-2"><a href="#cb2-2"></a>  <span class="co">// ...</span></span>
<span id="cb2-3"><a href="#cb2-3"></a></span>
<span id="cb2-4"><a href="#cb2-4"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> O, <span class="kw">class</span> T<span class="op">&gt;</span></span>
<span id="cb2-5"><a href="#cb2-5"></a>  <span class="kw">struct</span> out_value_result <span class="op">{</span></span>
<span id="cb2-6"><a href="#cb2-6"></a>    <span class="op">[[</span><span class="at">no_unique_address</span><span class="op">]]</span> O out;</span>
<span id="cb2-7"><a href="#cb2-7"></a>    <span class="op">[[</span><span class="at">no_unique_address</span><span class="op">]]</span> T value;</span>
<span id="cb2-8"><a href="#cb2-8"></a></span>
<span id="cb2-9"><a href="#cb2-9"></a>    <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> O2, <span class="kw">class</span> T2<span class="op">&gt;</span></span>
<span id="cb2-10"><a href="#cb2-10"></a>      <span class="kw">requires</span> convertible_to<span class="op">&lt;</span><span class="kw">const</span> O<span class="op">&amp;</span>, O2<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> convertible_to<span class="op">&lt;</span><span class="kw">const</span> T<span class="op">&amp;</span>, T2<span class="op">&gt;</span></span>
<span id="cb2-11"><a href="#cb2-11"></a>    <span class="kw">constexpr</span> <span class="kw">operator</span> out_value_result<span class="op">&lt;</span>T2, O2<span class="op">&gt;()</span> <span class="kw">const</span> <span class="op">&amp;</span> <span class="op">{</span></span>
<span id="cb2-12"><a href="#cb2-12"></a>      <span class="cf">return</span> <span class="op">{</span>out, value<span class="op">}</span>;</span>
<span id="cb2-13"><a href="#cb2-13"></a>    <span class="op">}</span></span>
<span id="cb2-14"><a href="#cb2-14"></a></span>
<span id="cb2-15"><a href="#cb2-15"></a>    <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> O2, <span class="kw">class</span> T2<span class="op">&gt;</span></span>
<span id="cb2-16"><a href="#cb2-16"></a>      <span class="kw">requires</span> convertible_to<span class="op">&lt;</span>O, O2<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> convertible_to<span class="op">&lt;</span>T, T2<span class="op">&gt;</span></span>
<span id="cb2-17"><a href="#cb2-17"></a>    <span class="kw">constexpr</span> <span class="kw">operator</span> out_value_result<span class="op">&lt;</span>T2, O2<span class="op">&gt;()</span> <span class="op">&amp;&amp;</span> <span class="op">{</span></span>
<span id="cb2-18"><a href="#cb2-18"></a>      <span class="cf">return</span> <span class="op">{</span>std<span class="op">::</span>move<span class="op">(</span>out<span class="op">)</span>, std<span class="op">::</span>move<span class="op">(</span>value<span class="op">)}</span>;</span>
<span id="cb2-19"><a href="#cb2-19"></a>    <span class="op">}</span></span>
<span id="cb2-20"><a href="#cb2-20"></a>  <span class="op">}</span>;</span></code></pre></div>
</blockquote>
<ol start="3" type="1">
<li>Add the following to <span>25.10.13 <a href="https://wg21.link/numeric.iota">[numeric.iota]</a></span>:</li>
</ol>
<blockquote>
<div>
<div class="sourceCode" id="cb3"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb3-1"><a href="#cb3-1"></a><span class="kw">template</span><span class="op">&lt;</span>input_or_output_iterator O, sentinel_for<span class="op">&lt;</span>O<span class="op">&gt;</span> S, weakly_incrementable T<span class="op">&gt;</span></span>
<span id="cb3-2"><a href="#cb3-2"></a>  <span class="kw">requires</span> indirectly_writable<span class="op">&lt;</span>O, <span class="kw">const</span> T<span class="op">&amp;&gt;</span></span>
<span id="cb3-3"><a href="#cb3-3"></a>  <span class="kw">constexpr</span> ranges<span class="op">::</span>iota_result<span class="op">&lt;</span>O, T<span class="op">&gt;</span> ranges<span class="op">::</span>iota<span class="op">(</span>O first, S last, T value<span class="op">)</span>;</span>
<span id="cb3-4"><a href="#cb3-4"></a></span>
<span id="cb3-5"><a href="#cb3-5"></a><span class="kw">template</span><span class="op">&lt;</span>weakly_incrementable T, output_range<span class="op">&lt;</span><span class="kw">const</span> T<span class="op">&amp;&gt;</span> R<span class="op">&gt;</span></span>
<span id="cb3-6"><a href="#cb3-6"></a>  <span class="kw">constexpr</span> ranges<span class="op">::</span>iota_result<span class="op">&lt;</span>borrowed_iterator_t<span class="op">&lt;</span>R<span class="op">&gt;</span>, T<span class="op">&gt;</span> ranges<span class="op">::</span>iota<span class="op">(</span>R<span class="op">&amp;&amp;</span> r, T value<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_1" id="pnum_1">?</a></span> <em>Effects:</em> Equivalent to: <span class="draftnote" style="color: #01796F">[ Drafting note: Matching range-v3, we write <code class="sourceCode cpp">as_const<span class="op">(</span>value<span class="op">)</span></code> to the output to enforce that <code class="sourceCode cpp">value</code> should not be modified by the writing operation. ]</span></p>
<blockquote>
<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb4-1"><a href="#cb4-1"></a><span class="cf">while</span> <span class="op">(</span>first <span class="op">!=</span> last<span class="op">)</span> <span class="op">{</span></span>
<span id="cb4-2"><a href="#cb4-2"></a>  <span class="op">*</span>first <span class="op">=</span> as_const<span class="op">(</span>value<span class="op">)</span>;</span>
<span id="cb4-3"><a href="#cb4-3"></a>  <span class="op">++</span>first;</span>
<span id="cb4-4"><a href="#cb4-4"></a>  <span class="op">++</span>value;</span>
<span id="cb4-5"><a href="#cb4-5"></a><span class="op">}</span></span>
<span id="cb4-6"><a href="#cb4-6"></a></span>
<span id="cb4-7"><a href="#cb4-7"></a><span class="cf">return</span> <span class="op">{</span>std<span class="op">::</span>move<span class="op">(</span>first<span class="op">)</span>, std<span class="op">::</span>move<span class="op">(</span>value<span class="op">)}</span>;</span></code></pre></div>
</blockquote>
</blockquote>
</div>
</blockquote>
<ol start="4" type="1">
<li>Add the following macro definition to <span>17.3.2 <a href="https://wg21.link/version.syn">[version.syn]</a></span>, header <code class="sourceCode cpp"><span class="op">&lt;</span>version<span class="op">&gt;</span></code> synopsis, with the value selected by the editor to reflect the date of adoption of this proposal:</li>
</ol>
<blockquote>
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="#cb5-1"></a><span class="pp">#define __cpp_lib_ranges_iota  </span><span class="dv">20</span><span class="er">XXXXL</span><span class="pp"> </span><span class="co">// also in &lt;numeric&gt;</span></span></code></pre></div>
</blockquote>
</div>
<h2 data-number="3.2" id="rangesshift_left-and-rangesshift_right-1"><span class="header-section-number">3.2</span> <code class="sourceCode cpp">ranges<span class="op">::</span>shift_left</code> and <code class="sourceCode cpp">ranges<span class="op">::</span>shift_right</code><a href="#rangesshift_left-and-rangesshift_right-1" class="self-link"></a></h2>
<div>
<ol type="1">
<li>Edit <span>25.4 <a href="https://wg21.link/algorithm.syn">[algorithm.syn]</a></span>, header <code class="sourceCode cpp"><span class="op">&lt;</span>algorithm<span class="op">&gt;</span></code> synopsis, as indicated:</li>
</ol>
<blockquote>
<div>
<div class="sourceCode" id="cb6"><pre class="sourceCode diff"><code class="sourceCode diff"><span id="cb6-1"><a href="#cb6-1"></a></span>
<span id="cb6-2"><a href="#cb6-2"></a> namespace std {</span>
<span id="cb6-3"><a href="#cb6-3"></a></span>
<span id="cb6-4"><a href="#cb6-4"></a>   // [...]</span>
<span id="cb6-5"><a href="#cb6-5"></a></span>
<span id="cb6-6"><a href="#cb6-6"></a>   // <span>25.7.14 <a href="https://wg21.link/alg.shift">[alg.shift]</a></span>, shift</span>
<span id="cb6-7"><a href="#cb6-7"></a>   template&lt;class ForwardIterator&gt;</span>
<span id="cb6-8"><a href="#cb6-8"></a>     constexpr ForwardIterator</span>
<span id="cb6-9"><a href="#cb6-9"></a>       shift_left(ForwardIterator first, ForwardIterator last,</span>
<span id="cb6-10"><a href="#cb6-10"></a>                  typename iterator_traits&lt;ForwardIterator&gt;::difference_type n);</span>
<span id="cb6-11"><a href="#cb6-11"></a>   template&lt;class ExecutionPolicy, class ForwardIterator&gt;</span>
<span id="cb6-12"><a href="#cb6-12"></a>     ForwardIterator</span>
<span id="cb6-13"><a href="#cb6-13"></a>       shift_left(ExecutionPolicy&amp;&amp; exec,                        // see [algorithms.parallel.overloads]</span>
<span id="cb6-14"><a href="#cb6-14"></a>                  ForwardIterator first, ForwardIterator last,</span>
<span id="cb6-15"><a href="#cb6-15"></a>                  typename iterator_traits&lt;ForwardIterator&gt;::difference_type n);</span>
<span id="cb6-16"><a href="#cb6-16"></a></span>
<span id="cb6-17"><a href="#cb6-17"></a><span class="va">+  namespace ranges {</span></span>
<span id="cb6-18"><a href="#cb6-18"></a><span class="va">+    template&lt;permutable I, sentinel_for&lt;I&gt; S&gt;</span></span>
<span id="cb6-19"><a href="#cb6-19"></a><span class="va">+      constexpr subrange&lt;I&gt; shift_left(I first, S last, iter_difference_t&lt;I&gt; n);</span></span>
<span id="cb6-20"><a href="#cb6-20"></a><span class="va">+    template&lt;forward_range R&gt;</span></span>
<span id="cb6-21"><a href="#cb6-21"></a><span class="va">+      requires permutable&lt;iterator_t&lt;R&gt;&gt;</span></span>
<span id="cb6-22"><a href="#cb6-22"></a><span class="va">+      constexpr borrowed_subrange_t&lt;R&gt; shift_left(R&amp;&amp; r, range_difference_t&lt;R&gt; n);</span></span>
<span id="cb6-23"><a href="#cb6-23"></a><span class="va">+  }</span></span>
<span id="cb6-24"><a href="#cb6-24"></a></span>
<span id="cb6-25"><a href="#cb6-25"></a>   template&lt;class ForwardIterator&gt;</span>
<span id="cb6-26"><a href="#cb6-26"></a>     constexpr ForwardIterator</span>
<span id="cb6-27"><a href="#cb6-27"></a>       shift_right(ForwardIterator first, ForwardIterator last,</span>
<span id="cb6-28"><a href="#cb6-28"></a>                   typename iterator_traits&lt;ForwardIterator&gt;::difference_type n);</span>
<span id="cb6-29"><a href="#cb6-29"></a>   template&lt;class ExecutionPolicy, class ForwardIterator&gt;</span>
<span id="cb6-30"><a href="#cb6-30"></a>     ForwardIterator</span>
<span id="cb6-31"><a href="#cb6-31"></a>       shift_right(ExecutionPolicy&amp;&amp; exec,                       // see [algorithms.parallel.overloads]</span>
<span id="cb6-32"><a href="#cb6-32"></a>                   ForwardIterator first, ForwardIterator last,</span>
<span id="cb6-33"><a href="#cb6-33"></a>                   typename iterator_traits&lt;ForwardIterator&gt;::difference_type n);</span>
<span id="cb6-34"><a href="#cb6-34"></a></span>
<span id="cb6-35"><a href="#cb6-35"></a><span class="va">+  namespace ranges {</span></span>
<span id="cb6-36"><a href="#cb6-36"></a><span class="va">+    template&lt;permutable I, sentinel_for&lt;I&gt; S&gt;</span></span>
<span id="cb6-37"><a href="#cb6-37"></a><span class="va">+      constexpr subrange&lt;I&gt; shift_right(I first, S last, iter_difference_t&lt;I&gt; n);</span></span>
<span id="cb6-38"><a href="#cb6-38"></a><span class="va">+    template&lt;forward_range R&gt;</span></span>
<span id="cb6-39"><a href="#cb6-39"></a><span class="va">+      requires permutable&lt;iterator_t&lt;R&gt;&gt;</span></span>
<span id="cb6-40"><a href="#cb6-40"></a><span class="va">+      constexpr borrowed_subrange_t&lt;R&gt; shift_right(R&amp;&amp; r, range_difference_t&lt;R&gt; n);</span></span>
<span id="cb6-41"><a href="#cb6-41"></a><span class="va">+  }</span></span>
<span id="cb6-42"><a href="#cb6-42"></a></span>
<span id="cb6-43"><a href="#cb6-43"></a>   // [...]</span>
<span id="cb6-44"><a href="#cb6-44"></a> }</span></code></pre></div>
</div>
</blockquote>
<ol start="2" type="1">
<li>Edit <span>25.7.14 <a href="https://wg21.link/alg.shift">[alg.shift]</a></span> as indicated:</li>
</ol>
<blockquote>
<div>
<blockquote>
<div>
<div class="sourceCode" id="cb7"><pre class="sourceCode diff"><code class="sourceCode diff"><span id="cb7-1"><a href="#cb7-1"></a> template&lt;class ForwardIterator&gt;</span>
<span id="cb7-2"><a href="#cb7-2"></a>   constexpr ForwardIterator</span>
<span id="cb7-3"><a href="#cb7-3"></a>     shift_left(ForwardIterator first, ForwardIterator last,</span>
<span id="cb7-4"><a href="#cb7-4"></a>                typename iterator_traits&lt;ForwardIterator&gt;::difference_type n);</span>
<span id="cb7-5"><a href="#cb7-5"></a> template&lt;class ExecutionPolicy, class ForwardIterator&gt;</span>
<span id="cb7-6"><a href="#cb7-6"></a>   ForwardIterator</span>
<span id="cb7-7"><a href="#cb7-7"></a>     shift_left(ExecutionPolicy&amp;&amp; exec, ForwardIterator first, ForwardIterator last,</span>
<span id="cb7-8"><a href="#cb7-8"></a>                typename iterator_traits&lt;ForwardIterator&gt;::difference_type n);</span>
<span id="cb7-9"><a href="#cb7-9"></a><span class="va">+</span></span>
<span id="cb7-10"><a href="#cb7-10"></a><span class="va">+template&lt;permutable I, sentinel_for&lt;I&gt; S&gt;</span></span>
<span id="cb7-11"><a href="#cb7-11"></a><span class="va">+  constexpr subrange&lt;I&gt; ranges::shift_left(I first, S last, iter_difference_t&lt;I&gt; n);</span></span>
<span id="cb7-12"><a href="#cb7-12"></a><span class="va">+template&lt;forward_range R&gt;</span></span>
<span id="cb7-13"><a href="#cb7-13"></a><span class="va">+  requires permutable&lt;iterator_t&lt;R&gt;&gt;</span></span>
<span id="cb7-14"><a href="#cb7-14"></a><span class="va">+  constexpr borrowed_subrange_t&lt;R&gt; ranges::shift_left(R&amp;&amp; r, range_difference_t&lt;R&gt; n);</span></span></code></pre></div>
</div>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_2" id="pnum_2">1</a></span> <em>Preconditions:</em> <code class="sourceCode cpp">n <span class="op">&gt;=</span> <span class="dv">0</span></code> is <code class="sourceCode cpp"><span class="kw">true</span></code>. <span><span class="diffins">For the overloads in namespace <code class="sourceCode cpp">std</code>, t</span><span class="diffdel">T</span></span>he type of <code class="sourceCode cpp"><span class="op">*</span>first</code> meets the <em>Cpp17MoveAssignable</em> requirements.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_3" id="pnum_3">2</a></span> <em>Effects:</em> If <code class="sourceCode cpp">n <span class="op">==</span> <span class="dv">0</span></code> or <code class="sourceCode cpp">n <span class="op">&gt;=</span> last <span class="op">-</span> first</code>, does nothing. Otherwise, moves the element from position <code class="sourceCode cpp">first <span class="op">+</span> n <span class="op">+</span> i</code> into position <code class="sourceCode cpp">first <span class="op">+</span> i</code> for each non-negative integer <code class="sourceCode cpp">i <span class="op">&lt;</span> <span class="op">(</span>last <span class="op">-</span> first<span class="op">)</span> <span class="op">-</span> n</code>. <span><span class="diffins">For the overloads without an <code class="sourceCode cpp">ExecutionPolicy</code> template parameter</span><span class="diffdel">In the first overload case</span></span>, does so in order starting from <code class="sourceCode cpp">i <span class="op">=</span> <span class="dv">0</span></code> and proceeding to <code class="sourceCode cpp">i <span class="op">=</span> <span class="op">(</span>last <span class="op">-</span> first<span class="op">)</span> <span class="op">-</span> n <span class="op">-</span> <span class="dv">1</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_4" id="pnum_4">3</a></span> <em>Returns:</em> <span class="diffins">Let <span class="math inline"><em>N</em><em>E</em><em>W</em>_<em>L</em><em>A</em><em>S</em><em>T</em></span> be</span> <code class="sourceCode cpp">first <span class="op">+</span> <span class="op">(</span>last <span class="op">-</span> first <span class="op">-</span> n<span class="op">)</span></code> if <code class="sourceCode cpp">n <span class="op">&lt;</span> last <span class="op">-</span> first</code>, otherwise <code class="sourceCode cpp">first</code>.</p>
<div class="add" style="color: #006e28">

<ul>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_5" id="pnum_5">(3.1)</a></span> <span class="math inline"><em>N</em><em>E</em><em>W</em>_<em>L</em><em>A</em><em>S</em><em>T</em></span> for the overloads in namespace <code class="sourceCode default">std</code>.</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_6" id="pnum_6">(3.2)</a></span> <code class="sourceCode default">{first, <em>NEW_LAST</em>}</code> for the overloads in namespace <code class="sourceCode default">ranges</code>.</li>
</ul>

</div>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_7" id="pnum_7">4</a></span> <em>Complexity:</em> At most <code class="sourceCode cpp"><span class="op">(</span>last <span class="op">-</span> first<span class="op">)</span> <span class="op">-</span> n</code> assignments.</p>
<div>
<div class="sourceCode" id="cb8"><pre class="sourceCode diff"><code class="sourceCode diff"><span id="cb8-1"><a href="#cb8-1"></a> template&lt;class ForwardIterator&gt;</span>
<span id="cb8-2"><a href="#cb8-2"></a>   constexpr ForwardIterator</span>
<span id="cb8-3"><a href="#cb8-3"></a>     shift_right(ForwardIterator first, ForwardIterator last,</span>
<span id="cb8-4"><a href="#cb8-4"></a>                 typename iterator_traits&lt;ForwardIterator&gt;::difference_type n);</span>
<span id="cb8-5"><a href="#cb8-5"></a> template&lt;class ExecutionPolicy, class ForwardIterator&gt;</span>
<span id="cb8-6"><a href="#cb8-6"></a>   ForwardIterator</span>
<span id="cb8-7"><a href="#cb8-7"></a>     shift_right(ExecutionPolicy&amp;&amp; exec, ForwardIterator first, ForwardIterator last,</span>
<span id="cb8-8"><a href="#cb8-8"></a>                 typename iterator_traits&lt;ForwardIterator&gt;::difference_type n);</span>
<span id="cb8-9"><a href="#cb8-9"></a><span class="va">+</span></span>
<span id="cb8-10"><a href="#cb8-10"></a><span class="va">+template&lt;permutable I, sentinel_for&lt;I&gt; S&gt;</span></span>
<span id="cb8-11"><a href="#cb8-11"></a><span class="va">+  constexpr subrange&lt;I&gt; ranges::shift_right(I first, S last, iter_difference_t&lt;I&gt; n);</span></span>
<span id="cb8-12"><a href="#cb8-12"></a><span class="va">+template&lt;forward_range R&gt;</span></span>
<span id="cb8-13"><a href="#cb8-13"></a><span class="va">+  requires permutable&lt;iterator_t&lt;R&gt;&gt;</span></span>
<span id="cb8-14"><a href="#cb8-14"></a><span class="va">+  constexpr borrowed_subrange_t&lt;R&gt; ranges::shift_right(R&amp;&amp; r, range_difference_t&lt;R&gt; n);</span></span></code></pre></div>
</div>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_8" id="pnum_8">5</a></span> <em>Preconditions:</em> <code class="sourceCode cpp">n <span class="op">&gt;=</span> <span class="dv">0</span></code> is <code class="sourceCode cpp"><span class="kw">true</span></code>. <span><span class="diffins">For the overloads in namespace <code class="sourceCode cpp">std</code>, t</span><span class="diffdel">T</span></span>he type of <code class="sourceCode cpp"><span class="op">*</span>first</code> meets the <em>Cpp17MoveAssignable</em> requirements<span><span class="diffins">, and</span><span class="diffdel">.</span></span> <code class="sourceCode cpp">ForwardIterator</code> meets the <em>Cpp17BidirectionalIterator</em> requirements (<span>23.3.5.6 <a href="https://wg21.link/bidirectional.iterators">[bidirectional.iterators]</a></span>) or the <em>Cpp17ValueSwappable</em> requirements.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_9" id="pnum_9">6</a></span> <em>Effects:</em> If <code class="sourceCode cpp">n <span class="op">==</span> <span class="dv">0</span></code> or <code class="sourceCode cpp">n <span class="op">&gt;=</span> last <span class="op">-</span> first</code>, does nothing. Otherwise, moves the element from position <code class="sourceCode cpp">first <span class="op">+</span> i</code> into position <code class="sourceCode cpp">first <span class="op">+</span> n <span class="op">+</span> i</code> for each non-negative integer <code class="sourceCode cpp">i <span class="op">&lt;</span> <span class="op">(</span>last <span class="op">-</span> first<span class="op">)</span> <span class="op">-</span> n</code>. <span class="diffdel">In the first overload case, if <code class="sourceCode cpp">ForwardIterator</code> meets the <em>Cpp17BidirectionalIterator</em> requirements, d</span><span class="diffins">D</span>oes so in order starting from <code class="sourceCode cpp">i <span class="op">=</span> <span class="op">(</span>last <span class="op">-</span> first<span class="op">)</span> <span class="op">-</span> n <span class="op">-</span> <span class="dv">1</span></code> and proceeding to <code class="sourceCode cpp">i <span class="op">=</span> <span class="dv">0</span></code> <span><span class="diffins">if:</span><span class="diffdel">.</span></span></p>
<div class="add" style="color: #006e28">

<ul>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_10" id="pnum_10">(6.1)</a></span> for the overload in namespace <code class="sourceCode default">std</code> without an <code class="sourceCode default">ExecutionPolicy</code> template parameter, <code class="sourceCode default">ForwardIterator</code> meets the <em>Cpp17BidirectionalIterator</em> requirements.</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_11" id="pnum_11">(6.2)</a></span> for the overloads in namespace <code class="sourceCode default">ranges</code>, <code class="sourceCode default">decltype(first)</code> models <code class="sourceCode default">bidirectional_iterator</code>.</li>
</ul>

</div>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_12" id="pnum_12">7</a></span> <em>Returns:</em> <span class="diffins">Let <span class="math inline"><em>N</em><em>E</em><em>W</em>_<em>F</em><em>I</em><em>R</em><em>S</em><em>T</em></span> be</span> <code class="sourceCode cpp">first <span class="op">+</span> n</code> if <code class="sourceCode cpp">n <span class="op">&lt;</span> last <span class="op">-</span> first</code>, otherwise <code class="sourceCode cpp">last</code>.</p>
<div class="add" style="color: #006e28">

<ul>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_13" id="pnum_13">(7.1)</a></span> <span class="math inline"><em>N</em><em>E</em><em>W</em>_<em>F</em><em>I</em><em>R</em><em>S</em><em>T</em></span> for the overloads in namespace <code class="sourceCode default">std</code>.</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_14" id="pnum_14">(7.2)</a></span> <code class="sourceCode default">{<em>NEW_FIRST</em>, last}</code> for the overloads in namespace <code class="sourceCode default">ranges</code>.</li>
</ul>

</div>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_15" id="pnum_15">8</a></span> <em>Complexity:</em> At most <code class="sourceCode cpp"><span class="op">(</span>last <span class="op">-</span> first<span class="op">)</span> <span class="op">-</span> n</code> assignments or swaps.</p>
</blockquote>
</div>
</blockquote>
<ol start="3" type="1">
<li>Update the value of <code class="sourceCode cpp">__cpp_lib_shift</code> in <span>17.3.2 <a href="https://wg21.link/version.syn">[version.syn]</a></span> to reflect the date of adoption of this proposal.</li>
</ol>
</div>
<h1 data-number="4" style="border-bottom:1px solid #cccccc" id="bibliography"><span class="header-section-number">4</span> References<a href="#bibliography" class="self-link"></a></h1>
<div id="refs" class="references hanging-indent" role="doc-bibliography">
<div id="ref-P1243R3">
<p>[P1243R3] Dan Raviv. 2020-01-09. Rangify New Algorithms. <br />
<a href="https://wg21.link/p1243r3">https://wg21.link/p1243r3</a></p>
</div>
<div id="ref-P1813R0">
<p>[P1813R0] Christopher Di Bella. 2019-08-02. A Concept Design for the Numeric Algorithms. <br />
<a href="https://wg21.link/p1813r0">https://wg21.link/p1813r0</a></p>
</div>
<div id="ref-P2214R0">
<p>[P2214R0] Barry Revzin, Conor Hoekstra, Tim Song. 2020-10-15. A Plan for C++23 Ranges. <br />
<a href="https://wg21.link/p2214r0">https://wg21.link/p2214r0</a></p>
</div>
</div>
</div>
</div>
</body>
</html>
