<!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-14" />
  <title>Windowing range adaptors: views::chunk and views::slide</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">Windowing range adaptors: <code class="sourceCode cpp">views<span class="op">::</span>chunk</code> and <code class="sourceCode cpp">views<span class="op">::</span>slide</code></h1>

<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P2442R0</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2021-09-14</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="#example"><span class="toc-section-number">2</span> Example<span></span></a></li>
<li><a href="#design"><span class="toc-section-number">3</span> Design<span></span></a>
<ul>
<li><a href="#chunk"><span class="toc-section-number">3.1</span> <code class="sourceCode cpp">chunk</code><span></span></a>
<ul>
<li><a href="#input-range-support"><span class="toc-section-number">3.1.1</span> Input range support<span></span></a></li>
<li><a href="#value-type"><span class="toc-section-number">3.1.2</span> Value type<span></span></a></li>
<li><a href="#conditionally-common"><span class="toc-section-number">3.1.3</span> Conditionally common<span></span></a></li>
<li><a href="#conditionally-borrowed"><span class="toc-section-number">3.1.4</span> Conditionally borrowed<span></span></a></li>
<li><a href="#implementation-notes"><span class="toc-section-number">3.1.5</span> Implementation notes<span></span></a></li>
</ul></li>
<li><a href="#slide"><span class="toc-section-number">3.2</span> <code class="sourceCode cpp">slide</code><span></span></a>
<ul>
<li><a href="#forward-ranges-only"><span class="toc-section-number">3.2.1</span> Forward ranges only<span></span></a></li>
<li><a href="#value-type-1"><span class="toc-section-number">3.2.2</span> Value type<span></span></a></li>
<li><a href="#conditionally-common-and-borrowed"><span class="toc-section-number">3.2.3</span> Conditionally common and borrowed<span></span></a></li>
<li><a href="#implementation-notes-1"><span class="toc-section-number">3.2.4</span> Implementation notes<span></span></a></li>
</ul></li>
<li><a href="#implementation-experience"><span class="toc-section-number">3.3</span> Implementation experience<span></span></a></li>
</ul></li>
<li><a href="#wording"><span class="toc-section-number">4</span> Wording<span></span></a>
<ul>
<li><a href="#addition-to-ranges"><span class="toc-section-number">4.1</span> Addition to <code class="sourceCode cpp"><span class="op">&lt;</span>ranges<span class="op">&gt;</span></code><span></span></a></li>
<li><a href="#chunk-1"><span class="toc-section-number">4.2</span> <code class="sourceCode cpp">chunk</code><span></span></a>
<ul>
<li><a href="#chunk-view-range.chunk">24.7.? Chunk view [range.chunk]<span></span></a>
<ul>
<li><a href="#overview-range.chunk.overview">24.7.?.1 Overview [range.chunk.overview]<span></span></a></li>
<li><a href="#chunk_view-for-input-ranges-range.chunk.view.input">24.7.?.2 <code class="sourceCode cpp">chunk_view</code> for input ranges [range.chunk.view.input]<span></span></a></li>
<li><a href="#class-chunk_viewouter-iterator-range.chunk.outer.iter">24.7.?.3 Class <code class="sourceCode cpp">chunk_view<span class="op">::</span><em>outer-iterator</em></code> [range.chunk.outer.iter]<span></span></a></li>
<li><a href="#class-chunk_viewouter-iteratorvalue_type-range.chunk.outer.value">24.7.?.4 Class <code class="sourceCode cpp">chunk_view<span class="op">::</span><em>outer-iterator</em><span class="op">::</span>value_type</code> [range.chunk.outer.value]<span></span></a></li>
<li><a href="#class-chunk_viewinner-iterator-range.chunk.inner.iter">24.7.?.5 Class <code class="sourceCode cpp">chunk_view<span class="op">::</span><em>inner-iterator</em></code> [range.chunk.inner.iter]<span></span></a></li>
<li><a href="#chunk_view-for-forward-ranges-range.chunk.view.fwd">24.7.?.6 <code class="sourceCode cpp">chunk_view</code> for forward ranges [range.chunk.view.fwd]<span></span></a></li>
<li><a href="#class-template-chunk_viewviterator-for-forward-ranges-range.chunk.fwd.iter">24.7.?.7 Class template <code class="sourceCode cpp">chunk_view<span class="op">&lt;</span>V<span class="op">&gt;::</span><em>iterator</em></code> for forward ranges [range.chunk.fwd.iter]<span></span></a></li>
</ul></li>
</ul></li>
<li><a href="#slide-1"><span class="toc-section-number">4.3</span> <code class="sourceCode cpp">slide</code><span></span></a>
<ul>
<li><a href="#slide-view-range.slide">24.7.? Slide view [range.slide]<span></span></a>
<ul>
<li><a href="#overview-range.slide.overview">24.7.?.1 Overview [range.slide.overview]<span></span></a></li>
<li><a href="#class-template-slide_view-range.slide.view">24.7.?.2 Class template <code class="sourceCode cpp">slide_view</code> [range.slide.view]<span></span></a></li>
<li><a href="#class-template-slide_viewiterator-range.slide.iterator">24.7.?.3 Class template <code class="sourceCode cpp">slide_view<span class="op">::</span><em>iterator</em></code> [range.slide.iterator]<span></span></a></li>
<li><a href="#class-slide_viewsentinel-range.slide.sentinel">24.7.?.4 Class <code class="sourceCode cpp">slide_view<span class="op">::</span><em>sentinel</em></code> [range.slide.sentinel]<span></span></a></li>
</ul></li>
</ul></li>
<li><a href="#feature-test-macro"><span class="toc-section-number">4.4</span> Feature-test macro<span></span></a></li>
</ul></li>
<li><a href="#bibliography"><span class="toc-section-number">5</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 two range adaptors, <code class="sourceCode cpp">views<span class="op">::</span>chunk</code> and <code class="sourceCode cpp">views<span class="op">::</span>slide</code>, as described in section 3.5 of <span class="citation" data-cites="P2214R0">[<a href="#ref-P2214R0" role="doc-biblioref">P2214R0</a>]</span>.</p>
<h1 data-number="2" style="border-bottom:1px solid #cccccc" id="example"><span class="header-section-number">2</span> Example<a href="#example" class="self-link"></a></h1>
<div class="sourceCode" id="cb1"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb1-1"><a href="#cb1-1"></a>std<span class="op">::</span>vector v <span class="op">=</span> <span class="op">{</span><span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">4</span>, <span class="dv">5</span><span class="op">}</span>;</span>
<span id="cb1-2"><a href="#cb1-2"></a>fmt<span class="op">::</span>print<span class="op">(</span><span class="st">&quot;{}</span><span class="sc">\n</span><span class="st">&quot;</span>, v <span class="op">|</span> std<span class="op">::</span>views<span class="op">::</span>chunk<span class="op">(</span><span class="dv">2</span><span class="op">))</span>;   <span class="co">// [[1, 2], [3, 4], [5]]</span></span>
<span id="cb1-3"><a href="#cb1-3"></a>fmt<span class="op">::</span>print<span class="op">(</span><span class="st">&quot;{}</span><span class="sc">\n</span><span class="st">&quot;</span>, v <span class="op">|</span> std<span class="op">::</span>views<span class="op">::</span>slide<span class="op">(</span><span class="dv">2</span><span class="op">))</span>;   <span class="co">// [[1, 2], [2, 3], [3, 4], [4, 5]]</span></span></code></pre></div>
<h1 data-number="3" style="border-bottom:1px solid #cccccc" id="design"><span class="header-section-number">3</span> Design<a href="#design" class="self-link"></a></h1>
<p>Both of these range adaptors are well-known quantities that have been shipped in range-v3 for years and are further discussed in section 3.5 of <span class="citation" data-cites="P2214R0">[<a href="#ref-P2214R0" role="doc-biblioref">P2214R0</a>]</span>. The discussion below assumes familiarity with that paper.</p>
<h2 data-number="3.1" id="chunk"><span class="header-section-number">3.1</span> <code class="sourceCode cpp">chunk</code><a href="#chunk" class="self-link"></a></h2>
<p>The basic idea of <code class="sourceCode cpp">chunk</code> is simple: <code class="sourceCode cpp">views<span class="op">::</span>chunk<span class="op">(</span>R, N<span class="op">)</span></code> divides <code class="sourceCode cpp">R</code> into non-overlapping N-sized chunks, except that the last chunk can be smaller than <code class="sourceCode cpp">N</code> in size. It is a precondition that <code class="sourceCode cpp">N</code> is positive.</p>
<h3 data-number="3.1.1" id="input-range-support"><span class="header-section-number">3.1.1</span> Input range support<a href="#input-range-support" class="self-link"></a></h3>
<p>Matching the range-v3 implementation, the proposed <code class="sourceCode cpp">chunk</code> supports input ranges, even though the algorithm necessary for such support is significantly different.</p>
<p>In particular, for input ranges, the underlying iterator as well as related iteration state is tracked in the <code class="sourceCode cpp">chunk_view</code> object itself. This means that this <code class="sourceCode cpp">chunk_view</code> can only support non-<code class="sourceCode cpp"><span class="kw">const</span></code> iteration. As a point of departure from range-v3, both outer and inner iterators are move-only input iterators.</p>
<p>Because the inner iterator and outer iterator share state, and moving from the stored underlying iterators can invalidate both iterators, only the non-mutating <code class="sourceCode cpp">base<span class="op">()</span> <span class="kw">const</span><span class="op">&amp;</span></code> overload is provided for the inner iterator to avoid this sort of spooky-action-at-a-distance invalidation:</p>
<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">auto</span> v <span class="op">=</span> some_input_view <span class="op">|</span> views<span class="op">::</span>chunk<span class="op">(</span><span class="dv">2</span><span class="op">)</span>;</span>
<span id="cb2-2"><a href="#cb2-2"></a><span class="kw">auto</span> outer <span class="op">=</span> v<span class="op">.</span>begin<span class="op">()</span>;</span>
<span id="cb2-3"><a href="#cb2-3"></a><span class="kw">auto</span> range <span class="op">=</span> <span class="op">*</span>outer;</span>
<span id="cb2-4"><a href="#cb2-4"></a>range<span class="op">.</span>begin<span class="op">().</span>base<span class="op">()</span>; <span class="co">// if this moved the underlying iterator, outer would be invalidated</span></span></code></pre></div>
<p>Providing <code class="sourceCode cpp">base<span class="op">()</span></code> for the outer iterator would be misleading as the stored iterator mutates when the inner range is being iterated over.</p>
<h3 data-number="3.1.2" id="value-type"><span class="header-section-number">3.1.2</span> Value type<a href="#value-type" class="self-link"></a></h3>
<p>For input ranges, <code class="sourceCode cpp">chunk</code> has a bespoke value type that is itself an input view. For forward and stronger ranges, <code class="sourceCode cpp">chunk</code> defers to <code class="sourceCode cpp">views<span class="op">::</span>take</code> for its value type.</p>
<h3 data-number="3.1.3" id="conditionally-common"><span class="header-section-number">3.1.3</span> Conditionally common<a href="#conditionally-common" class="self-link"></a></h3>
<p>In range-v3, <code class="sourceCode cpp">chunk</code> is never a common range. <code class="sourceCode cpp">chunk</code> as proposed here is a common range if the underlying range is forward, common, and either sized or non-bidirectional.</p>
<p>For bidirectional and stronger ranges, the need to size the last chunk correctly from the end iterator requires the underlying range to be sized.</p>
<h3 data-number="3.1.4" id="conditionally-borrowed"><span class="header-section-number">3.1.4</span> Conditionally borrowed<a href="#conditionally-borrowed" class="self-link"></a></h3>
<p>As with range-v3, this paper proposes that <code class="sourceCode cpp">chunk</code> is borrowed if the underlying view is forward and borrowed.</p>
<h3 data-number="3.1.5" id="implementation-notes"><span class="header-section-number">3.1.5</span> Implementation notes<a href="#implementation-notes" class="self-link"></a></h3>
<p>For input ranges, <code class="sourceCode cpp">chunk_view</code> stores</p>
<ul>
<li>the current underlying iterator (<code class="sourceCode cpp"><em>current_</em></code>); and</li>
<li>the number of elements left in the current chunk (<code class="sourceCode cpp"><em>remainder_</em></code>).</li>
</ul>
<p>Incrementing the inner iterator increments <code class="sourceCode cpp"><em>current_</em></code> and decrements <code class="sourceCode cpp"><em>remainder_</em></code>, setting it to zero if the end of the chunk is reached.</p>
<p>Incrementing the outer iterator increments <code class="sourceCode cpp"><em>current_</em></code> <code class="sourceCode cpp"><em>remainder_</em></code> times so that we start at the next N-element chunk even if the inner view isn’t iterated to end, and then sets <code class="sourceCode cpp"><em>remainder_</em></code> to the chunk size.</p>
<p>For forward and stronger ranges, <code class="sourceCode cpp">chunk_view</code>’s <code class="sourceCode cpp"><em>iterator</em></code> stores an exposition-only data member <code class="sourceCode cpp"><em>offset_</em></code>. This data member can only be nonzero when the iterator is the past-the-end iterator, in which case it represents the difference between <em>N</em> and the size of the last chunk.</p>
<h2 data-number="3.2" id="slide"><span class="header-section-number">3.2</span> <code class="sourceCode cpp">slide</code><a href="#slide" class="self-link"></a></h2>
<p><code class="sourceCode cpp">views<span class="op">::</span>slide<span class="op">(</span>R, N<span class="op">)</span></code> produces a range of ranges such that the <em>M</em>-th range is a view into the <em>M</em>-th through (<em>M</em>+<em>N</em>-1)-th elements of <code class="sourceCode cpp">R</code>. It is similar to <code class="sourceCode cpp">views<span class="op">::</span>adjacent</code> (<span class="citation" data-cites="P2321R2">[<a href="#ref-P2321R2" role="doc-biblioref">P2321R2</a>]</span>), except that the size of the window <em>N</em> is provided at runtime. It is a precondition that <em>N</em> is positive.</p>
<h3 data-number="3.2.1" id="forward-ranges-only"><span class="header-section-number">3.2.1</span> Forward ranges only<a href="#forward-ranges-only" class="self-link"></a></h3>
<p>Unlike <code class="sourceCode cpp">chunk</code>, and similar to <code class="sourceCode cpp">adjacent</code>, <code class="sourceCode cpp">slide</code> does not support input ranges. It might be possible to support a window size of 1 - but then users can just use <code class="sourceCode cpp">chunk</code> instead. Caching elements is not considered a viable approach, essentially for the reasons discussed in section 4.3.4 of <span class="citation" data-cites="P2321R2">[<a href="#ref-P2321R2" role="doc-biblioref">P2321R2</a>]</span>.</p>
<h3 data-number="3.2.2" id="value-type-1"><span class="header-section-number">3.2.2</span> Value type<a href="#value-type-1" class="self-link"></a></h3>
<p><code class="sourceCode cpp">slide</code> defers to <code class="sourceCode cpp">views<span class="op">::</span>counted</code> for its value type.</p>
<h3 data-number="3.2.3" id="conditionally-common-and-borrowed"><span class="header-section-number">3.2.3</span> Conditionally common and borrowed<a href="#conditionally-common-and-borrowed" class="self-link"></a></h3>
<p><code class="sourceCode cpp">slide</code> is a common range if the underlying range is (or can be trivially made one), and is a borrowed range if the underlying range is.</p>
<h3 data-number="3.2.4" id="implementation-notes-1"><span class="header-section-number">3.2.4</span> Implementation notes<a href="#implementation-notes-1" class="self-link"></a></h3>
<p>There are basically two strategies for <code class="sourceCode cpp">slide</code>. For simplicity the discussion below ignores the case where the number of elements in the source view is less than <code class="sourceCode cpp">N</code>.</p>
<ul>
<li>When the end iterator of the underlying range can be known in constant time and is at least bidirectional, <code class="sourceCode cpp">slide</code> can go back <code class="sourceCode cpp">N <span class="op">-</span> <span class="dv">1</span></code> elements from that iterator to find the first iterator that can’t start a range. In this case, <code class="sourceCode cpp">slide</code>’s iterator need only store the first iterator of the window <code class="sourceCode cpp">i</code> and the window size <code class="sourceCode cpp">N</code>.</li>
<li>Otherwise, <code class="sourceCode cpp">slide</code>’s iterator must also store the iterator to the last element in the window (that is, <code class="sourceCode cpp">i <span class="op">+</span> <span class="op">(</span>N <span class="op">-</span> <span class="dv">1</span><span class="op">)</span></code>). When that iterator compares equal to the end of the source range, the iterator is past-the-end (since we can no longer produce a range of <code class="sourceCode cpp">N</code> elements).</li>
</ul>
<h2 data-number="3.3" id="implementation-experience"><span class="header-section-number">3.3</span> Implementation experience<a href="#implementation-experience" class="self-link"></a></h2>
<p>Both <code class="sourceCode cpp">chunk</code> and <code class="sourceCode cpp">slide</code> (under the name <code class="sourceCode cpp">sliding</code>) have been implemented in range-v3, and much of the subtler aspects of the implementation logic in the wording below are taken from there (any errors are mine, of course, though hopefully there isn’t any).</p>
<p>I also have implemented a version that directly follows the proposed wording below without issue.</p>
<h1 data-number="4" style="border-bottom:1px solid #cccccc" id="wording"><span class="header-section-number">4</span> Wording<a href="#wording" class="self-link"></a></h1>
<h2 data-number="4.1" id="addition-to-ranges"><span class="header-section-number">4.1</span> Addition to <code class="sourceCode cpp"><span class="op">&lt;</span>ranges<span class="op">&gt;</span></code><a href="#addition-to-ranges" class="self-link"></a></h2>
<p>Add the following to <span>24.2 <a href="https://wg21.link/ranges.syn">[ranges.syn]</a></span>, header <code class="sourceCode cpp"><span class="op">&lt;</span>ranges<span class="op">&gt;</span></code> synopsis:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb3-1"><a href="#cb3-1"></a><span class="co">// [...]</span></span>
<span id="cb3-2"><a href="#cb3-2"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb3-3"><a href="#cb3-3"></a>  <span class="co">// [...]</span></span>
<span id="cb3-4"><a href="#cb3-4"></a></span>
<span id="cb3-5"><a href="#cb3-5"></a>  <span class="co">// [range.chunk], chunk view</span></span>
<span id="cb3-6"><a href="#cb3-6"></a>  <span class="kw">template</span><span class="op">&lt;</span>view V<span class="op">&gt;</span></span>
<span id="cb3-7"><a href="#cb3-7"></a>    <span class="kw">requires</span> input_range<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb3-8"><a href="#cb3-8"></a>  <span class="kw">class</span> chunk_view;</span>
<span id="cb3-9"><a href="#cb3-9"></a></span>
<span id="cb3-10"><a href="#cb3-10"></a>  <span class="kw">template</span><span class="op">&lt;</span>view V<span class="op">&gt;</span></span>
<span id="cb3-11"><a href="#cb3-11"></a>    <span class="kw">requires</span> forward_range<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb3-12"><a href="#cb3-12"></a>  <span class="kw">class</span> chunk_view<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb3-13"><a href="#cb3-13"></a></span>
<span id="cb3-14"><a href="#cb3-14"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> V<span class="op">&gt;</span></span>
<span id="cb3-15"><a href="#cb3-15"></a>    <span class="kw">inline</span> <span class="kw">constexpr</span> <span class="dt">bool</span> enable_borrowed_range<span class="op">&lt;</span>chunk_view<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span> <span class="op">=</span></span>
<span id="cb3-16"><a href="#cb3-16"></a>      forward_range<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> enable_borrowed_range<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb3-17"><a href="#cb3-17"></a></span>
<span id="cb3-18"><a href="#cb3-18"></a>  <span class="kw">namespace</span> views <span class="op">{</span></span>
<span id="cb3-19"><a href="#cb3-19"></a>    <span class="kw">inline</span> <span class="kw">constexpr</span> <em>unspecified</em> chunk <span class="op">=</span> <em>unspecified</em>;</span>
<span id="cb3-20"><a href="#cb3-20"></a>  <span class="op">}</span></span>
<span id="cb3-21"><a href="#cb3-21"></a></span>
<span id="cb3-22"><a href="#cb3-22"></a>  <span class="co">// [range.slide], slide view</span></span>
<span id="cb3-23"><a href="#cb3-23"></a>  <span class="kw">template</span><span class="op">&lt;</span>view V<span class="op">&gt;</span></span>
<span id="cb3-24"><a href="#cb3-24"></a>    <span class="kw">requires</span> forward_range<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb3-25"><a href="#cb3-25"></a>  <span class="kw">class</span> slide_view;</span>
<span id="cb3-26"><a href="#cb3-26"></a></span>
<span id="cb3-27"><a href="#cb3-27"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> V<span class="op">&gt;</span></span>
<span id="cb3-28"><a href="#cb3-28"></a>    <span class="kw">inline</span> <span class="kw">constexpr</span> <span class="dt">bool</span> enable_borrowed_range<span class="op">&lt;</span>slide_view<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span> <span class="op">=</span></span>
<span id="cb3-29"><a href="#cb3-29"></a>      enable_borrowed_range<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb3-30"><a href="#cb3-30"></a></span>
<span id="cb3-31"><a href="#cb3-31"></a>  <span class="kw">namespace</span> views <span class="op">{</span></span>
<span id="cb3-32"><a href="#cb3-32"></a>    <span class="kw">inline</span> <span class="kw">constexpr</span> <em>unspecified</em> slide <span class="op">=</span> <em>unspecified</em>;</span>
<span id="cb3-33"><a href="#cb3-33"></a>  <span class="op">}</span></span>
<span id="cb3-34"><a href="#cb3-34"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="4.2" id="chunk-1"><span class="header-section-number">4.2</span> <code class="sourceCode cpp">chunk</code><a href="#chunk-1" class="self-link"></a></h2>
<p>Add the following subclause to <span>24.7 <a href="https://wg21.link/range.adaptors">[range.adaptors]</a></span>.</p>
<h3 class="unnumbered" data-number id="chunk-view-range.chunk">24.7.? Chunk view [range.chunk]<a href="#chunk-view-range.chunk" class="self-link"></a></h3>
<h4 class="unnumbered" data-number id="overview-range.chunk.overview">24.7.?.1 Overview [range.chunk.overview]<a href="#overview-range.chunk.overview" class="self-link"></a></h4>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_1" id="pnum_1">1</a></span> <code class="sourceCode cpp">chunk_view</code> takes a <code class="sourceCode cpp">view</code> and a number <em>N</em> and produces a range of views that are <em>N</em>-sized non-overlapping contiguous chunks of the elements of the original view, in order. The last view in the range can have fewer than <em>N</em> elements.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_2" id="pnum_2">2</a></span> The name <code class="sourceCode cpp">views<span class="op">::</span>chunk</code> denotes a range adaptor object (<span>24.7.2 <a href="https://wg21.link/range.adaptor.object">[range.adaptor.object]</a></span>). Given subexpressions <code class="sourceCode cpp">E</code> and <code class="sourceCode cpp">N</code>, the expression <code class="sourceCode cpp">views<span class="op">::</span>chunk<span class="op">(</span>E, N<span class="op">)</span></code> is expression-equivalent to <code class="sourceCode cpp">chunk_view<span class="op">(</span>E, N<span class="op">)</span></code>.</p>
<div class="example">
<span>[ <em>Example 1:</em> </span>
<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb4-1"><a href="#cb4-1"></a>vector v <span class="op">=</span> <span class="op">{</span><span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">4</span>, <span class="dv">5</span><span class="op">}</span>;</span>
<span id="cb4-2"><a href="#cb4-2"></a></span>
<span id="cb4-3"><a href="#cb4-3"></a><span class="cf">for</span> <span class="op">(</span><span class="kw">auto</span> r <span class="op">:</span> v <span class="op">|</span> views<span class="op">::</span>chunk<span class="op">(</span><span class="dv">2</span><span class="op">))</span> <span class="op">{</span></span>
<span id="cb4-4"><a href="#cb4-4"></a>  cout <span class="op">&lt;&lt;</span> <span class="ch">&#39;[&#39;</span>;</span>
<span id="cb4-5"><a href="#cb4-5"></a>  <span class="kw">auto</span> sep <span class="op">=</span> <span class="st">&quot;&quot;</span>;</span>
<span id="cb4-6"><a href="#cb4-6"></a>  <span class="cf">for</span><span class="op">(</span><span class="kw">auto</span> i <span class="op">:</span> r<span class="op">)</span> <span class="op">{</span></span>
<span id="cb4-7"><a href="#cb4-7"></a>    cout <span class="op">&lt;&lt;</span> sep <span class="op">&lt;&lt;</span> i;</span>
<span id="cb4-8"><a href="#cb4-8"></a>    sep <span class="op">=</span> <span class="st">&quot;, &quot;</span>;</span>
<span id="cb4-9"><a href="#cb4-9"></a>  <span class="op">}</span></span>
<span id="cb4-10"><a href="#cb4-10"></a>  cout <span class="op">&lt;&lt;</span> <span class="st">&quot;] &quot;</span>;</span>
<span id="cb4-11"><a href="#cb4-11"></a><span class="op">}</span></span>
<span id="cb4-12"><a href="#cb4-12"></a><span class="co">// prints: [1, 2] [3, 4] [5]</span></span></code></pre></div>
<span> — <em>end example</em> ]</span>
</div>
<h4 class="unnumbered" data-number id="chunk_view-for-input-ranges-range.chunk.view.input">24.7.?.2 <code class="sourceCode cpp">chunk_view</code> for input ranges [range.chunk.view.input]<a href="#chunk_view-for-input-ranges-range.chunk.view.input" class="self-link"></a></h4>
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="#cb5-1"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb5-2"><a href="#cb5-2"></a></span>
<span id="cb5-3"><a href="#cb5-3"></a><span class="kw">template</span><span class="op">&lt;</span>view V<span class="op">&gt;</span></span>
<span id="cb5-4"><a href="#cb5-4"></a>  <span class="kw">requires</span> input_range<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb5-5"><a href="#cb5-5"></a><span class="kw">class</span> chunk_view <span class="op">:</span> <span class="kw">public</span> view_interface<span class="op">&lt;</span>chunk_view<span class="op">&lt;</span>V<span class="op">&gt;&gt;{</span></span>
<span id="cb5-6"><a href="#cb5-6"></a>  V <em>base_</em> <span class="op">=</span> V<span class="op">()</span>;                        <span class="co">// exposition only</span></span>
<span id="cb5-7"><a href="#cb5-7"></a>  range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> <em>n_</em> <span class="op">=</span> <span class="dv">0</span>;         <span class="co">// exposition only</span></span>
<span id="cb5-8"><a href="#cb5-8"></a>  range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> <em>remainder_</em> <span class="op">=</span> <span class="dv">0</span>; <span class="co">// exposition only</span></span>
<span id="cb5-9"><a href="#cb5-9"></a></span>
<span id="cb5-10"><a href="#cb5-10"></a>  <em>non-propagating-cache</em><span class="op">&lt;</span>iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span> <em>current_</em>; <span class="co">// exposition only</span></span>
<span id="cb5-11"><a href="#cb5-11"></a></span>
<span id="cb5-12"><a href="#cb5-12"></a>  <span class="co">// [range.chunk.outer.iter], class chunk_view::<em>outer-iterator</em></span></span>
<span id="cb5-13"><a href="#cb5-13"></a>  <span class="kw">class</span> <em>outer-iterator</em>;                 <span class="co">// exposition only</span></span>
<span id="cb5-14"><a href="#cb5-14"></a>  <span class="co">// [range.chunk.inner.iter], class chunk_view::<em>inner-iterator</em></span></span>
<span id="cb5-15"><a href="#cb5-15"></a>  <span class="kw">class</span> <em>inner-iterator</em>;                 <span class="co">// exposition only</span></span>
<span id="cb5-16"><a href="#cb5-16"></a></span>
<span id="cb5-17"><a href="#cb5-17"></a><span class="kw">public</span><span class="op">:</span></span>
<span id="cb5-18"><a href="#cb5-18"></a>  chunk_view<span class="op">()</span> <span class="kw">requires</span> default_initializable<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb5-19"><a href="#cb5-19"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> chunk_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> n<span class="op">)</span>;</span>
<span id="cb5-20"><a href="#cb5-20"></a></span>
<span id="cb5-21"><a href="#cb5-21"></a>  <span class="kw">constexpr</span> V base<span class="op">()</span> <span class="kw">const</span> <span class="op">&amp;</span> <span class="kw">requires</span> copy_constructible<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">{</span> <span class="cf">return</span> <em>base_</em>; <span class="op">}</span></span>
<span id="cb5-22"><a href="#cb5-22"></a>  <span class="kw">constexpr</span> V base<span class="op">()</span> <span class="op">&amp;&amp;</span> <span class="op">{</span> <span class="cf">return</span> std<span class="op">::</span>move<span class="op">(</span><em>base_</em><span class="op">)</span>; <span class="op">}</span></span>
<span id="cb5-23"><a href="#cb5-23"></a></span>
<span id="cb5-24"><a href="#cb5-24"></a>  <span class="kw">constexpr</span> <em>outer-iterator</em> begin<span class="op">()</span>;</span>
<span id="cb5-25"><a href="#cb5-25"></a>  <span class="kw">constexpr</span> default_sentinel_t end<span class="op">()</span>;</span>
<span id="cb5-26"><a href="#cb5-26"></a></span>
<span id="cb5-27"><a href="#cb5-27"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb5-28"><a href="#cb5-28"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span>;</span>
<span id="cb5-29"><a href="#cb5-29"></a><span class="op">}</span>;</span>
<span id="cb5-30"><a href="#cb5-30"></a></span>
<span id="cb5-31"><a href="#cb5-31"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> R<span class="op">&gt;</span></span>
<span id="cb5-32"><a href="#cb5-32"></a>  chunk_view<span class="op">(</span>R<span class="op">&amp;&amp;</span> r, range_difference_t<span class="op">&lt;</span>R<span class="op">&gt;)</span> <span class="op">-&gt;</span> chunk_view<span class="op">&lt;</span>views<span class="op">::</span>all_t<span class="op">&lt;</span>R<span class="op">&gt;&gt;</span>;</span>
<span id="cb5-33"><a href="#cb5-33"></a></span>
<span id="cb5-34"><a href="#cb5-34"></a><span class="op">}</span></span></code></pre></div>
<div>
<div class="sourceCode" id="cb6"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb6-1"><a href="#cb6-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> chunk_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> n<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_3" id="pnum_3">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>.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_4" id="pnum_4">2</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>base_</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>base<span class="op">)</span></code> and <code class="sourceCode cpp"><em>n_</em></code> with <code class="sourceCode cpp">n</code>.</p>
</blockquote>
<div class="sourceCode" id="cb7"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb7-1"><a href="#cb7-1"></a><span class="kw">constexpr</span> <em>outer-iterator</em> begin<span class="op">()</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_5" id="pnum_5">3</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb8"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb8-1"><a href="#cb8-1"></a><em>current_</em> <span class="op">=</span> ranges<span class="op">::</span>begin<span class="op">(</span><em>base_</em><span class="op">)</span>;</span>
<span id="cb8-2"><a href="#cb8-2"></a><em>remainder_</em> <span class="op">=</span> <em>n_</em>;</span>
<span id="cb8-3"><a href="#cb8-3"></a><span class="cf">return</span> <em>outer-iterator</em><span class="op">(*</span><span class="kw">this</span><span class="op">)</span>;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb9"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb9-1"><a href="#cb9-1"></a><span class="kw">constexpr</span> default_sentinel_t end<span class="op">()</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_6" id="pnum_6">4</a></span> <em>Returns</em>: <code class="sourceCode cpp">default_sentinel</code>.</p>
</blockquote>
<div class="sourceCode" id="cb10"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb10-1"><a href="#cb10-1"></a><span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb10-2"><a href="#cb10-2"></a><span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_7" id="pnum_7">5</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb11"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb11-1"><a href="#cb11-1"></a><span class="kw">auto</span> sz <span class="op">=</span> <span class="op">(</span>ranges<span class="op">::</span>distance<span class="op">(</span><em>base_</em><span class="op">)</span> <span class="op">+</span> <em>n_</em> <span class="op">-</span> <span class="dv">1</span><span class="op">)</span> <span class="op">/</span> <em>n_</em>;</span>
<span id="cb11-2"><a href="#cb11-2"></a><span class="cf">return</span> <em>to-unsigned-like</em><span class="op">(</span>sz<span class="op">)</span>;</span></code></pre></div>
</blockquote>
</blockquote>
</div>
<h4 class="unnumbered" data-number id="class-chunk_viewouter-iterator-range.chunk.outer.iter">24.7.?.3 Class <code class="sourceCode cpp">chunk_view<span class="op">::</span><em>outer-iterator</em></code> [range.chunk.outer.iter]<a href="#class-chunk_viewouter-iterator-range.chunk.outer.iter" class="self-link"></a></h4>
<div class="sourceCode" id="cb12"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb12-1"><a href="#cb12-1"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb12-2"><a href="#cb12-2"></a>  <span class="kw">template</span><span class="op">&lt;</span>view V<span class="op">&gt;</span></span>
<span id="cb12-3"><a href="#cb12-3"></a>    <span class="kw">requires</span> input_range<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb12-4"><a href="#cb12-4"></a>  <span class="kw">class</span> chunk_view<span class="op">&lt;</span>V<span class="op">&gt;::</span><em>outer-iterator</em> <span class="op">{</span></span>
<span id="cb12-5"><a href="#cb12-5"></a>    chunk_view<span class="op">*</span> <em>parent_</em>;                                    <span class="co">// exposition only</span></span>
<span id="cb12-6"><a href="#cb12-6"></a></span>
<span id="cb12-7"><a href="#cb12-7"></a>    <span class="kw">constexpr</span> <span class="kw">explicit</span> <em>outer-iterator</em><span class="op">(</span>chunk_view<span class="op">&amp;</span> parent<span class="op">)</span>;  <span class="co">// exposition only</span></span>
<span id="cb12-8"><a href="#cb12-8"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb12-9"><a href="#cb12-9"></a>    <span class="kw">using</span> iterator_concept <span class="op">=</span> input_iterator_tag;</span>
<span id="cb12-10"><a href="#cb12-10"></a>    <span class="kw">using</span> difference_type  <span class="op">=</span> range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb12-11"><a href="#cb12-11"></a></span>
<span id="cb12-12"><a href="#cb12-12"></a>    <span class="co">// [range.chunk.outer.value], class chunk_view::<em>outer-iterator</em>::value_type</span></span>
<span id="cb12-13"><a href="#cb12-13"></a>    <span class="kw">struct</span> value_type;</span>
<span id="cb12-14"><a href="#cb12-14"></a></span>
<span id="cb12-15"><a href="#cb12-15"></a>    <em>outer-iterator</em><span class="op">(</span><em>outer-iterator</em><span class="op">&amp;&amp;)</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb12-16"><a href="#cb12-16"></a>    <em>outer-iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">=(</span><em>outer-iterator</em><span class="op">&amp;&amp;)</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb12-17"><a href="#cb12-17"></a></span>
<span id="cb12-18"><a href="#cb12-18"></a>    <span class="kw">constexpr</span> value_type <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span>
<span id="cb12-19"><a href="#cb12-19"></a>    <span class="kw">constexpr</span> <em>outer-iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb12-20"><a href="#cb12-20"></a>    <span class="kw">constexpr</span> <span class="dt">void</span> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb12-21"><a href="#cb12-21"></a></span>
<span id="cb12-22"><a href="#cb12-22"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>outer-iterator</em><span class="op">&amp;</span> x, default_sentinel_t<span class="op">)</span>;</span>
<span id="cb12-23"><a href="#cb12-23"></a></span>
<span id="cb12-24"><a href="#cb12-24"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span>default_sentinel_t y, <span class="kw">const</span> <em>outer-iterator</em><span class="op">&amp;</span> x<span class="op">)</span></span>
<span id="cb12-25"><a href="#cb12-25"></a>      <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span>
<span id="cb12-26"><a href="#cb12-26"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>outer-iterator</em><span class="op">&amp;</span> x, default_sentinel_t y<span class="op">)</span></span>
<span id="cb12-27"><a href="#cb12-27"></a>      <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span>
<span id="cb12-28"><a href="#cb12-28"></a>  <span class="op">}</span>;</span>
<span id="cb12-29"><a href="#cb12-29"></a><span class="op">}</span></span></code></pre></div>
<div>
<div class="sourceCode" id="cb13"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb13-1"><a href="#cb13-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> <em>outer-iterator</em><span class="op">(</span>chunk_view<span class="op">&amp;</span> parent<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_8" id="pnum_8">1</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>parent_</em></code> with <code class="sourceCode cpp">addressof<span class="op">(</span>parent<span class="op">)</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb14"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb14-1"><a href="#cb14-1"></a><span class="kw">constexpr</span> value_type <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_9" id="pnum_9">2</a></span> <em>Preconditions</em>: <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span> <span class="op">==</span> default_sentinel</code> is <code class="sourceCode cpp"><span class="kw">false</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_10" id="pnum_10">3</a></span> <em>Returns</em>: <code class="sourceCode cpp">value_type<span class="op">(*</span><em>parent_</em><span class="op">)</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb15"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb15-1"><a href="#cb15-1"></a><span class="kw">constexpr</span> <em>outer-iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_11" id="pnum_11">4</a></span> <em>Preconditions</em>: <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span> <span class="op">==</span> default_sentinel</code> is <code class="sourceCode cpp"><span class="kw">false</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_12" id="pnum_12">5</a></span> <em>Effects:</em> Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb16"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb16-1"><a href="#cb16-1"></a>   ranges<span class="op">::</span>advance<span class="op">(*</span><em>parent_</em><span class="op">-&gt;</span><em>current_</em>, <em>parent_</em><span class="op">-&gt;</span><em>remainder_</em>, ranges<span class="op">::</span>end<span class="op">(</span><em>parent_</em><span class="op">-&gt;</span><em>base_</em><span class="op">))</span>;</span>
<span id="cb16-2"><a href="#cb16-2"></a>   <em>parent_</em><span class="op">-&gt;</span><em>remainder_</em> <span class="op">=</span> <em>parent_</em><span class="op">-&gt;</span><em>n_</em>;</span>
<span id="cb16-3"><a href="#cb16-3"></a>   <span class="cf">return</span> <span class="op">*</span><span class="kw">this</span>;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb17"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb17-1"><a href="#cb17-1"></a><span class="kw">constexpr</span> <span class="dt">void</span> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_13" id="pnum_13">6</a></span> <em>Effects</em>: Equivalent to <code class="sourceCode cpp"><span class="op">++*</span><span class="kw">this</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb18"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb18-1"><a href="#cb18-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>outer-iterator</em><span class="op">&amp;</span> x, default_sentinel_t<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_14" id="pnum_14">7</a></span> <em>Returns:</em> <code class="sourceCode cpp"><span class="op">*</span>x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>current_</em> <span class="op">==</span> ranges<span class="op">::</span>end<span class="op">(</span>x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>base_</em><span class="op">)</span> <span class="op">&amp;&amp;</span> x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>remainder_</em> <span class="op">!=</span> <span class="dv">0</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb19"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb19-1"><a href="#cb19-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span>default_sentinel_t y, <span class="kw">const</span> <em>outer-iterator</em><span class="op">&amp;</span> x<span class="op">)</span></span>
<span id="cb19-2"><a href="#cb19-2"></a>  <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_15" id="pnum_15">8</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb20"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb20-1"><a href="#cb20-1"></a><span class="kw">const</span> <span class="kw">auto</span> dist <span class="op">=</span> ranges<span class="op">::</span>end<span class="op">(</span>x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>base_</em><span class="op">)</span> <span class="op">-</span> <span class="op">*</span>x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>current_</em>;</span>
<span id="cb20-2"><a href="#cb20-2"></a></span>
<span id="cb20-3"><a href="#cb20-3"></a><span class="cf">if</span> <span class="op">(</span>dist <span class="op">&lt;</span> x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>remainder_</em><span class="op">)</span> <span class="op">{</span></span>
<span id="cb20-4"><a href="#cb20-4"></a>  <span class="cf">return</span> dist <span class="op">==</span> <span class="dv">0</span> <span class="op">?</span> <span class="dv">0</span> <span class="op">:</span> <span class="dv">1</span>;</span>
<span id="cb20-5"><a href="#cb20-5"></a><span class="op">}</span></span>
<span id="cb20-6"><a href="#cb20-6"></a></span>
<span id="cb20-7"><a href="#cb20-7"></a><span class="cf">return</span> <span class="op">(</span>dist <span class="op">-</span> x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>remainder_</em> <span class="op">+</span> x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>n_</em> <span class="op">-</span> <span class="dv">1</span><span class="op">)</span> <span class="op">/</span> x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>n_</em> <span class="op">+</span> <span class="dv">1</span>;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb21"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb21-1"><a href="#cb21-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>outer-iterator</em><span class="op">&amp;</span> x, default_sentinel_t y<span class="op">)</span></span>
<span id="cb21-2"><a href="#cb21-2"></a>  <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_16" id="pnum_16">9</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">-(</span>y <span class="op">-</span> x<span class="op">)</span>;</code></p>
</blockquote>
</div>
<h4 class="unnumbered" data-number id="class-chunk_viewouter-iteratorvalue_type-range.chunk.outer.value">24.7.?.4 Class <code class="sourceCode cpp">chunk_view<span class="op">::</span><em>outer-iterator</em><span class="op">::</span>value_type</code> [range.chunk.outer.value]<a href="#class-chunk_viewouter-iteratorvalue_type-range.chunk.outer.value" class="self-link"></a></h4>
<div class="sourceCode" id="cb22"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb22-1"><a href="#cb22-1"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb22-2"><a href="#cb22-2"></a>  <span class="kw">template</span><span class="op">&lt;</span>view V<span class="op">&gt;</span></span>
<span id="cb22-3"><a href="#cb22-3"></a>    <span class="kw">requires</span> input_range<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb22-4"><a href="#cb22-4"></a>  <span class="kw">struct</span> chunk_view<span class="op">&lt;</span>V<span class="op">&gt;::</span><em>outer-iterator</em><span class="op">::</span>value_type <span class="op">:</span> view_interface<span class="op">&lt;</span>value_type<span class="op">&gt;</span> <span class="op">{</span></span>
<span id="cb22-5"><a href="#cb22-5"></a>    chunk_view<span class="op">*</span> <em>parent_</em>;                                <span class="co">// exposition only</span></span>
<span id="cb22-6"><a href="#cb22-6"></a></span>
<span id="cb22-7"><a href="#cb22-7"></a>    <span class="kw">constexpr</span> <span class="kw">explicit</span> value_type<span class="op">(</span>chunk_view<span class="op">&amp;</span> parent<span class="op">)</span>;    <span class="co">// exposition only</span></span>
<span id="cb22-8"><a href="#cb22-8"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb22-9"><a href="#cb22-9"></a>    <span class="kw">constexpr</span> <em>inner-iterator</em> begin<span class="op">()</span> <span class="kw">const</span>;</span>
<span id="cb22-10"><a href="#cb22-10"></a>    <span class="kw">constexpr</span> default_sentinel_t end<span class="op">()</span> <span class="kw">const</span>;</span>
<span id="cb22-11"><a href="#cb22-11"></a></span>
<span id="cb22-12"><a href="#cb22-12"></a>    <span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">const</span></span>
<span id="cb22-13"><a href="#cb22-13"></a>      <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span>
<span id="cb22-14"><a href="#cb22-14"></a>  <span class="op">}</span>;</span>
<span id="cb22-15"><a href="#cb22-15"></a><span class="op">}</span></span></code></pre></div>
<div>
<div class="sourceCode" id="cb23"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb23-1"><a href="#cb23-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> value_type<span class="op">(</span>chunk_view<span class="op">&amp;</span> parent<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_17" id="pnum_17">1</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>parent_</em></code> with <code class="sourceCode cpp">addressof<span class="op">(</span>parent<span class="op">)</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb24"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb24-1"><a href="#cb24-1"></a><span class="kw">constexpr</span> <em>inner-iterator</em> begin<span class="op">()</span> <span class="kw">const</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_18" id="pnum_18">2</a></span> <em>Returns</em>: <code class="sourceCode cpp"><em>inner-iterator</em><span class="op">(*</span><em>parent_</em><span class="op">)</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb25"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb25-1"><a href="#cb25-1"></a><span class="kw">constexpr</span> default_sentinel_t end<span class="op">()</span> <span class="kw">const</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_19" id="pnum_19">3</a></span> <em>Returns</em>: <code class="sourceCode cpp">default_sentinel</code>.</p>
</blockquote>
<div class="sourceCode" id="cb26"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb26-1"><a href="#cb26-1"></a><span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">const</span></span>
<span id="cb26-2"><a href="#cb26-2"></a>  <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_20" id="pnum_20">4</a></span> <em>Returns</em>: <code class="sourceCode cpp">ranges<span class="op">::</span>min<span class="op">(</span><em>parent_</em><span class="op">-&gt;</span><em>remainder_</em>, ranges<span class="op">::</span>end<span class="op">(</span><em>parent_</em><span class="op">-&gt;</span><em>base_</em><span class="op">)</span> <span class="op">-</span> <span class="op">*</span><em>parent_</em><span class="op">-&gt;</span><em>current_</em><span class="op">)</span></code>.</p>
</blockquote>
</div>
<h4 class="unnumbered" data-number id="class-chunk_viewinner-iterator-range.chunk.inner.iter">24.7.?.5 Class <code class="sourceCode cpp">chunk_view<span class="op">::</span><em>inner-iterator</em></code> [range.chunk.inner.iter]<a href="#class-chunk_viewinner-iterator-range.chunk.inner.iter" class="self-link"></a></h4>
<div class="sourceCode" id="cb27"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb27-1"><a href="#cb27-1"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb27-2"><a href="#cb27-2"></a>  <span class="kw">template</span><span class="op">&lt;</span>view V<span class="op">&gt;</span></span>
<span id="cb27-3"><a href="#cb27-3"></a>    <span class="kw">requires</span> input_range<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb27-4"><a href="#cb27-4"></a>  <span class="kw">class</span> chunk_view<span class="op">&lt;</span>V<span class="op">&gt;::</span><em>inner-iterator</em> <span class="op">{</span></span>
<span id="cb27-5"><a href="#cb27-5"></a>    chunk_view<span class="op">*</span> <em>parent_</em>;                                <span class="co">// exposition only</span></span>
<span id="cb27-6"><a href="#cb27-6"></a></span>
<span id="cb27-7"><a href="#cb27-7"></a>    <span class="kw">constexpr</span> <span class="kw">explicit</span> <em>inner-iterator</em><span class="op">(</span>chunk_view<span class="op">&amp;</span> parent<span class="op">)</span>;    <span class="co">// exposition only</span></span>
<span id="cb27-8"><a href="#cb27-8"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb27-9"><a href="#cb27-9"></a>    <span class="kw">using</span> iterator_concept  <span class="op">=</span> input_iterator_tag;</span>
<span id="cb27-10"><a href="#cb27-10"></a>    <span class="kw">using</span> difference_type <span class="op">=</span> range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb27-11"><a href="#cb27-11"></a>    <span class="kw">using</span> value_type <span class="op">=</span> range_value_t<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb27-12"><a href="#cb27-12"></a></span>
<span id="cb27-13"><a href="#cb27-13"></a>    <em>inner-iterator</em><span class="op">(</span><em>inner-iterator</em><span class="op">&amp;&amp;)</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb27-14"><a href="#cb27-14"></a>    <em>inner-iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">=(</span><em>inner-iterator</em><span class="op">&amp;&amp;)</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb27-15"><a href="#cb27-15"></a></span>
<span id="cb27-16"><a href="#cb27-16"></a>    <span class="kw">constexpr</span> <span class="kw">const</span> iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&amp;</span> base<span class="op">()</span> <span class="kw">const</span> <span class="op">&amp;</span>;</span>
<span id="cb27-17"><a href="#cb27-17"></a></span>
<span id="cb27-18"><a href="#cb27-18"></a>    <span class="kw">constexpr</span> range_reference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span>
<span id="cb27-19"><a href="#cb27-19"></a>    <span class="kw">constexpr</span> <em>inner-iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb27-20"><a href="#cb27-20"></a>    <span class="kw">constexpr</span> <span class="dt">void</span> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb27-21"><a href="#cb27-21"></a></span>
<span id="cb27-22"><a href="#cb27-22"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>inner-iterator</em><span class="op">&amp;</span> x, default_sentinel_t<span class="op">)</span>;</span>
<span id="cb27-23"><a href="#cb27-23"></a></span>
<span id="cb27-24"><a href="#cb27-24"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span>default_sentinel_t y, <span class="kw">const</span> <em>inner-iterator</em><span class="op">&amp;</span> x<span class="op">)</span></span>
<span id="cb27-25"><a href="#cb27-25"></a>      <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span>
<span id="cb27-26"><a href="#cb27-26"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>inner-iterator</em><span class="op">&amp;</span> x, default_sentinel_t y<span class="op">)</span></span>
<span id="cb27-27"><a href="#cb27-27"></a>      <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span>
<span id="cb27-28"><a href="#cb27-28"></a>  <span class="op">}</span>;</span>
<span id="cb27-29"><a href="#cb27-29"></a><span class="op">}</span></span></code></pre></div>
<div>
<div class="sourceCode" id="cb28"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb28-1"><a href="#cb28-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> <em>inner-iterator</em><span class="op">(</span>chunk_view<span class="op">&amp;</span> parent<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_21" id="pnum_21">1</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>parent_</em></code> with <code class="sourceCode cpp">addressof<span class="op">(</span>parent<span class="op">)</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb29"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb29-1"><a href="#cb29-1"></a><span class="kw">const</span> iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&amp;</span> base<span class="op">()</span> <span class="kw">const</span> <span class="op">&amp;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_22" id="pnum_22">2</a></span> <em>Returns</em>: <code class="sourceCode cpp"><span class="op">*</span><em>parent_</em><span class="op">-&gt;</span><em>current_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb30"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb30-1"><a href="#cb30-1"></a><span class="kw">constexpr</span> range_reference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_23" id="pnum_23">3</a></span> <em>Preconditions</em>: <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span> <span class="op">==</span> default_sentinel</code> is <code class="sourceCode cpp"><span class="kw">false</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_24" id="pnum_24">4</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">**</span><em>parent_</em><span class="op">-&gt;</span><em>current_</em>;</code></p>
</blockquote>
<div class="sourceCode" id="cb31"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb31-1"><a href="#cb31-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_25" id="pnum_25">5</a></span> <em>Preconditions</em>: <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span> <span class="op">==</span> default_sentinel</code> is <code class="sourceCode cpp"><span class="kw">false</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_26" id="pnum_26">6</a></span> <em>Effects:</em> Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb32"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb32-1"><a href="#cb32-1"></a>  <span class="op">++*</span><em>parent_</em><span class="op">-&gt;</span><em>current_</em>;</span>
<span id="cb32-2"><a href="#cb32-2"></a>  <span class="cf">if</span> <span class="op">(*</span><em>parent_</em><span class="op">-&gt;</span><em>current_</em> <span class="op">==</span> ranges<span class="op">::</span>end<span class="op">(</span><em>parent_</em><span class="op">-&gt;</span><em>base_</em><span class="op">))</span> <span class="op">{</span></span>
<span id="cb32-3"><a href="#cb32-3"></a>    <em>parent_</em><span class="op">-&gt;</span><em>remainder_</em> <span class="op">=</span> <span class="dv">0</span>;</span>
<span id="cb32-4"><a href="#cb32-4"></a>  <span class="op">}</span></span>
<span id="cb32-5"><a href="#cb32-5"></a>  <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb32-6"><a href="#cb32-6"></a>    <span class="op">--</span><em>parent_</em><span class="op">-&gt;</span><em>remainder_</em>;</span>
<span id="cb32-7"><a href="#cb32-7"></a>  <span class="op">}</span></span>
<span id="cb32-8"><a href="#cb32-8"></a>  <span class="cf">return</span> <span class="op">*</span><span class="kw">this</span>;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb33"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb33-1"><a href="#cb33-1"></a><span class="kw">constexpr</span> <span class="dt">void</span> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_27" id="pnum_27">7</a></span> <em>Effects</em>: Equivalent to <code class="sourceCode cpp"><span class="op">++*</span><span class="kw">this</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb34"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb34-1"><a href="#cb34-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>inner-iterator</em><span class="op">&amp;</span> x, default_sentinel_t<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_28" id="pnum_28">8</a></span> <em>Returns:</em> <code class="sourceCode cpp">x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>remainder_</em> <span class="op">==</span> <span class="dv">0</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb35"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb35-1"><a href="#cb35-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span>default_sentinel_t y, <span class="kw">const</span> <em>inner-iterator</em><span class="op">&amp;</span> x<span class="op">)</span></span>
<span id="cb35-2"><a href="#cb35-2"></a>  <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_29" id="pnum_29">9</a></span> <em>Returns:</em> <code class="sourceCode cpp">ranges<span class="op">::</span>min<span class="op">(</span>x<span class="op">.</span>parent_<span class="op">-&gt;</span>remainder_, ranges<span class="op">::</span>end<span class="op">(</span>x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>base_</em><span class="op">)</span> <span class="op">-</span> <span class="op">*</span>x<span class="op">.</span><em>parent_</em><span class="op">-&gt;</span><em>current_</em><span class="op">)</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb36"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb36-1"><a href="#cb36-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>inner-iterator</em><span class="op">&amp;</span> x, default_sentinel_t y<span class="op">)</span></span>
<span id="cb36-2"><a href="#cb36-2"></a>  <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_30" id="pnum_30">10</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">-(</span>y <span class="op">-</span> x<span class="op">)</span>;</code></p>
</blockquote>
</div>
<h4 class="unnumbered" data-number id="chunk_view-for-forward-ranges-range.chunk.view.fwd">24.7.?.6 <code class="sourceCode cpp">chunk_view</code> for forward ranges [range.chunk.view.fwd]<a href="#chunk_view-for-forward-ranges-range.chunk.view.fwd" class="self-link"></a></h4>
<div class="sourceCode" id="cb37"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb37-1"><a href="#cb37-1"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb37-2"><a href="#cb37-2"></a></span>
<span id="cb37-3"><a href="#cb37-3"></a><span class="kw">template</span><span class="op">&lt;</span>view V<span class="op">&gt;</span></span>
<span id="cb37-4"><a href="#cb37-4"></a>  <span class="kw">requires</span> forward_range<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb37-5"><a href="#cb37-5"></a><span class="kw">class</span> chunk_view<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">:</span> <span class="kw">public</span> view_interface<span class="op">&lt;</span>chunk_view<span class="op">&lt;</span>V<span class="op">&gt;&gt;{</span></span>
<span id="cb37-6"><a href="#cb37-6"></a>  V <em>base_</em> <span class="op">=</span> V<span class="op">()</span>;                     <span class="co">// exposition only</span></span>
<span id="cb37-7"><a href="#cb37-7"></a>  range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> <em>n_</em> <span class="op">=</span> <span class="dv">0</span>;      <span class="co">// exposition only</span></span>
<span id="cb37-8"><a href="#cb37-8"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="dt">bool</span><span class="op">&gt;</span> <span class="kw">class</span> <em>iterator</em>;     <span class="co">// exposition only</span></span>
<span id="cb37-9"><a href="#cb37-9"></a></span>
<span id="cb37-10"><a href="#cb37-10"></a><span class="kw">public</span><span class="op">:</span></span>
<span id="cb37-11"><a href="#cb37-11"></a>  chunk_view<span class="op">()</span> <span class="kw">requires</span> default_initializable<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb37-12"><a href="#cb37-12"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> chunk_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> n<span class="op">)</span>;</span>
<span id="cb37-13"><a href="#cb37-13"></a></span>
<span id="cb37-14"><a href="#cb37-14"></a>  <span class="kw">constexpr</span> V base<span class="op">()</span> <span class="kw">const</span> <span class="op">&amp;</span> <span class="kw">requires</span> copy_constructible<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">{</span> <span class="cf">return</span> <em>base_</em>; <span class="op">}</span></span>
<span id="cb37-15"><a href="#cb37-15"></a>  <span class="kw">constexpr</span> V base<span class="op">()</span> <span class="op">&amp;&amp;</span> <span class="op">{</span> <span class="cf">return</span> std<span class="op">::</span>move<span class="op">(</span><em>base_</em><span class="op">)</span>; <span class="op">}</span></span>
<span id="cb37-16"><a href="#cb37-16"></a></span>
<span id="cb37-17"><a href="#cb37-17"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> begin<span class="op">()</span> <span class="kw">requires</span> <span class="op">(!</span><em>simple-view</em><span class="op">&lt;</span>V<span class="op">&gt;)</span> <span class="op">{</span></span>
<span id="cb37-18"><a href="#cb37-18"></a>    <span class="cf">return</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;(</span><span class="kw">this</span>, ranges<span class="op">::</span>begin<span class="op">(</span><em>base_</em><span class="op">))</span>;</span>
<span id="cb37-19"><a href="#cb37-19"></a>  <span class="op">}</span></span>
<span id="cb37-20"><a href="#cb37-20"></a></span>
<span id="cb37-21"><a href="#cb37-21"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> begin<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> forward_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span> <span class="op">{</span></span>
<span id="cb37-22"><a href="#cb37-22"></a>    <span class="cf">return</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">true</span><span class="op">&gt;(</span><span class="kw">this</span>, ranges<span class="op">::</span>begin<span class="op">(</span><em>base_</em><span class="op">))</span>;</span>
<span id="cb37-23"><a href="#cb37-23"></a>  <span class="op">}</span></span>
<span id="cb37-24"><a href="#cb37-24"></a></span>
<span id="cb37-25"><a href="#cb37-25"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> end<span class="op">()</span> <span class="kw">requires</span> <span class="op">(!</span><em>simple-view</em><span class="op">&lt;</span>V<span class="op">&gt;)</span> <span class="op">{</span></span>
<span id="cb37-26"><a href="#cb37-26"></a>    <span class="cf">if</span> <span class="kw">constexpr</span> <span class="op">(</span>common_range<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> sized_range<span class="op">&lt;</span>V<span class="op">&gt;)</span> <span class="op">{</span></span>
<span id="cb37-27"><a href="#cb37-27"></a>      <span class="kw">auto</span> offset <span class="op">=</span> <span class="op">(</span><em>n_</em> <span class="op">-</span> ranges<span class="op">::</span>distance<span class="op">(</span><em>base_</em><span class="op">)</span> <span class="op">%</span> <em>n_</em><span class="op">)</span> <span class="op">%</span> <em>n_</em>;</span>
<span id="cb37-28"><a href="#cb37-28"></a>      <span class="cf">return</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;(</span><span class="kw">this</span>, ranges<span class="op">::</span>end<span class="op">(</span><em>base_</em><span class="op">)</span>, offset<span class="op">)</span>;</span>
<span id="cb37-29"><a href="#cb37-29"></a>    <span class="op">}</span></span>
<span id="cb37-30"><a href="#cb37-30"></a>    <span class="cf">else</span> <span class="cf">if</span> <span class="kw">constexpr</span> <span class="op">(</span>common_range<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> <span class="op">!</span>bidirectional_range<span class="op">&lt;</span>V<span class="op">&gt;)</span> <span class="op">{</span></span>
<span id="cb37-31"><a href="#cb37-31"></a>      <span class="cf">return</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;(</span><span class="kw">this</span>, ranges<span class="op">::</span>end<span class="op">(</span><em>base_</em><span class="op">))</span>;</span>
<span id="cb37-32"><a href="#cb37-32"></a>    <span class="op">}</span></span>
<span id="cb37-33"><a href="#cb37-33"></a>    <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb37-34"><a href="#cb37-34"></a>      <span class="cf">return</span> default_sentinel;</span>
<span id="cb37-35"><a href="#cb37-35"></a>    <span class="op">}</span></span>
<span id="cb37-36"><a href="#cb37-36"></a>  <span class="op">}</span></span>
<span id="cb37-37"><a href="#cb37-37"></a></span>
<span id="cb37-38"><a href="#cb37-38"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> end<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> forward_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span> <span class="op">{</span></span>
<span id="cb37-39"><a href="#cb37-39"></a>    <span class="cf">if</span> <span class="kw">constexpr</span> <span class="op">(</span>common_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> sized_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;)</span> <span class="op">{</span></span>
<span id="cb37-40"><a href="#cb37-40"></a>      <span class="kw">auto</span> offset <span class="op">=</span> <span class="op">(</span><em>n_</em> <span class="op">-</span> ranges<span class="op">::</span>distance<span class="op">(</span><em>base_</em><span class="op">)</span> <span class="op">%</span> <em>n_</em><span class="op">)</span> <span class="op">%</span> <em>n_</em>;</span>
<span id="cb37-41"><a href="#cb37-41"></a>      <span class="cf">return</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">true</span><span class="op">&gt;(</span><span class="kw">this</span>, ranges<span class="op">::</span>end<span class="op">(</span><em>base_</em><span class="op">)</span>, offset<span class="op">)</span>;</span>
<span id="cb37-42"><a href="#cb37-42"></a>    <span class="op">}</span></span>
<span id="cb37-43"><a href="#cb37-43"></a>    <span class="cf">else</span> <span class="cf">if</span> <span class="kw">constexpr</span> <span class="op">(</span>common_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> <span class="op">!</span>bidirectional_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;)</span> <span class="op">{</span></span>
<span id="cb37-44"><a href="#cb37-44"></a>      <span class="cf">return</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">true</span><span class="op">&gt;(</span><span class="kw">this</span>, ranges<span class="op">::</span>end<span class="op">(</span><em>base_</em><span class="op">))</span>;</span>
<span id="cb37-45"><a href="#cb37-45"></a>    <span class="op">}</span></span>
<span id="cb37-46"><a href="#cb37-46"></a>    <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb37-47"><a href="#cb37-47"></a>      <span class="cf">return</span> default_sentinel;</span>
<span id="cb37-48"><a href="#cb37-48"></a>    <span class="op">}</span></span>
<span id="cb37-49"><a href="#cb37-49"></a>  <span class="op">}</span></span>
<span id="cb37-50"><a href="#cb37-50"></a></span>
<span id="cb37-51"><a href="#cb37-51"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb37-52"><a href="#cb37-52"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span>;</span>
<span id="cb37-53"><a href="#cb37-53"></a><span class="op">}</span>;</span>
<span id="cb37-54"><a href="#cb37-54"></a></span>
<span id="cb37-55"><a href="#cb37-55"></a><span class="op">}</span></span></code></pre></div>
<div>
<div class="sourceCode" id="cb38"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb38-1"><a href="#cb38-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> chunk_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> n<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_31" id="pnum_31">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>.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_32" id="pnum_32">2</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>base_</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>base<span class="op">)</span></code> and <code class="sourceCode cpp"><em>n_</em></code> with <code class="sourceCode cpp">n</code>.</p>
</blockquote>
<div class="sourceCode" id="cb39"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb39-1"><a href="#cb39-1"></a><span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb39-2"><a href="#cb39-2"></a><span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_33" id="pnum_33">3</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb40"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb40-1"><a href="#cb40-1"></a><span class="kw">auto</span> sz <span class="op">=</span> <span class="op">(</span>ranges<span class="op">::</span>distance<span class="op">(</span><em>base_</em><span class="op">)</span> <span class="op">+</span> <em>n_</em> <span class="op">-</span> <span class="dv">1</span><span class="op">)</span> <span class="op">/</span> <em>n_</em>;</span>
<span id="cb40-2"><a href="#cb40-2"></a><span class="cf">return</span> to<span class="op">-</span><span class="dt">unsigned</span><span class="op">-</span>like<span class="op">(</span>sz<span class="op">)</span>;</span></code></pre></div>
</blockquote>
</blockquote>
</div>
<h4 class="unnumbered" data-number id="class-template-chunk_viewviterator-for-forward-ranges-range.chunk.fwd.iter">24.7.?.7 Class template <code class="sourceCode cpp">chunk_view<span class="op">&lt;</span>V<span class="op">&gt;::</span><em>iterator</em></code> for forward ranges [range.chunk.fwd.iter]<a href="#class-template-chunk_viewviterator-for-forward-ranges-range.chunk.fwd.iter" class="self-link"></a></h4>
<div class="sourceCode" id="cb41"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb41-1"><a href="#cb41-1"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb41-2"><a href="#cb41-2"></a>  <span class="kw">template</span><span class="op">&lt;</span>view V<span class="op">&gt;</span></span>
<span id="cb41-3"><a href="#cb41-3"></a>    <span class="kw">requires</span> forward_range<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb41-4"><a href="#cb41-4"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="dt">bool</span> Const<span class="op">&gt;</span></span>
<span id="cb41-5"><a href="#cb41-5"></a>  <span class="kw">class</span> chunk_view<span class="op">&lt;</span>V<span class="op">&gt;::</span><em>iterator</em> <span class="op">{</span></span>
<span id="cb41-6"><a href="#cb41-6"></a>    <span class="kw">using</span> <em>Parent</em> <span class="op">=</span> <em>maybe-const</em><span class="op">&lt;</span>Const, chunk_view<span class="op">&gt;</span>;              <span class="co">// exposition only</span></span>
<span id="cb41-7"><a href="#cb41-7"></a>    <span class="kw">using</span> <em>Base</em> <span class="op">=</span> <em>maybe-const</em><span class="op">&lt;</span>Const, V<span class="op">&gt;</span>;                         <span class="co">// exposition only</span></span>
<span id="cb41-8"><a href="#cb41-8"></a></span>
<span id="cb41-9"><a href="#cb41-9"></a>    iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <em>current_</em> <span class="op">=</span> iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;()</span>;             <span class="co">// exposition only</span></span>
<span id="cb41-10"><a href="#cb41-10"></a>    sentinel_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <em>end_</em> <span class="op">=</span> sentinel_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;()</span>;                 <span class="co">// exposition only</span></span>
<span id="cb41-11"><a href="#cb41-11"></a>    range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <em>n_</em> <span class="op">=</span> <span class="dv">0</span>;                            <span class="co">// exposition only</span></span>
<span id="cb41-12"><a href="#cb41-12"></a>    range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <em>offset_</em> <span class="op">=</span> <span class="dv">0</span>;                       <span class="co">// exposition only</span></span>
<span id="cb41-13"><a href="#cb41-13"></a></span>
<span id="cb41-14"><a href="#cb41-14"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">(</span><em>Parent</em><span class="op">*</span> parent, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> current,  <span class="co">// exposition only</span></span>
<span id="cb41-15"><a href="#cb41-15"></a>                       range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> offset <span class="op">=</span> <span class="dv">0</span><span class="op">)</span>;</span>
<span id="cb41-16"><a href="#cb41-16"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb41-17"><a href="#cb41-17"></a>    <span class="kw">using</span> iterator_category <span class="op">=</span> input_iterator_tag;</span>
<span id="cb41-18"><a href="#cb41-18"></a>    <span class="kw">using</span> iterator_concept  <span class="op">=</span> <em>see below</em>;</span>
<span id="cb41-19"><a href="#cb41-19"></a>    <span class="kw">using</span> value_type <span class="op">=</span> <span class="kw">decltype</span><span class="op">(</span>views<span class="op">::</span>take<span class="op">(</span>subrange<span class="op">(</span><em>current_</em>, <em>end_</em><span class="op">)</span>, <em>n_</em><span class="op">))</span>;</span>
<span id="cb41-20"><a href="#cb41-20"></a>    <span class="kw">using</span> difference_type <span class="op">=</span> range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-21"><a href="#cb41-21"></a></span>
<span id="cb41-22"><a href="#cb41-22"></a>    <em>iterator</em><span class="op">()</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb41-23"><a href="#cb41-23"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">(</span><em>iterator</em><span class="op">&lt;!</span>Const<span class="op">&gt;</span> i<span class="op">)</span></span>
<span id="cb41-24"><a href="#cb41-24"></a>      <span class="kw">requires</span> Const <span class="op">&amp;&amp;</span> convertible_to<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span></span>
<span id="cb41-25"><a href="#cb41-25"></a>                     <span class="op">&amp;&amp;</span> convertible_to<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, sentinel_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span>
<span id="cb41-26"><a href="#cb41-26"></a></span>
<span id="cb41-27"><a href="#cb41-27"></a>    <span class="kw">constexpr</span> iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> base<span class="op">()</span> <span class="kw">const</span>;</span>
<span id="cb41-28"><a href="#cb41-28"></a></span>
<span id="cb41-29"><a href="#cb41-29"></a>    <span class="kw">constexpr</span> value_type <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span>
<span id="cb41-30"><a href="#cb41-30"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb41-31"><a href="#cb41-31"></a>    <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb41-32"><a href="#cb41-32"></a></span>
<span id="cb41-33"><a href="#cb41-33"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">--()</span> <span class="kw">requires</span> bidirectional_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-34"><a href="#cb41-34"></a>    <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">--(</span><span class="dt">int</span><span class="op">)</span> <span class="kw">requires</span> bidirectional_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-35"><a href="#cb41-35"></a></span>
<span id="cb41-36"><a href="#cb41-36"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">+=(</span>difference_type x<span class="op">)</span></span>
<span id="cb41-37"><a href="#cb41-37"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-38"><a href="#cb41-38"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">-=(</span>difference_type x<span class="op">)</span></span>
<span id="cb41-39"><a href="#cb41-39"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-40"><a href="#cb41-40"></a></span>
<span id="cb41-41"><a href="#cb41-41"></a>    <span class="kw">constexpr</span> value_type <span class="kw">operator</span><span class="op">[](</span>difference_type n<span class="op">)</span> <span class="kw">const</span></span>
<span id="cb41-42"><a href="#cb41-42"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-43"><a href="#cb41-43"></a></span>
<span id="cb41-44"><a href="#cb41-44"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span>;</span>
<span id="cb41-45"><a href="#cb41-45"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, default_sentinel_t<span class="op">)</span>;</span>
<span id="cb41-46"><a href="#cb41-46"></a></span>
<span id="cb41-47"><a href="#cb41-47"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb41-48"><a href="#cb41-48"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-49"><a href="#cb41-49"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb41-50"><a href="#cb41-50"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-51"><a href="#cb41-51"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;=(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb41-52"><a href="#cb41-52"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-53"><a href="#cb41-53"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;=(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb41-54"><a href="#cb41-54"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-55"><a href="#cb41-55"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">&lt;=&gt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb41-56"><a href="#cb41-56"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <span class="op">&amp;&amp;</span></span>
<span id="cb41-57"><a href="#cb41-57"></a>               three_way_comparable<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span>
<span id="cb41-58"><a href="#cb41-58"></a></span>
<span id="cb41-59"><a href="#cb41-59"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">+(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i, difference_type n<span class="op">)</span></span>
<span id="cb41-60"><a href="#cb41-60"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-61"><a href="#cb41-61"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">+(</span>difference_type n, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i<span class="op">)</span></span>
<span id="cb41-62"><a href="#cb41-62"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-63"><a href="#cb41-63"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i, difference_type n<span class="op">)</span></span>
<span id="cb41-64"><a href="#cb41-64"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb41-65"><a href="#cb41-65"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb41-66"><a href="#cb41-66"></a>      <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span>
<span id="cb41-67"><a href="#cb41-67"></a></span>
<span id="cb41-68"><a href="#cb41-68"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span>default_sentinel_t y, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x<span class="op">)</span></span>
<span id="cb41-69"><a href="#cb41-69"></a>      <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span>
<span id="cb41-70"><a href="#cb41-70"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, default_sentinel_t y<span class="op">)</span></span>
<span id="cb41-71"><a href="#cb41-71"></a>      <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span>
<span id="cb41-72"><a href="#cb41-72"></a>  <span class="op">}</span>;</span>
<span id="cb41-73"><a href="#cb41-73"></a><span class="op">}</span></span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_34" id="pnum_34">1</a></span> <code class="sourceCode cpp"><em>iterator</em><span class="op">::</span>iterator_concept</code> is defined as follows:</p>
<ul>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_35" id="pnum_35">(1.1)</a></span> If <code class="sourceCode cpp"><em>Base</em></code> models <code class="sourceCode cpp">random_access_range</code>, then <code class="sourceCode cpp">iterator_concept</code> denotes <code class="sourceCode cpp">random_access_iterator_tag</code>.</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_36" id="pnum_36">(1.2)</a></span> Otherwise, if <code class="sourceCode cpp"><em>Base</em></code> models <code class="sourceCode cpp">bidirectional_range</code>, then <code class="sourceCode cpp">iterator_concept</code> denotes <code class="sourceCode cpp">bidirectional_iterator_tag</code>.</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_37" id="pnum_37">(1.3)</a></span> Otherwise, <code class="sourceCode cpp">iterator_concept</code> denotes <code class="sourceCode cpp">forward_iterator_tag</code>.</li>
</ul>
<div>
<div class="sourceCode" id="cb42"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb42-1"><a href="#cb42-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">(</span><em>Parent</em><span class="op">*</span> parent, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> current,</span>
<span id="cb42-2"><a href="#cb42-2"></a>                     range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> offset <span class="op">=</span> <span class="dv">0</span><span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_38" id="pnum_38">2</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>current_</em></code> with <code class="sourceCode cpp">current</code>, <code class="sourceCode cpp"><em>end_</em></code> with <code class="sourceCode cpp">ranges<span class="op">::</span>end<span class="op">(</span>parent<span class="op">-&gt;</span><em>base_</em><span class="op">)</span></code>, <code class="sourceCode cpp"><em>n_</em></code> with <code class="sourceCode cpp">parent<span class="op">-&gt;</span><em>n_</em></code>, and <code class="sourceCode cpp"><em>offset_</em></code> with <code class="sourceCode cpp">offset</code>.</p>
</blockquote>
<div class="sourceCode" id="cb43"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb43-1"><a href="#cb43-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">(</span><em>iterator</em><span class="op">&lt;!</span>Const<span class="op">&gt;</span> i<span class="op">)</span></span>
<span id="cb43-2"><a href="#cb43-2"></a>  <span class="kw">requires</span> Const <span class="op">&amp;&amp;</span> convertible_to<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span></span>
<span id="cb43-3"><a href="#cb43-3"></a>                 <span class="op">&amp;&amp;</span> convertible_to<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, sentinel_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_39" id="pnum_39">3</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>current_</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>i<span class="op">.</span><em>current_</em><span class="op">)</span></code>, <code class="sourceCode cpp"><em>end_</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>i<span class="op">.</span><em>end_</em><span class="op">)</span></code>, <code class="sourceCode cpp"><em>n_</em></code> with <code class="sourceCode cpp">i<span class="op">.</span><em>n_</em></code>, and <code class="sourceCode cpp"><em>offset_</em></code> with <code class="sourceCode cpp">i<span class="op">.</span><em>offset_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb44"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb44-1"><a href="#cb44-1"></a><span class="kw">constexpr</span> iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> base<span class="op">()</span> <span class="kw">const</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_40" id="pnum_40">4</a></span> <em>Returns</em>: <code class="sourceCode cpp"><em>current_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb45"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb45-1"><a href="#cb45-1"></a><span class="kw">constexpr</span> value_type <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_41" id="pnum_41">5</a></span> <em>Preconditions:</em> <code class="sourceCode cpp"><em>current_</em> <span class="op">!=</span> <em>end_</em></code> is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_42" id="pnum_42">6</a></span> <em>Returns</em>: <code class="sourceCode cpp">views<span class="op">::</span>take<span class="op">(</span>subrange<span class="op">(</span><em>current_</em>, <em>end_</em><span class="op">)</span>, <em>n_</em><span class="op">)</span></code></p>
</blockquote>
<div class="sourceCode" id="cb46"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb46-1"><a href="#cb46-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_43" id="pnum_43">7</a></span> <em>Preconditions:</em> <code class="sourceCode cpp"><em>current_</em> <span class="op">!=</span> <em>end_</em></code> is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_44" id="pnum_44">8</a></span> <em>Effects:</em> Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb47"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb47-1"><a href="#cb47-1"></a>   <em>offset_</em> <span class="op">=</span> ranges<span class="op">::</span>advance<span class="op">(</span><em>current_</em>, <em>n_</em>, <em>end_</em><span class="op">)</span>;</span>
<span id="cb47-2"><a href="#cb47-2"></a>   <span class="cf">return</span> <span class="op">*</span><span class="kw">this</span>;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb48"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb48-1"><a href="#cb48-1"></a><span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_45" id="pnum_45">9</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb49"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb49-1"><a href="#cb49-1"></a>  <span class="kw">auto</span> tmp <span class="op">=</span> <span class="op">*</span><span class="kw">this</span>;</span>
<span id="cb49-2"><a href="#cb49-2"></a>  <span class="op">++*</span><span class="kw">this</span>;</span>
<span id="cb49-3"><a href="#cb49-3"></a>  <span class="cf">return</span> tmp;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb50"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb50-1"><a href="#cb50-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">--()</span> <span class="kw">requires</span> bidirectional_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_46" id="pnum_46">10</a></span> <em>Effects:</em> Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb51"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb51-1"><a href="#cb51-1"></a>   ranges<span class="op">::</span>advance<span class="op">(</span><em>current_</em>, <em>offset_</em> <span class="op">-</span> <em>n_</em><span class="op">)</span>;</span>
<span id="cb51-2"><a href="#cb51-2"></a>   <em>offset_</em> <span class="op">=</span> <span class="dv">0</span>;</span>
<span id="cb51-3"><a href="#cb51-3"></a>   <span class="cf">return</span> <span class="op">*</span><span class="kw">this</span>;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb52"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb52-1"><a href="#cb52-1"></a><span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">--(</span><span class="dt">int</span><span class="op">)</span> <span class="kw">requires</span> bidirectional_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_47" id="pnum_47">11</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb53"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb53-1"><a href="#cb53-1"></a>  <span class="kw">auto</span> tmp <span class="op">=</span> <span class="op">*</span><span class="kw">this</span>;</span>
<span id="cb53-2"><a href="#cb53-2"></a>  <span class="op">--*</span><span class="kw">this</span>;</span>
<span id="cb53-3"><a href="#cb53-3"></a>  <span class="cf">return</span> tmp;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb54"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb54-1"><a href="#cb54-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">+=(</span>difference_type x<span class="op">)</span></span>
<span id="cb54-2"><a href="#cb54-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_48" id="pnum_48">12</a></span> <em>Preconditions</em>: If <code class="sourceCode cpp">x</code> is positive, <code class="sourceCode cpp">ranges<span class="op">::</span>distance<span class="op">(</span><em>current_</em>, <em>end_</em><span class="op">)</span> <span class="op">&gt;</span> <em>n_</em> <span class="op">*</span> <span class="op">(</span>x <span class="op">-</span> <span class="dv">1</span><span class="op">)</span></code> is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_49" id="pnum_49">13</a></span> <em>Effects:</em> Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb55"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb55-1"><a href="#cb55-1"></a><span class="cf">if</span> <span class="op">(</span>x <span class="op">&gt;</span> <span class="dv">0</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb55-2"><a href="#cb55-2"></a>  offset_ <span class="op">=</span> ranges<span class="op">::</span>advance<span class="op">(</span><em>current_</em>, <em>n_</em> <span class="op">*</span> x, <em>end_</em><span class="op">)</span>;</span>
<span id="cb55-3"><a href="#cb55-3"></a><span class="op">}</span></span>
<span id="cb55-4"><a href="#cb55-4"></a><span class="cf">else</span> <span class="cf">if</span> <span class="op">(</span>x <span class="op">&lt;</span> <span class="dv">0</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb55-5"><a href="#cb55-5"></a>  ranges<span class="op">::</span>advance<span class="op">(</span><em>current_</em>, <em>n_</em> <span class="op">*</span> x <span class="op">+</span> <em>offset_</em><span class="op">)</span>;</span>
<span id="cb55-6"><a href="#cb55-6"></a>  offset_ <span class="op">=</span> <span class="dv">0</span>;</span>
<span id="cb55-7"><a href="#cb55-7"></a><span class="op">}</span></span>
<span id="cb55-8"><a href="#cb55-8"></a><span class="cf">return</span> <span class="op">*</span><span class="kw">this</span>;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb56"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb56-1"><a href="#cb56-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">-=(</span>difference_type x<span class="op">)</span></span>
<span id="cb56-2"><a href="#cb56-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_50" id="pnum_50">14</a></span> <em>Effects:</em> Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">*</span><span class="kw">this</span> <span class="op">+=</span> <span class="op">-</span>x;</code></p>
</blockquote>
<div class="sourceCode" id="cb57"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb57-1"><a href="#cb57-1"></a><span class="kw">constexpr</span> value_type <span class="kw">operator</span><span class="op">[](</span>difference_type n<span class="op">)</span> <span class="kw">const</span></span>
<span id="cb57-2"><a href="#cb57-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_51" id="pnum_51">15</a></span> <em>Returns</em>: <code class="sourceCode cpp"><span class="op">*(*</span><span class="kw">this</span> <span class="op">+</span> n<span class="op">)</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb58"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb58-1"><a href="#cb58-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_52" id="pnum_52">16</a></span> <em>Returns:</em> <code class="sourceCode cpp">x<span class="op">.</span><em>current_</em> <span class="op">==</span> y<span class="op">.</span><em>current_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb59"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb59-1"><a href="#cb59-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, default_sentinel_t<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_53" id="pnum_53">17</a></span> <em>Returns:</em> <code class="sourceCode cpp">x<span class="op">.</span><em>current_</em> <span class="op">==</span> x<span class="op">.</span><em>end_</em>;</code></p>
</blockquote>
<div class="sourceCode" id="cb60"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb60-1"><a href="#cb60-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb60-2"><a href="#cb60-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_54" id="pnum_54">18</a></span> <em>Returns</em>: <code class="sourceCode cpp">x<span class="op">.</span><em>current_</em> <span class="op">&lt;</span> y<span class="op">.</span><em>current_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb61"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb61-1"><a href="#cb61-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb61-2"><a href="#cb61-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_55" id="pnum_55">19</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> y <span class="op">&lt;</span> x;</code></p>
</blockquote>
<div class="sourceCode" id="cb62"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb62-1"><a href="#cb62-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;=(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb62-2"><a href="#cb62-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_56" id="pnum_56">20</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">!(</span>y <span class="op">&lt;</span> x<span class="op">)</span>;</code></p>
</blockquote>
<div class="sourceCode" id="cb63"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb63-1"><a href="#cb63-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;=(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb63-2"><a href="#cb63-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_57" id="pnum_57">21</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">!(</span>x <span class="op">&lt;</span> y<span class="op">)</span>;</code></p>
</blockquote>
<div class="sourceCode" id="cb64"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb64-1"><a href="#cb64-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">&lt;=&gt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb64-2"><a href="#cb64-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <span class="op">&amp;&amp;</span></span>
<span id="cb64-3"><a href="#cb64-3"></a>           three_way_comparable<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_58" id="pnum_58">22</a></span> <em>Returns</em>: <code class="sourceCode cpp">x<span class="op">.</span><em>current_</em> <span class="op">&lt;=&gt;</span> y<span class="op">.</span><em>current_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb65"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb65-1"><a href="#cb65-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">+(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i, difference_type n<span class="op">)</span></span>
<span id="cb65-2"><a href="#cb65-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb65-3"><a href="#cb65-3"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">+(</span>difference_type n, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i<span class="op">)</span></span>
<span id="cb65-4"><a href="#cb65-4"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_59" id="pnum_59">23</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb66"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb66-1"><a href="#cb66-1"></a>  <span class="kw">auto</span> r <span class="op">=</span> i;</span>
<span id="cb66-2"><a href="#cb66-2"></a>  r <span class="op">+=</span> n;</span>
<span id="cb66-3"><a href="#cb66-3"></a>  <span class="cf">return</span> r;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb67"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb67-1"><a href="#cb67-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i, difference_type n<span class="op">)</span></span>
<span id="cb67-2"><a href="#cb67-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_60" id="pnum_60">24</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb68"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb68-1"><a href="#cb68-1"></a>  <span class="kw">auto</span> r <span class="op">=</span> i;</span>
<span id="cb68-2"><a href="#cb68-2"></a>  r <span class="op">-=</span> n;</span>
<span id="cb68-3"><a href="#cb68-3"></a>  <span class="cf">return</span> r;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb69"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb69-1"><a href="#cb69-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb69-2"><a href="#cb69-2"></a>  <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_61" id="pnum_61">25</a></span> <em>Returns:</em> <code class="sourceCode cpp"><span class="op">(</span>x<span class="op">.</span><em>current_</em> <span class="op">-</span> y<span class="op">.</span><em>current_</em> <span class="op">+</span> x<span class="op">.</span><em>offset_</em> <span class="op">-</span> y<span class="op">.</span><em>offset_</em><span class="op">)</span> <span class="op">/</span> x<span class="op">.</span><em>n_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb70"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb70-1"><a href="#cb70-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span>default_sentinel_t y, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x<span class="op">)</span></span>
<span id="cb70-2"><a href="#cb70-2"></a>  <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_62" id="pnum_62">26</a></span> <em>Returns</em>: <code class="sourceCode cpp"><span class="op">(</span>x<span class="op">.</span><em>end_</em> <span class="op">-</span> x<span class="op">.</span><em>current_</em> <span class="op">+</span> x<span class="op">.</span><em>n_</em> <span class="op">-</span> <span class="dv">1</span><span class="op">)</span>  <span class="op">/</span> x<span class="op">.</span><em>n_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb71"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb71-1"><a href="#cb71-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, default_sentinel_t y<span class="op">)</span></span>
<span id="cb71-2"><a href="#cb71-2"></a>  <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_63" id="pnum_63">27</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">-(</span>y <span class="op">-</span> x<span class="op">)</span>;</code></p>
</blockquote>
</div>
<h2 data-number="4.3" id="slide-1"><span class="header-section-number">4.3</span> <code class="sourceCode cpp">slide</code><a href="#slide-1" class="self-link"></a></h2>
<p>Add the following subclause to <span>24.7 <a href="https://wg21.link/range.adaptors">[range.adaptors]</a></span>.</p>
<h3 class="unnumbered" data-number id="slide-view-range.slide">24.7.? Slide view [range.slide]<a href="#slide-view-range.slide" class="self-link"></a></h3>
<h4 class="unnumbered" data-number id="overview-range.slide.overview">24.7.?.1 Overview [range.slide.overview]<a href="#overview-range.slide.overview" class="self-link"></a></h4>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_64" id="pnum_64">1</a></span> <code class="sourceCode cpp">slide_view</code> takes a <code class="sourceCode cpp">view</code> and a number <em>N</em> and produces a <code class="sourceCode cpp">view</code> whose <em>M</em> <sup>th</sup> element is a view over the M <sup>th</sup> through (<em>M</em> + <em>N</em> - 1)<sup>th</sup> elements of the original view. If the original view has fewer than <em>N</em> elements, the resulting view is empty.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_65" id="pnum_65">2</a></span> The name <code class="sourceCode cpp">views<span class="op">::</span>slide</code> denotes a range adaptor object (<span>24.7.2 <a href="https://wg21.link/range.adaptor.object">[range.adaptor.object]</a></span>). Given subexpressions <code class="sourceCode cpp">E</code> and <code class="sourceCode cpp">N</code>, the expression <code class="sourceCode cpp">views<span class="op">::</span>slide<span class="op">(</span>E, N<span class="op">)</span></code> is expression-equivalent to <code class="sourceCode cpp">slide_view<span class="op">(</span>E, N<span class="op">)</span></code>.</p>
<div class="example">
<span>[ <em>Example 1:</em> </span>
<div class="sourceCode" id="cb72"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb72-1"><a href="#cb72-1"></a>vector v <span class="op">=</span> <span class="op">{</span><span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">4</span><span class="op">}</span>;</span>
<span id="cb72-2"><a href="#cb72-2"></a></span>
<span id="cb72-3"><a href="#cb72-3"></a><span class="cf">for</span> <span class="op">(</span><span class="kw">auto</span> i <span class="op">:</span> v <span class="op">|</span> views<span class="op">::</span>slide<span class="op">(</span><span class="dv">2</span><span class="op">))</span> <span class="op">{</span></span>
<span id="cb72-4"><a href="#cb72-4"></a>  cout <span class="op">&lt;&lt;</span> <span class="ch">&#39;[&#39;</span> <span class="op">&lt;&lt;</span> i<span class="op">[</span><span class="dv">0</span><span class="op">]</span> <span class="op">&lt;&lt;</span> <span class="ch">&#39;,</span><span class="er"> </span><span class="ch">&#39;</span> <span class="op">&lt;&lt;</span> i<span class="op">[</span><span class="dv">1</span><span class="op">]</span> <span class="op">&lt;&lt;</span> <span class="st">&quot;] &quot;</span>; <span class="co">// prints: [1, 2] [2, 3] [3, 4]</span></span>
<span id="cb72-5"><a href="#cb72-5"></a><span class="op">}</span></span></code></pre></div>
<span> — <em>end example</em> ]</span>
</div>
<h4 class="unnumbered" data-number id="class-template-slide_view-range.slide.view">24.7.?.2 Class template <code class="sourceCode cpp">slide_view</code> [range.slide.view]<a href="#class-template-slide_view-range.slide.view" class="self-link"></a></h4>
<div class="sourceCode" id="cb73"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb73-1"><a href="#cb73-1"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb73-2"><a href="#cb73-2"></a></span>
<span id="cb73-3"><a href="#cb73-3"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> V<span class="op">&gt;</span></span>
<span id="cb73-4"><a href="#cb73-4"></a>  <span class="kw">concept</span> <em>slide-caches-nothing</em> <span class="op">=</span> random_access_range<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> sized_range<span class="op">&lt;</span>V<span class="op">&gt;</span>; <span class="co">// exposition only</span></span>
<span id="cb73-5"><a href="#cb73-5"></a></span>
<span id="cb73-6"><a href="#cb73-6"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> V<span class="op">&gt;</span></span>
<span id="cb73-7"><a href="#cb73-7"></a>  <span class="kw">concept</span> <em>slide-caches-last</em> <span class="op">=</span> <span class="op">!</span><em>slide-caches-nothing</em><span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> bidirectional_range<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> common_range<span class="op">&lt;</span>V<span class="op">&gt;</span>; <span class="co">// exposition only</span></span>
<span id="cb73-8"><a href="#cb73-8"></a></span>
<span id="cb73-9"><a href="#cb73-9"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> V<span class="op">&gt;</span></span>
<span id="cb73-10"><a href="#cb73-10"></a>  <span class="kw">concept</span> <em>slide-caches-first</em> <span class="op">=</span> <span class="op">!</span><em>slide-caches-nothing</em><span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> <span class="op">!</span><em>slide-caches-last</em><span class="op">&lt;</span>V<span class="op">&gt;</span>; <span class="co">// exposition only</span></span>
<span id="cb73-11"><a href="#cb73-11"></a></span>
<span id="cb73-12"><a href="#cb73-12"></a><span class="kw">template</span><span class="op">&lt;</span>forward_range V<span class="op">&gt;</span></span>
<span id="cb73-13"><a href="#cb73-13"></a>  <span class="kw">requires</span> view<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb73-14"><a href="#cb73-14"></a><span class="kw">class</span> slide_view <span class="op">:</span> <span class="kw">public</span> view_interface<span class="op">&lt;</span>slide_view<span class="op">&lt;</span>V<span class="op">&gt;&gt;{</span></span>
<span id="cb73-15"><a href="#cb73-15"></a>  V <em>base_</em> <span class="op">=</span> V<span class="op">()</span>;                     <span class="co">// exposition only</span></span>
<span id="cb73-16"><a href="#cb73-16"></a>  range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> <em>n_</em> <span class="op">=</span> <span class="dv">0</span>;      <span class="co">// exposition only</span></span>
<span id="cb73-17"><a href="#cb73-17"></a></span>
<span id="cb73-18"><a href="#cb73-18"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="dt">bool</span><span class="op">&gt;</span> <span class="kw">class</span> <em>iterator</em>;     <span class="co">// exposition only</span></span>
<span id="cb73-19"><a href="#cb73-19"></a>  <span class="kw">class</span> <em>sentinel</em>;                    <span class="co">// exposition only</span></span>
<span id="cb73-20"><a href="#cb73-20"></a></span>
<span id="cb73-21"><a href="#cb73-21"></a><span class="kw">public</span><span class="op">:</span></span>
<span id="cb73-22"><a href="#cb73-22"></a>  slide_view<span class="op">()</span> <span class="kw">requires</span> default_initializable<span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb73-23"><a href="#cb73-23"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> slide_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> n<span class="op">)</span>;</span>
<span id="cb73-24"><a href="#cb73-24"></a></span>
<span id="cb73-25"><a href="#cb73-25"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> begin<span class="op">()</span></span>
<span id="cb73-26"><a href="#cb73-26"></a>    <span class="kw">requires</span> <span class="op">(!(</span><em>simple-view</em><span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> <em>slide-caches-nothing</em><span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;))</span>;</span>
<span id="cb73-27"><a href="#cb73-27"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> begin<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> <em>slide-caches-nothing</em><span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span>;</span>
<span id="cb73-28"><a href="#cb73-28"></a></span>
<span id="cb73-29"><a href="#cb73-29"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> end<span class="op">()</span></span>
<span id="cb73-30"><a href="#cb73-30"></a>    <span class="kw">requires</span> <span class="op">(!(</span><em>simple-view</em><span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> <em>slide-caches-nothing</em><span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;))</span>;</span>
<span id="cb73-31"><a href="#cb73-31"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> end<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> <em>slide-caches-nothing</em><span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span>;</span>
<span id="cb73-32"><a href="#cb73-32"></a></span>
<span id="cb73-33"><a href="#cb73-33"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb73-34"><a href="#cb73-34"></a>  <span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span>;</span>
<span id="cb73-35"><a href="#cb73-35"></a><span class="op">}</span>;</span>
<span id="cb73-36"><a href="#cb73-36"></a></span>
<span id="cb73-37"><a href="#cb73-37"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> R<span class="op">&gt;</span></span>
<span id="cb73-38"><a href="#cb73-38"></a>  slide_view<span class="op">(</span>R<span class="op">&amp;&amp;</span> r, range_difference_t<span class="op">&lt;</span>R<span class="op">&gt;)</span> <span class="op">-&gt;</span> slide_view<span class="op">&lt;</span>views<span class="op">::</span>all_t<span class="op">&lt;</span>R<span class="op">&gt;&gt;</span>;</span>
<span id="cb73-39"><a href="#cb73-39"></a></span>
<span id="cb73-40"><a href="#cb73-40"></a><span class="op">}</span></span></code></pre></div>
<div>
<div class="sourceCode" id="cb74"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb74-1"><a href="#cb74-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> slide_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> n<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_66" id="pnum_66">1</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>base_</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>base<span class="op">)</span></code> and <code class="sourceCode cpp"><em>n_</em></code> with <code class="sourceCode cpp">n</code>.</p>
</blockquote>
<div class="sourceCode" id="cb75"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb75-1"><a href="#cb75-1"></a><span class="kw">constexpr</span> <span class="kw">auto</span> begin<span class="op">()</span></span>
<span id="cb75-2"><a href="#cb75-2"></a>  <span class="kw">requires</span> <span class="op">(!(</span><em>simple-view</em><span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> <em>slide-caches-nothing</em><span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;))</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_67" id="pnum_67">2</a></span> <em>Returns</em>:</p>
<ul>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_68" id="pnum_68">(2.1)</a></span> If <code class="sourceCode cpp">V</code> models <code class="sourceCode cpp"><em>slide-caches-first</em></code>, <code class="sourceCode cpp"><em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;(</span>ranges<span class="op">::</span>begin<span class="op">(</span><em>base_</em><span class="op">)</span>, ranges<span class="op">::</span>next<span class="op">(</span>ranges<span class="op">::</span>begin<span class="op">(</span><em>base_</em><span class="op">)</span>, <em>n_</em> <span class="op">-</span> <span class="dv">1</span>, ranges<span class="op">::</span>end<span class="op">(</span><em>base_</em><span class="op">))</span>, <em>n_</em><span class="op">)</span></code>.</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_69" id="pnum_69">(2.2)</a></span> Otherwise, <code class="sourceCode cpp"><em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;(</span>ranges<span class="op">::</span>begin<span class="op">(</span><em>base_</em><span class="op">)</span>, <em>n_</em><span class="op">)</span></code>.</li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_70" id="pnum_70">3</a></span> <em>Remarks</em>: In order to provide the amortized constant-time complexity required by the <code class="sourceCode cpp">range</code> concept, this function caches the result within the <code class="sourceCode cpp">slide_view</code> for use on subsequent calls when <code class="sourceCode cpp">V</code> models <code class="sourceCode cpp"><em>slide-caches-first</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb76"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb76-1"><a href="#cb76-1"></a><span class="kw">constexpr</span> <span class="kw">auto</span> begin<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> <em>slide-caches-nothing</em><span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_71" id="pnum_71">4</a></span> <em>Returns</em>: <code class="sourceCode cpp"><em>iterator</em><span class="op">&lt;</span><span class="kw">true</span><span class="op">&gt;(</span>ranges<span class="op">::</span>begin<span class="op">(</span><em>base_</em><span class="op">)</span>, <em>n_</em><span class="op">)</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb77"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb77-1"><a href="#cb77-1"></a><span class="kw">constexpr</span> <span class="kw">auto</span> end<span class="op">()</span></span>
<span id="cb77-2"><a href="#cb77-2"></a>  <span class="kw">requires</span> <span class="op">(!(</span><em>simple-view</em><span class="op">&lt;</span>V<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> <em>slide-caches-nothing</em><span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;))</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_72" id="pnum_72">5</a></span> <em>Returns</em>:</p>
<ul>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_73" id="pnum_73">(5.1)</a></span> If <code class="sourceCode cpp">V</code> models <code class="sourceCode cpp"><em>slide-caches-nothing</em></code>, <code class="sourceCode cpp"><em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;(</span>ranges<span class="op">::</span>begin<span class="op">(</span><em>base_</em><span class="op">)</span> <span class="op">+</span> range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;(</span>size<span class="op">())</span>, <em>n_</em><span class="op">)</span></code>;</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_74" id="pnum_74">(5.2)</a></span> Otherwise, if <code class="sourceCode cpp">V</code> models <code class="sourceCode cpp"><em>slide-caches-last</em></code>, <code class="sourceCode cpp"><em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;(</span>ranges<span class="op">::</span>prev<span class="op">(</span>ranges<span class="op">::</span>end<span class="op">(</span><em>base_</em><span class="op">)</span>, <em>n_</em> <span class="op">-</span> <span class="dv">1</span>, ranges<span class="op">::</span>begin<span class="op">(</span><em>base_</em><span class="op">))</span>, <em>n_</em><span class="op">)</span></code>;</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_75" id="pnum_75">(5.3)</a></span> Otherwise, if <code class="sourceCode cpp">V</code> models <code class="sourceCode cpp">common_range</code>, <code class="sourceCode cpp">iterator<span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;(</span>ranges<span class="op">::</span>end<span class="op">(</span><em>base_</em><span class="op">)</span>, ranges<span class="op">::</span>end<span class="op">(</span><em>base_</em><span class="op">)</span>, <em>n_</em><span class="op">)</span></code>;</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_76" id="pnum_76">(5.4)</a></span> Otherwise, <code class="sourceCode cpp"><em>sentinel</em><span class="op">(</span>ranges<span class="op">::</span>end<span class="op">(</span><em>base_</em><span class="op">))</span></code>.</li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_77" id="pnum_77">6</a></span> <em>Remarks</em>: In order to provide the amortized constant-time complexity required by the <code class="sourceCode cpp">range</code> concept, this function caches the result within the <code class="sourceCode cpp">slide_view</code> for use on subsequent calls when <code class="sourceCode cpp">V</code> models <code class="sourceCode cpp"><em>slide-caches-last</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb78"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb78-1"><a href="#cb78-1"></a><span class="kw">constexpr</span> <span class="kw">auto</span> end<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> <em>slide-caches-nothing</em><span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_78" id="pnum_78">7</a></span> <em>Returns</em>: <code class="sourceCode cpp">begin<span class="op">()</span> <span class="op">+</span> range_difference_t<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;(</span>size<span class="op">())</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb79"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb79-1"><a href="#cb79-1"></a><span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span>V<span class="op">&gt;</span>;</span>
<span id="cb79-2"><a href="#cb79-2"></a><span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">()</span> <span class="kw">const</span> <span class="kw">requires</span> sized_range<span class="op">&lt;</span><span class="kw">const</span> V<span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_79" id="pnum_79">8</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb80"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb80-1"><a href="#cb80-1"></a><span class="kw">auto</span> sz <span class="op">=</span> ranges<span class="op">::</span>distance<span class="op">(</span><em>base_</em><span class="op">)</span> <span class="op">-</span> <em>n_</em> <span class="op">+</span> <span class="dv">1</span>;</span>
<span id="cb80-2"><a href="#cb80-2"></a><span class="cf">if</span> <span class="op">(</span>sz <span class="op">&lt;</span> <span class="dv">0</span><span class="op">)</span> sz <span class="op">=</span> <span class="dv">0</span>;</span>
<span id="cb80-3"><a href="#cb80-3"></a><span class="cf">return</span> <em>to-unsigned-like</em><span class="op">(</span>sz<span class="op">)</span>;</span></code></pre></div>
</blockquote>
</blockquote>
</div>
<h4 class="unnumbered" data-number id="class-template-slide_viewiterator-range.slide.iterator">24.7.?.3 Class template <code class="sourceCode cpp">slide_view<span class="op">::</span><em>iterator</em></code> [range.slide.iterator]<a href="#class-template-slide_viewiterator-range.slide.iterator" class="self-link"></a></h4>
<div class="sourceCode" id="cb81"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb81-1"><a href="#cb81-1"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb81-2"><a href="#cb81-2"></a>  <span class="kw">template</span><span class="op">&lt;</span>forward_range V<span class="op">&gt;</span></span>
<span id="cb81-3"><a href="#cb81-3"></a>    <span class="kw">requires</span> view<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb81-4"><a href="#cb81-4"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="dt">bool</span> Const<span class="op">&gt;</span></span>
<span id="cb81-5"><a href="#cb81-5"></a>  <span class="kw">class</span> slide_view<span class="op">&lt;</span>V<span class="op">&gt;::</span><em>iterator</em> <span class="op">{</span></span>
<span id="cb81-6"><a href="#cb81-6"></a>    <span class="kw">using</span> <em>Base</em> <span class="op">=</span> <em>maybe-const</em><span class="op">&lt;</span>Const, V<span class="op">&gt;</span>;                     <span class="co">// exposition only</span></span>
<span id="cb81-7"><a href="#cb81-7"></a>    iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <em>current_</em>   <span class="op">=</span> iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;()</span>;       <span class="co">// exposition only</span></span>
<span id="cb81-8"><a href="#cb81-8"></a>    iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <em>last_ele_</em>  <span class="op">=</span> iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;()</span>;       <span class="co">// exposition only, present only if <em>Base</em> models <em>slide-caches-first</em></span></span>
<span id="cb81-9"><a href="#cb81-9"></a>    range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <em>n_</em> <span class="op">=</span> <span class="dv">0</span>;                        <span class="co">// exposition only</span></span>
<span id="cb81-10"><a href="#cb81-10"></a></span>
<span id="cb81-11"><a href="#cb81-11"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">(</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> current, range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> n<span class="op">)</span> <span class="co">// exposition only</span></span>
<span id="cb81-12"><a href="#cb81-12"></a>      <span class="kw">requires</span> <span class="op">(!</span><em>slide-caches-first</em><span class="op">&lt;</span><em>Base</em><span class="op">&gt;)</span>;</span>
<span id="cb81-13"><a href="#cb81-13"></a></span>
<span id="cb81-14"><a href="#cb81-14"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">(</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> current, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> last_ele, range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> n<span class="op">)</span> <span class="co">// exposition only</span></span>
<span id="cb81-15"><a href="#cb81-15"></a>      <span class="kw">requires</span> <em>slide-caches-first</em><span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-16"><a href="#cb81-16"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb81-17"><a href="#cb81-17"></a>    <span class="kw">using</span> iterator_category <span class="op">=</span> input_iterator_tag;</span>
<span id="cb81-18"><a href="#cb81-18"></a>    <span class="kw">using</span> iterator_concept  <span class="op">=</span> <em>see below</em>;</span>
<span id="cb81-19"><a href="#cb81-19"></a>    <span class="kw">using</span> value_type <span class="op">=</span> <span class="kw">decltype</span><span class="op">(</span>views<span class="op">::</span>counted<span class="op">(</span><em>current_</em>, <em>n_</em><span class="op">))</span>;</span>
<span id="cb81-20"><a href="#cb81-20"></a>    <span class="kw">using</span> difference_type <span class="op">=</span> range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-21"><a href="#cb81-21"></a></span>
<span id="cb81-22"><a href="#cb81-22"></a>    <em>iterator</em><span class="op">()</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb81-23"><a href="#cb81-23"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">(</span><em>iterator</em><span class="op">&lt;!</span>Const<span class="op">&gt;</span> i<span class="op">)</span></span>
<span id="cb81-24"><a href="#cb81-24"></a>      <span class="kw">requires</span> Const <span class="op">&amp;&amp;</span> convertible_to<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span>
<span id="cb81-25"><a href="#cb81-25"></a></span>
<span id="cb81-26"><a href="#cb81-26"></a>    <span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span>
<span id="cb81-27"><a href="#cb81-27"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb81-28"><a href="#cb81-28"></a>    <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb81-29"><a href="#cb81-29"></a></span>
<span id="cb81-30"><a href="#cb81-30"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">--()</span> <span class="kw">requires</span> bidirectional_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-31"><a href="#cb81-31"></a>    <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">--(</span><span class="dt">int</span><span class="op">)</span> <span class="kw">requires</span> bidirectional_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-32"><a href="#cb81-32"></a></span>
<span id="cb81-33"><a href="#cb81-33"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">+=(</span>difference_type x<span class="op">)</span></span>
<span id="cb81-34"><a href="#cb81-34"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-35"><a href="#cb81-35"></a>    <span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">-=(</span>difference_type x<span class="op">)</span></span>
<span id="cb81-36"><a href="#cb81-36"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-37"><a href="#cb81-37"></a></span>
<span id="cb81-38"><a href="#cb81-38"></a>    <span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">[](</span>difference_type n<span class="op">)</span> <span class="kw">const</span></span>
<span id="cb81-39"><a href="#cb81-39"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-40"><a href="#cb81-40"></a></span>
<span id="cb81-41"><a href="#cb81-41"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span>;</span>
<span id="cb81-42"><a href="#cb81-42"></a></span>
<span id="cb81-43"><a href="#cb81-43"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb81-44"><a href="#cb81-44"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-45"><a href="#cb81-45"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb81-46"><a href="#cb81-46"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-47"><a href="#cb81-47"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;=(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb81-48"><a href="#cb81-48"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-49"><a href="#cb81-49"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;=(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb81-50"><a href="#cb81-50"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-51"><a href="#cb81-51"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">&lt;=&gt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb81-52"><a href="#cb81-52"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <span class="op">&amp;&amp;</span></span>
<span id="cb81-53"><a href="#cb81-53"></a>               three_way_comparable<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span>
<span id="cb81-54"><a href="#cb81-54"></a></span>
<span id="cb81-55"><a href="#cb81-55"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">+(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i, difference_type n<span class="op">)</span></span>
<span id="cb81-56"><a href="#cb81-56"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-57"><a href="#cb81-57"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">+(</span>difference_type n, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i<span class="op">)</span></span>
<span id="cb81-58"><a href="#cb81-58"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-59"><a href="#cb81-59"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i, difference_type n<span class="op">)</span></span>
<span id="cb81-60"><a href="#cb81-60"></a>      <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb81-61"><a href="#cb81-61"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb81-62"><a href="#cb81-62"></a>      <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span>
<span id="cb81-63"><a href="#cb81-63"></a>  <span class="op">}</span>;</span>
<span id="cb81-64"><a href="#cb81-64"></a><span class="op">}</span></span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_80" id="pnum_80">1</a></span> <code class="sourceCode cpp"><em>iterator</em><span class="op">::</span>iterator_concept</code> is defined as follows:</p>
<ul>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_81" id="pnum_81">(1.1)</a></span> If <code class="sourceCode cpp"><em>Base</em></code> models <code class="sourceCode cpp">random_access_range</code>, then <code class="sourceCode cpp">iterator_concept</code> denotes <code class="sourceCode cpp">random_access_iterator_tag</code>.</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_82" id="pnum_82">(1.2)</a></span> Otherwise, if <code class="sourceCode cpp"><em>Base</em></code> models <code class="sourceCode cpp">bidirectional_range</code>, then <code class="sourceCode cpp">iterator_concept</code> denotes <code class="sourceCode cpp">bidirectional_iterator_tag</code>.</li>
<li><span class="marginalizedparent"><a class="marginalized" href="#pnum_83" id="pnum_83">(1.3)</a></span> Otherwise, <code class="sourceCode cpp">iterator_concept</code> denotes <code class="sourceCode cpp">forward_iterator_tag</code>.</li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_84" id="pnum_84">2</a></span> If the invocation of any non-const member function of <em><code class="sourceCode cpp">iterator</code></em> exits via an exception, the iterator acquires a singular value.</p>
<div>
<div class="sourceCode" id="cb82"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb82-1"><a href="#cb82-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">(</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> current, range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> n<span class="op">)</span></span>
<span id="cb82-2"><a href="#cb82-2"></a>  <span class="kw">requires</span> <span class="op">(!</span><em>slide-caches-first</em><span class="op">&lt;</span><em>Base</em><span class="op">&gt;)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_85" id="pnum_85">3</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>current_</em></code> with <code class="sourceCode cpp">current</code> and <code class="sourceCode cpp"><em>n_</em></code> with <code class="sourceCode cpp">n</code>.</p>
</blockquote>
<div class="sourceCode" id="cb83"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb83-1"><a href="#cb83-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">(</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> current, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> last_ele, range_difference_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> n<span class="op">)</span>; <span class="co">// exposition only</span></span>
<span id="cb83-2"><a href="#cb83-2"></a>  <span class="kw">requires</span> <em>slide-caches-first</em><span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_86" id="pnum_86">4</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>current_</em></code> with <code class="sourceCode cpp">current</code>, <code class="sourceCode cpp"><em>last_ele_</em></code> with <code class="sourceCode cpp">last_ele</code>, and <code class="sourceCode cpp"><em>n_</em></code> with <code class="sourceCode cpp">n</code>.</p>
</blockquote>
<div class="sourceCode" id="cb84"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb84-1"><a href="#cb84-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">(</span><em>iterator</em><span class="op">&lt;!</span>Const<span class="op">&gt;</span> i<span class="op">)</span></span>
<span id="cb84-2"><a href="#cb84-2"></a>  <span class="kw">requires</span> Const <span class="op">&amp;&amp;</span> <span class="op">(</span>convertible_to<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_87" id="pnum_87">5</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>current_</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>i<span class="op">.</span><em>current_</em><span class="op">)</span></code> and <code class="sourceCode cpp"><em>n_</em></code> with <code class="sourceCode cpp">i<span class="op">.</span><em>n_</em></code>. <span class="note"><span>[ <em>Note 1:</em> </span><code class="sourceCode cpp">iterator<span class="op">&lt;</span><span class="kw">true</span><span class="op">&gt;</span></code> can only be formed when <code class="sourceCode cpp"><em>Base</em></code> models <code class="sourceCode cpp"><em>slide-caches-nothing</em></code>, in which case <code class="sourceCode cpp"><em>last_ele_</em></code> is not present.<span> — <em>end note</em> ]</span></span></p>
</blockquote>
<div class="sourceCode" id="cb85"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb85-1"><a href="#cb85-1"></a><span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_88" id="pnum_88">6</a></span> <em>Returns</em>: <code class="sourceCode cpp">views<span class="op">::</span>counted<span class="op">(</span><em>current_</em>, <em>n_</em><span class="op">)</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb86"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb86-1"><a href="#cb86-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_89" id="pnum_89">7</a></span> <em>Preconditions:</em> <code class="sourceCode cpp"><em>current_</em></code> and <code class="sourceCode cpp"><em>last_ele_</em></code> (if present) are incrementable.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_90" id="pnum_90">8</a></span> <em>Postconditions</em>: <code class="sourceCode cpp"><em>current_</em></code> and <code class="sourceCode cpp"><em>last_ele_</em></code> (if present) are each equal to <code class="sourceCode cpp">ranges<span class="op">::</span>next<span class="op">(</span><em>i</em><span class="op">)</span></code>, where <span class="math inline"><em>i</em></span> is the value of that data member before the call.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_91" id="pnum_91">9</a></span> <em>Returns</em>: <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb87"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb87-1"><a href="#cb87-1"></a><span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_92" id="pnum_92">10</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb88"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb88-1"><a href="#cb88-1"></a>  <span class="kw">auto</span> tmp <span class="op">=</span> <span class="op">*</span><span class="kw">this</span>;</span>
<span id="cb88-2"><a href="#cb88-2"></a>  <span class="op">++*</span><span class="kw">this</span>;</span>
<span id="cb88-3"><a href="#cb88-3"></a>  <span class="cf">return</span> tmp;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb89"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb89-1"><a href="#cb89-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">--()</span> <span class="kw">requires</span> bidirectional_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_93" id="pnum_93">11</a></span> <em>Preconditions:</em> <code class="sourceCode cpp"><em>current_</em></code> and <code class="sourceCode cpp"><em>last_ele_</em></code> (if present) are decrementable.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_94" id="pnum_94">12</a></span> <em>Postconditions</em>: <code class="sourceCode cpp"><em>current_</em></code> and <code class="sourceCode cpp"><em>last_ele_</em></code> (if present) are each equal to <code class="sourceCode cpp">ranges<span class="op">::</span>prev<span class="op">(</span><em>i</em><span class="op">)</span></code>, where <span class="math inline"><em>i</em></span> is the value of that data member before the call.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_95" id="pnum_95">13</a></span> <em>Returns</em>: <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb90"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb90-1"><a href="#cb90-1"></a><span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">--(</span><span class="dt">int</span><span class="op">)</span> <span class="kw">requires</span> bidirectional_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_96" id="pnum_96">14</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb91"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb91-1"><a href="#cb91-1"></a>  <span class="kw">auto</span> tmp <span class="op">=</span> <span class="op">*</span><span class="kw">this</span>;</span>
<span id="cb91-2"><a href="#cb91-2"></a>  <span class="op">--*</span><span class="kw">this</span>;</span>
<span id="cb91-3"><a href="#cb91-3"></a>  <span class="cf">return</span> tmp;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb92"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb92-1"><a href="#cb92-1"></a><span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">+=(</span>difference_type x<span class="op">)</span></span>
<span id="cb92-2"><a href="#cb92-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_97" id="pnum_97">15</a></span> <em>Preconditions:</em> <code class="sourceCode cpp"><em>current_</em> <span class="op">+</span> x</code> and <code class="sourceCode cpp"><em>last_ele_</em> <span class="op">+</span> x</code> (if present) has well-defined behavior.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_98" id="pnum_98">16</a></span> <em>Postconditions</em>: <code class="sourceCode cpp"><em>current_</em></code> and <code class="sourceCode cpp"><em>last_ele_</em></code> (if present) are each equal to <code class="sourceCode cpp"><em>i</em> <span class="op">+</span> x</code>, where <span class="math inline"><em>i</em></span> is the value of that data member before the call.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_99" id="pnum_99">17</a></span> <em>Returns</em>: <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb93"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb93-1"><a href="#cb93-1"></a>  <span class="kw">constexpr</span> <em>iterator</em><span class="op">&amp;</span> <span class="kw">operator</span><span class="op">-=(</span>difference_type x<span class="op">)</span></span>
<span id="cb93-2"><a href="#cb93-2"></a>    <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_100" id="pnum_100">18</a></span> <em>Preconditions:</em> <code class="sourceCode cpp"><em>current_</em> <span class="op">-</span> x</code> and <code class="sourceCode cpp"><em>last_ele_</em> <span class="op">-</span> x</code> (if present) has well-defined behavior.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_101" id="pnum_101">19</a></span> <em>Postconditions</em>: <code class="sourceCode cpp"><em>current_</em></code> and <code class="sourceCode cpp"><em>last_ele_</em></code> (if present) are each equal to <code class="sourceCode cpp"><em>i</em> <span class="op">-</span> x</code>, where <span class="math inline"><em>i</em></span> is the value of that data member before the call.</p>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_102" id="pnum_102">20</a></span> <em>Returns</em>: <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>.</p>
</blockquote>
<div class="sourceCode" id="cb94"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb94-1"><a href="#cb94-1"></a><span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">[](</span>difference_type n<span class="op">)</span> <span class="kw">const</span></span>
<span id="cb94-2"><a href="#cb94-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_103" id="pnum_103">21</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> views<span class="op">::</span>counted<span class="op">(</span><em>current_</em> <span class="op">+</span> n, <em>n_</em><span class="op">)</span>;</code></p>
</blockquote>
<div class="sourceCode" id="cb95"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb95-1"><a href="#cb95-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_104" id="pnum_104">22</a></span> <em>Returns:</em> If <code class="sourceCode cpp"><em>last_ele_</em></code> is present, <code class="sourceCode cpp">x<span class="op">.</span><em>last_ele_</em> <span class="op">==</span> y<span class="op">.</span><em>last_ele_</em></code>; otherwise, <code class="sourceCode cpp">x<span class="op">.</span><em>current_</em> <span class="op">==</span> y<span class="op">.</span><em>current_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb96"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb96-1"><a href="#cb96-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb96-2"><a href="#cb96-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_105" id="pnum_105">23</a></span> <em>Returns</em>: <code class="sourceCode cpp">x<span class="op">.</span><em>current_</em> <span class="op">&lt;</span> y<span class="op">.</span><em>current_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb97"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb97-1"><a href="#cb97-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb97-2"><a href="#cb97-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_106" id="pnum_106">24</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> y <span class="op">&lt;</span> x;</code></p>
</blockquote>
<div class="sourceCode" id="cb98"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb98-1"><a href="#cb98-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;=(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb98-2"><a href="#cb98-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_107" id="pnum_107">25</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">!(</span>y <span class="op">&lt;</span> x<span class="op">)</span>;</code></p>
</blockquote>
<div class="sourceCode" id="cb99"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb99-1"><a href="#cb99-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;=(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb99-2"><a href="#cb99-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_108" id="pnum_108">26</a></span> <em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">!(</span>x <span class="op">&lt;</span> y<span class="op">)</span>;</code></p>
</blockquote>
<div class="sourceCode" id="cb100"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb100-1"><a href="#cb100-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">&lt;=&gt;(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb100-2"><a href="#cb100-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span> <span class="op">&amp;&amp;</span></span>
<span id="cb100-3"><a href="#cb100-3"></a>           three_way_comparable<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_109" id="pnum_109">27</a></span> <em>Returns</em>: <code class="sourceCode cpp">x<span class="op">.</span><em>current_</em> <span class="op">&lt;=&gt;</span> y<span class="op">.</span><em>current_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb101"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb101-1"><a href="#cb101-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">+(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i, difference_type n<span class="op">)</span></span>
<span id="cb101-2"><a href="#cb101-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span>
<span id="cb101-3"><a href="#cb101-3"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">+(</span>difference_type n, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i<span class="op">)</span></span>
<span id="cb101-4"><a href="#cb101-4"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_110" id="pnum_110">28</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb102"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb102-1"><a href="#cb102-1"></a>  <span class="kw">auto</span> r <span class="op">=</span> i;</span>
<span id="cb102-2"><a href="#cb102-2"></a>  r <span class="op">+=</span> n;</span>
<span id="cb102-3"><a href="#cb102-3"></a>  <span class="cf">return</span> r;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb103"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb103-1"><a href="#cb103-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <em>iterator</em> <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> i, difference_type n<span class="op">)</span></span>
<span id="cb103-2"><a href="#cb103-2"></a>  <span class="kw">requires</span> random_access_range<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_111" id="pnum_111">29</a></span> <em>Effects</em>: Equivalent to:</p>
<blockquote>
<div class="sourceCode" id="cb104"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb104-1"><a href="#cb104-1"></a>  <span class="kw">auto</span> r <span class="op">=</span> i;</span>
<span id="cb104-2"><a href="#cb104-2"></a>  r <span class="op">-=</span> n;</span>
<span id="cb104-3"><a href="#cb104-3"></a>  <span class="cf">return</span> r;</span></code></pre></div>
</blockquote>
</blockquote>
<div class="sourceCode" id="cb105"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb105-1"><a href="#cb105-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> difference_type <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> x, <span class="kw">const</span> <em>iterator</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb105-2"><a href="#cb105-2"></a>  <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span><em>Base</em><span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_112" id="pnum_112">30</a></span> <em>Returns</em>: If <code class="sourceCode cpp"><em>last_ele_</em></code> is present, <code class="sourceCode cpp">x<span class="op">.</span><em>last_ele_</em> <span class="op">-</span> y<span class="op">.</span><em>last_ele_</em></code>; otherwise, <code class="sourceCode cpp">x<span class="op">.</span><em>current_</em> <span class="op">-</span> y<span class="op">.</span><em>current_</em></code>.</p>
</blockquote>
</div>
<h4 class="unnumbered" data-number id="class-slide_viewsentinel-range.slide.sentinel">24.7.?.4 Class <code class="sourceCode cpp">slide_view<span class="op">::</span><em>sentinel</em></code> [range.slide.sentinel]<a href="#class-slide_viewsentinel-range.slide.sentinel" class="self-link"></a></h4>
<div class="sourceCode" id="cb106"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb106-1"><a href="#cb106-1"></a><span class="kw">namespace</span> std<span class="op">::</span>ranges <span class="op">{</span></span>
<span id="cb106-2"><a href="#cb106-2"></a>  <span class="kw">template</span><span class="op">&lt;</span>forward_range V<span class="op">&gt;</span></span>
<span id="cb106-3"><a href="#cb106-3"></a>    <span class="kw">requires</span> view<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb106-4"><a href="#cb106-4"></a>  <span class="kw">class</span> slide_view<span class="op">&lt;</span>V<span class="op">&gt;::</span><em>sentinel</em> <span class="op">{</span></span>
<span id="cb106-5"><a href="#cb106-5"></a>    sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span> <em>end_</em> <span class="op">=</span> sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;()</span>;             <span class="co">// exposition only</span></span>
<span id="cb106-6"><a href="#cb106-6"></a>    <span class="kw">constexpr</span> <span class="kw">explicit</span> <em>sentinel</em><span class="op">(</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span> end<span class="op">)</span>;   <span class="co">// exposition only</span></span>
<span id="cb106-7"><a href="#cb106-7"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb106-8"><a href="#cb106-8"></a>    <em>sentinel</em><span class="op">()</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb106-9"><a href="#cb106-9"></a></span>
<span id="cb106-10"><a href="#cb106-10"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;&amp;</span> x, <span class="kw">const</span> <em>sentinel</em><span class="op">&amp;</span> y<span class="op">)</span>;</span>
<span id="cb106-11"><a href="#cb106-11"></a></span>
<span id="cb106-12"><a href="#cb106-12"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb106-13"><a href="#cb106-13"></a>      <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;&amp;</span> x, <span class="kw">const</span> <em>sentinel</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb106-14"><a href="#cb106-14"></a>        <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span>
<span id="cb106-15"><a href="#cb106-15"></a></span>
<span id="cb106-16"><a href="#cb106-16"></a>    <span class="kw">friend</span> <span class="kw">constexpr</span> range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb106-17"><a href="#cb106-17"></a>      <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>sentinel</em><span class="op">&amp;</span> y, <span class="kw">const</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;&amp;</span> x<span class="op">)</span></span>
<span id="cb106-18"><a href="#cb106-18"></a>        <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span>
<span id="cb106-19"><a href="#cb106-19"></a>  <span class="op">}</span>;</span>
<span id="cb106-20"><a href="#cb106-20"></a><span class="op">}</span></span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_113" id="pnum_113">1</a></span> <span class="note"><span>[ <em>Note 1:</em> </span><code class="sourceCode cpp"><em>sentinel</em></code> is only used when <code class="sourceCode cpp"><em>slide-caches-first</em><span class="op">&lt;</span>V<span class="op">&gt;</span></code> is <code class="sourceCode cpp"><span class="kw">true</span></code>.<span> — <em>end note</em> ]</span></span></p>
<div>
<div class="sourceCode" id="cb107"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb107-1"><a href="#cb107-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> <em>sentinel</em><span class="op">(</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span> end<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_114" id="pnum_114">2</a></span> <em>Effects</em>: Initializes <code class="sourceCode cpp"><em>end_</em></code> with <code class="sourceCode cpp">end</code>.</p>
</blockquote>
<div class="sourceCode" id="cb108"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb108-1"><a href="#cb108-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;&amp;</span> x, <span class="kw">const</span> <em>sentinel</em><span class="op">&amp;</span> y<span class="op">)</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_115" id="pnum_115">3</a></span> <em>Returns</em>: <code class="sourceCode cpp">x<span class="op">.</span><em>last_ele_</em> <span class="op">==</span> y<span class="op">.</span><em>end_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb109"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb109-1"><a href="#cb109-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb109-2"><a href="#cb109-2"></a>  <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;&amp;</span> x, <span class="kw">const</span> <em>sentinel</em><span class="op">&amp;</span> y<span class="op">)</span></span>
<span id="cb109-3"><a href="#cb109-3"></a>    <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_116" id="pnum_116">4</a></span> <em>Returns</em>: <code class="sourceCode cpp">x<span class="op">.</span><em>last_ele_</em> <span class="op">-</span> y<span class="op">.</span><em>end_</em></code>.</p>
</blockquote>
<div class="sourceCode" id="cb110"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb110-1"><a href="#cb110-1"></a><span class="kw">friend</span> <span class="kw">constexpr</span> range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span></span>
<span id="cb110-2"><a href="#cb110-2"></a>  <span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> <em>sentinel</em><span class="op">&amp;</span> y, <span class="kw">const</span> <em>iterator</em><span class="op">&lt;</span><span class="kw">false</span><span class="op">&gt;&amp;</span> x<span class="op">)</span></span>
<span id="cb110-3"><a href="#cb110-3"></a>    <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>sentinel_t<span class="op">&lt;</span>V<span class="op">&gt;</span>, iterator_t<span class="op">&lt;</span>V<span class="op">&gt;&gt;</span>;</span></code></pre></div>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized" href="#pnum_117" id="pnum_117">5</a></span> <em>Returns</em>: <code class="sourceCode cpp">y<span class="op">.</span><em>end_</em> <span class="op">-</span> x<span class="op">.</span><em>last_ele_</em></code>.</p>
</blockquote>
</div>
<h2 data-number="4.4" id="feature-test-macro"><span class="header-section-number">4.4</span> Feature-test macro<a href="#feature-test-macro" class="self-link"></a></h2>
<p>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 paper:</p>
<div class="sourceCode" id="cb111"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb111-1"><a href="#cb111-1"></a><span class="pp">#define __cpp_lib_ranges_chunk_slide </span><span class="dv">20</span><span class="er">XXXXL</span><span class="pp"> </span><span class="co">// also in &lt;ranges&gt;</span></span></code></pre></div>
<h1 data-number="5" style="border-bottom:1px solid #cccccc" id="bibliography"><span class="header-section-number">5</span> References<a href="#bibliography" class="self-link"></a></h1>
<div id="refs" class="references hanging-indent" role="doc-bibliography">
<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 id="ref-P2321R2">
<p>[P2321R2] Tim Song. 2021-06-11. zip. <br />
<a href="https://wg21.link/p2321r2">https://wg21.link/p2321r2</a></p>
</div>
</div>
</div>
</div>
</body>
</html>
