<!DOCTYPE html>

<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="mobile-web-app-capable" content="yes">
    <title>
        Safer Range Access - HackMD
    </title>
    <link rel="icon" type="image/png" href="https://hackmd.io/favicon.png">
    <link rel="apple-touch-icon" href="https://hackmd.io/apple-touch-icon.png">

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/3.5.0/octicons.min.css" integrity="sha256-QiWfLIsCT02Sdwkogf6YMiQlj4NE84MKkzEMkZnMGdg=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/themes/prism.min.css" integrity="sha256-vtR0hSWRc3Tb26iuN2oZHt3KRUomwTufNIf5/4oeCyg=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
    <style>
        @import url(https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i|Source+Code+Pro:300,400,500|Source+Sans+Pro:300,300i,400,400i,600,600i|Source+Serif+Pro&subset=latin-ext);.hljs{background:#fff;color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment,.hljs-meta{color:#969896}.hljs-emphasis,.hljs-quote,.hljs-string,.hljs-strong,.hljs-template-variable,.hljs-variable{color:#df5000}.hljs-keyword,.hljs-selector-tag,.hljs-type{color:#a71d5d}.hljs-attribute,.hljs-bullet,.hljs-literal,.hljs-number,.hljs-symbol{color:#0086b3}.hljs-built_in,.hljs-builtin-name{color:#005cc5}.hljs-name,.hljs-section{color:#63a35c}.hljs-tag{color:#333}.hljs-attr,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-title{color:#795da3}.hljs-addition{background-color:#eaffea;color:#55a532}.hljs-deletion{background-color:#ffecec;color:#bd2c00}.hljs-link{text-decoration:underline}.markdown-body{word-wrap:break-word;font-size:16px;line-height:1.5}.markdown-body:after,.markdown-body:before{content:"";display:table}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#c00}.markdown-body .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-bottom:16px;margin-top:0}.markdown-body hr{background-color:#e7e7e7;border:0;height:.25em;margin:24px 0;padding:0}.markdown-body blockquote{border-left:.25em solid #ddd;color:#777;font-size:16px;padding:0 1em}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd,.popover kbd{background-color:#fcfcfc;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#555;display:inline-block;font-size:11px;line-height:10px;padding:3px 5px;vertical-align:middle}.markdown-body .loweralpha{list-style-type:lower-alpha}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:600;line-height:1.25;margin-bottom:16px;margin-top:24px}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{border-bottom:1px solid #eee;padding-bottom:.3em}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{color:#777;font-size:.85em}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol.no-list,.markdown-body ul.no-list{list-style-type:none;padding:0}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-bottom:0;margin-top:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{padding-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:700;margin-top:16px;padding:0}.markdown-body dl dd{margin-bottom:16px;padding:0 16px}.markdown-body table{display:block;overflow:auto;width:100%;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:700}.markdown-body table td,.markdown-body table th{border:1px solid #ddd;padding:6px 13px}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.markdown-body img{background-color:#fff;box-sizing:initial;max-width:100%}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{background-color:initial;max-width:none;vertical-align:text-top}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{border:1px solid #ddd;display:block;float:left;margin:13px 0 0;overflow:hidden;padding:7px;width:auto}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{clear:both;color:#333;display:block;padding:5px 0 0}.markdown-body span.align-center{clear:both;display:block;overflow:hidden}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{clear:both;display:block;overflow:hidden}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{background-color:#0000000a;border-radius:3px;font-size:85%;margin:0;padding:.2em 0}.markdown-body code:after,.markdown-body code:before,.markdown-body tt:after,.markdown-body tt:before{content:"\00a0";letter-spacing:-.2em}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{background:#0000;border:0;font-size:100%;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{border-radius:3px;font-size:85%;line-height:1.45;overflow:auto}.markdown-body:not(.next-editor) pre{background-color:#f7f7f7;padding:16px}.markdown-body pre code,.markdown-body pre tt{word-wrap:normal;background-color:initial;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0}.markdown-body pre code:after,.markdown-body pre code:before,.markdown-body pre tt:after,.markdown-body pre tt:before{content:normal}.markdown-body .csv-data td,.markdown-body .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-line-num{background:#fff;border:0;padding:10px 8px 9px;text-align:right}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{background:#f8f8f8;border-top:0;font-weight:700}.news .alert .markdown-body blockquote{border:0;padding:0 0 0 40px}.activity-tab .news .alert .commits,.activity-tab .news .markdown-body blockquote{padding-left:0}.task-list-item{list-style-type:none}.task-list-item label{font-weight:400}.task-list-item.enabled label{cursor:pointer}.task-list-item+.task-list-item{margin-top:3px}.task-list-item-checkbox{cursor:default!important;float:left;margin:.31em 0 .2em -1.3em!important;vertical-align:middle}.markdown-body{max-width:758px;overflow:visible!important;padding-bottom:40px;padding-top:40px;position:relative}.markdown-body.next-editor{overflow-x:hidden!important}.markdown-body .emoji{vertical-align:top}.markdown-body pre{border:inherit!important}.markdown-body code{color:inherit!important}.markdown-body pre code .wrapper{display:-moz-inline-flex;display:-ms-inline-flex;display:-o-inline-flex;display:inline-flex}.markdown-body pre code .gutter{float:left;overflow:hidden;-webkit-user-select:none;user-select:none}.markdown-body pre code .gutter.linenumber{border-right:3px solid #6ce26c!important;box-sizing:initial;color:#afafaf!important;cursor:default;display:inline-block;min-width:20px;padding:0 8px 0 0;position:relative;text-align:right;z-index:4}.markdown-body pre code .gutter.linenumber>span:before{content:attr(data-linenumber)}.markdown-body pre code .code{float:left;margin:0 0 0 16px}.markdown-body .gist .line-numbers{border-bottom:none;border-left:none;border-top:none}.markdown-body .gist .line-data{border:none}.markdown-body .gist table{border-collapse:inherit!important;border-spacing:0}.markdown-body code[data-gist-id]{background:none;padding:0}.markdown-body code[data-gist-id]:after,.markdown-body code[data-gist-id]:before{content:""}.markdown-body code[data-gist-id] .blob-num{border:unset}.markdown-body code[data-gist-id] table{margin-bottom:unset;overflow:unset}.markdown-body code[data-gist-id] table tr{background:unset}.markdown-body[dir=rtl] pre{direction:ltr}.markdown-body[dir=rtl] code{direction:ltr;unicode-bidi:embed}.markdown-body .alert>p:last-child{margin-bottom:0}.markdown-body pre.abc,.markdown-body pre.flow-chart,.markdown-body pre.graphviz,.markdown-body pre.mermaid,.markdown-body pre.sequence-diagram,.markdown-body pre.vega{background-color:inherit;border-radius:0;overflow:visible;text-align:center;white-space:inherit}.markdown-body pre.abc>code,.markdown-body pre.flow-chart>code,.markdown-body pre.graphviz>code,.markdown-body pre.mermaid>code,.markdown-body pre.sequence-diagram>code,.markdown-body pre.vega>code{text-align:left}.markdown-body pre.abc>svg,.markdown-body pre.flow-chart>svg,.markdown-body pre.graphviz>svg,.markdown-body pre.mermaid>svg,.markdown-body pre.sequence-diagram>svg,.markdown-body pre.vega>svg{height:100%;max-width:100%}.markdown-body pre>code.wrap{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}.markdown-body .alert>p:last-child,.markdown-body .alert>ul:last-child{margin-bottom:0}.markdown-body summary{display:list-item}.markdown-body summary:focus{outline:none}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none}.markdown-body figure{margin:1em 40px}.markdown-body .mark,.markdown-body mark{background-color:#fff1a7}.vimeo,.youtube{background-color:#000;background-position:50%;background-repeat:no-repeat;background-size:contain;cursor:pointer;display:table;overflow:hidden;text-align:center}.vimeo,.youtube{position:relative;width:100%}.youtube{padding-bottom:56.25%}.vimeo img{object-fit:contain;width:100%;z-index:0}.youtube img{object-fit:cover;z-index:0}.vimeo iframe,.youtube iframe,.youtube img{height:100%;left:0;position:absolute;top:0;width:100%}.vimeo iframe,.youtube iframe{vertical-align:middle;z-index:1}.vimeo .icon,.youtube .icon{color:#fff;height:auto;left:50%;opacity:.3;position:absolute;top:50%;transform:translate(-50%,-50%);transition:opacity .2s;width:auto;z-index:0}.vimeo:hover .icon,.youtube:hover .icon{opacity:.6;transition:opacity .2s}.slideshare .inner,.speakerdeck .inner{position:relative;width:100%}.slideshare .inner iframe,.speakerdeck .inner iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.figma{display:table;padding-bottom:56.25%;position:relative;width:100%}.figma iframe{border:1px solid #eee;bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.markmap-container{height:300px}.markmap-container>svg{height:100%;width:100%}.MJX_Assistive_MathML{display:none}#MathJax_Message{z-index:1000!important}.ui-infobar{color:#777;margin:25px auto -25px;max-width:760px;position:relative;z-index:2}.toc .invisable-node{list-style-type:none}.ui-toc{bottom:20px;position:fixed;z-index:998}.ui-toc.both-mode{margin-left:8px}.ui-toc.both-mode .ui-toc-label{border-bottom-left-radius:0;border-top-left-radius:0;height:40px;padding:10px 4px}.ui-toc-label{background-color:#e6e6e6;border:none;color:#868686;transition:opacity .2s}.ui-toc .open .ui-toc-label{color:#fff;opacity:1;transition:opacity .2s}.ui-toc-label:focus{background-color:#ccc;color:#000;opacity:.3}.ui-toc-label:hover{background-color:#ccc;opacity:1;transition:opacity .2s}.ui-toc-dropdown{margin-bottom:20px;margin-top:20px;max-height:70vh;max-width:45vw;overflow:auto;padding-left:10px;padding-right:10px;text-align:inherit;width:25vw}.ui-toc-dropdown>.toc{max-height:calc(70vh - 100px);overflow:auto}.ui-toc-dropdown[dir=rtl] .nav{letter-spacing:.0029em;padding-right:0}.ui-toc-dropdown a{overflow:hidden;text-overflow:ellipsis;white-space:pre}.ui-toc-dropdown .nav>li>a{color:#767676;display:block;font-size:13px;font-weight:500;padding:4px 20px}.ui-toc-dropdown .nav>li:first-child:last-child>ul,.ui-toc-dropdown .toc.expand ul{display:block}.ui-toc-dropdown .nav>li>a:focus,.ui-toc-dropdown .nav>li>a:hover{background-color:initial;border-left:1px solid #000;color:#000;padding-left:19px;text-decoration:none}.ui-toc-dropdown[dir=rtl] .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav>li>a:hover{border-left:none;border-right:1px solid #000;padding-right:19px}.ui-toc-dropdown .nav>.active:focus>a,.ui-toc-dropdown .nav>.active:hover>a,.ui-toc-dropdown .nav>.active>a{background-color:initial;border-left:2px solid #000;color:#000;font-weight:700;padding-left:18px}.ui-toc-dropdown[dir=rtl] .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav>.active>a{border-left:none;border-right:2px solid #000;padding-right:18px}.ui-toc-dropdown .nav .nav{display:none;padding-bottom:10px}.ui-toc-dropdown .nav>.active>ul{display:block}.ui-toc-dropdown .nav .nav>li>a{font-size:12px;font-weight:400;padding-bottom:1px;padding-left:30px;padding-top:1px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a{padding-right:30px}.ui-toc-dropdown .nav .nav>li>ul>li>a{font-size:12px;font-weight:400;padding-bottom:1px;padding-left:40px;padding-top:1px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a{padding-right:40px}.ui-toc-dropdown .nav .nav>li>a:focus,.ui-toc-dropdown .nav .nav>li>a:hover{padding-left:29px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:hover{padding-right:29px}.ui-toc-dropdown .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown .nav .nav>li>ul>li>a:hover{padding-left:39px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:hover{padding-right:39px}.ui-toc-dropdown .nav .nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>a{font-weight:500;padding-left:28px}.ui-toc-dropdown[dir=rtl] .nav .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>a{padding-right:28px}.ui-toc-dropdown .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active>a{font-weight:500;padding-left:38px}.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active>a{padding-right:38px}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html[lang^=ja] .markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,ＭＳ ゴシック,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html[lang=zh-tw] .markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html[lang=zh-cn] .markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html .markdown-body[lang^=ja]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,ＭＳ ゴシック,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html .markdown-body[lang=zh-tw]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html .markdown-body[lang=zh-cn]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html[lang^=ja] .ui-toc-dropdown{font-family:Source Sans Pro,Helvetica,Arial,Meiryo UI,MS PGothic,ＭＳ Ｐゴシック,sans-serif}html[lang=zh-tw] .ui-toc-dropdown{font-family:Source Sans Pro,Helvetica,Arial,Microsoft JhengHei UI,微軟正黑UI,sans-serif}html[lang=zh-cn] .ui-toc-dropdown{font-family:Source Sans Pro,Helvetica,Arial,Microsoft YaHei UI,微软雅黑UI,sans-serif}html .ui-toc-dropdown[lang^=ja]{font-family:Source Sans Pro,Helvetica,Arial,Meiryo UI,MS PGothic,ＭＳ Ｐゴシック,sans-serif}html .ui-toc-dropdown[lang=zh-tw]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft JhengHei UI,微軟正黑UI,sans-serif}html .ui-toc-dropdown[lang=zh-cn]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft YaHei UI,微软雅黑UI,sans-serif}.ui-affix-toc{max-height:70vh;max-width:15vw;overflow:auto;position:fixed;top:0}.back-to-top,.expand-toggle,.go-to-bottom{color:#999;display:block;font-size:12px;font-weight:500;margin-left:10px;margin-top:10px;padding:4px 10px}.back-to-top:focus,.back-to-top:hover,.expand-toggle:focus,.expand-toggle:hover,.go-to-bottom:focus,.go-to-bottom:hover{color:#563d7c;text-decoration:none}.back-to-top,.go-to-bottom{margin-top:0}.ui-user-icon{background-position:50%;background-repeat:no-repeat;background-size:cover;border-radius:50%;display:block;height:20px;margin-bottom:2px;margin-right:5px;margin-top:2px;width:20px}.ui-user-icon.small{display:inline-block;height:18px;margin:0 0 .2em;vertical-align:middle;width:18px}.ui-infobar>small>span{line-height:22px}.ui-infobar>small .dropdown{display:inline-block}.ui-infobar>small .dropdown a:focus,.ui-infobar>small .dropdown a:hover{text-decoration:none}.ui-more-info{color:#888;cursor:pointer;vertical-align:middle}.ui-more-info .fa{font-size:16px}.ui-connectedGithub,.ui-published-note{color:#888}.ui-connectedGithub{line-height:23px;white-space:nowrap}.ui-connectedGithub a.file-path{color:#888;padding-left:22px;text-decoration:none}.ui-connectedGithub a.file-path:active,.ui-connectedGithub a.file-path:hover{color:#888;text-decoration:underline}.ui-connectedGithub .fa{font-size:20px}.ui-published-note .fa{font-size:20px;vertical-align:top}.unselectable{-webkit-user-select:none;-o-user-select:none;user-select:none}.selectable{-webkit-user-select:text;-o-user-select:text;user-select:text}.inline-spoiler-section{cursor:pointer}.inline-spoiler-section .spoiler-text{background-color:#333;border-radius:2px}.inline-spoiler-section .spoiler-text>*{opacity:0}.inline-spoiler-section .spoiler-img{filter:blur(10px)}.inline-spoiler-section.raw{background-color:#333;border-radius:2px}.inline-spoiler-section.raw>*{opacity:0}.inline-spoiler-section.unveil{cursor:auto}.inline-spoiler-section.unveil .spoiler-text{background-color:#3333331a}.inline-spoiler-section.unveil .spoiler-text>*{opacity:1}.inline-spoiler-section.unveil .spoiler-img{filter:none}@media print{blockquote,div,img,pre,table{page-break-inside:avoid!important}a[href]:after{font-size:12px!important}}.markdown-body.slides{color:#222;position:relative;z-index:1}.markdown-body.slides:before{background-color:currentColor;bottom:0;box-shadow:0 0 0 50vw;content:"";display:block;left:0;position:absolute;right:0;top:0;z-index:-1}.markdown-body.slides section[data-markdown]{background-color:#fff;margin-bottom:1.5em;position:relative;text-align:center}.markdown-body.slides section[data-markdown] code{text-align:left}.markdown-body.slides section[data-markdown]:before{content:"";display:block;padding-bottom:56.23%}.markdown-body.slides section[data-markdown]>div:first-child{left:1em;max-height:100%;overflow:hidden;position:absolute;right:1em;top:50%;transform:translateY(-50%)}.markdown-body.slides section[data-markdown]>ul{display:inline-block}.markdown-body.slides>section>section+section:after{border:3px solid #777;content:"";height:1.5em;position:absolute;right:1em;top:-1.5em}.site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,sans-serif}html[lang^=ja] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,ＭＳ ゴシック,sans-serif}html[lang=zh-tw] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif}html[lang=zh-cn] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif}body{font-smoothing:subpixel-antialiased!important;-webkit-font-smoothing:subpixel-antialiased!important;-moz-osx-font-smoothing:auto!important;-webkit-overflow-scrolling:touch;font-family:Source Sans Pro,Helvetica,Arial,sans-serif;letter-spacing:.025em}html[lang^=ja] body{font-family:Source Sans Pro,Helvetica,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,ＭＳ ゴシック,sans-serif}html[lang=zh-tw] body{font-family:Source Sans Pro,Helvetica,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif}html[lang=zh-cn] body{font-family:Source Sans Pro,Helvetica,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}abbr[data-original-title],abbr[title]{cursor:help}body.modal-open{overflow-y:auto;padding-right:0!important}svg{text-shadow:none}
    </style>
    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" integrity="sha256-3Jy/GbSLrg0o9y5Z5n1uw0qxZECH7C6OQpVBgNFYa0g=" crossorigin="anonymous"></script>
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js" integrity="sha256-g6iAfvZp+nDQ2TdTR/VVKJf3bGro4ub5fvWSWVRi2NE=" crossorigin="anonymous"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-shim.min.js" integrity="sha256-8E4Is26QH0bD52WoQpcB+R/tcWQtpzlCojrybUd7Mxo=" crossorigin="anonymous"></script>
    <![endif]-->
</head>

<body>
    <div id="doc" class="markdown-body container-fluid comment-enabled" data-hard-breaks="false"><style>
ins { background-color: #CCFFCC }
s { background-color: #FFCACA }
blockquote { color: inherit !important }
</style><table>
<tbody><tr>
<td>Document number</td>
<td>P2955R0</td>
</tr>
<tr>
<td>Date</td>
<td>2023-8-4</td>
</tr>
<tr>
<td>Reply-to</td>
<td>
<p><span>Jarrad J. Waterloo &lt;descender76 at gmail dot com&gt;</span></p>
</td>
</tr>
<tr>
<td>Audience</td>
<td>SG23 Safety and Security</td>
</tr>
</tbody></table><h1 id="Safer-Range-Access" data-id="Safer-Range-Access"><a class="anchor hidden-xs" href="#Safer-Range-Access" title="Safer-Range-Access"><span class="octicon octicon-link"></span></a><span>Safer Range Access</span></h1><style>
.inline-link
{
    font-size: small;
    margin-top: -2.8em;
    margin-right: 4px;
    text-align: right;
    font-weight: bold;
}

code
{
    font-family: "Fira Code", monospace !important;
    font-size: 0.87em;
}

.sourceCode
{
    font-size: 0.95em;
}

a code
{
    color: #0645ad;
}
</style><h2 id="Table-of-contents" data-id="Table-of-contents"><a class="anchor hidden-xs" href="#Table-of-contents" title="Table-of-contents"><span class="octicon octicon-link"></span></a><span>Table of contents</span></h2><ul>
<li><a href="#Safer-Range-Access"><span>Safer Range Access</span></a>
<ul>
<li><a href="#Abstract"><span>Abstract</span></a></li>
<li><a href="#Technical-Details"><span>Technical Details</span></a>
<ul>
<li><a href="#The-common-challenges"><span>The common challenges</span></a></li>
<li><a href="#The-common-safe-member-functions"><span>The common safe member functions</span></a></li>
<li><a href="#The-common-safe-free-functions"><span>The common safe free functions</span></a></li>
</ul>
</li>
<li><a href="#Optional-Design-Considerations"><span>Optional Design Considerations</span></a></li>
<li><a href="#Example"><span>Example</span></a></li>
<li><a href="#Resolution"><span>Resolution</span></a></li>
<li><a href="#Summary"><span>Summary</span></a></li>
<li><a href="#Frequently-Asked-Questions"><span>Frequently Asked Questions</span></a>
<ul>
<li><a href="#Why-not-just-wait-for-contracts"><span>Why not just wait for contracts</span></a></li>
</ul>
</li>
<li><a href="#References"><span>References</span></a></li>
</ul>
</li>
</ul><h2 id="Abstract" data-id="Abstract"><a class="anchor hidden-xs" href="#Abstract" title="Abstract"><span class="octicon octicon-link"></span></a><span>Abstract</span></h2><p><span>Currently the element access of </span><code>std::array</code><span>, </span><code>std::deque</code><span>, </span><code>std::span</code><span>, </span><code>std::string</code><span>, </span><code>std::string_view</code><span>, </span><code>std::vector</code><span> is not as safe as it could be. While the </span><code>at</code><span> member functions are checked for range access errors, the </span><code>operator[]</code><span>, </span><code>front</code><span> and </span><code>back</code><span> are not checked. That means the majority of the element access is unchecked. Further, even though the rarely used </span><code>at</code><span> is checked, like the others, it returns a reference which, besides exposing implementation details, can lead to dangling and reference invalidation errors.</span></p><p><span>This paper proposes that we provide programmers with functions that have value semantics in order to not only mitigate range access errors but also to reduce the dangling and reference invalidation errors.</span></p><h2 id="Technical-Details" data-id="Technical-Details"><a class="anchor hidden-xs" href="#Technical-Details" title="Technical-Details"><span class="octicon octicon-link"></span></a><span>Technical Details</span></h2><p><span>Feel free to jump to the end for the </span><a href="#Example"><span>example</span></a><span> code.</span></p><p><span>These technical details will focus on </span><code>vector</code><span> but everything can be easily applied to the other containers and views with range based access. The first method to be added is a </span><code>test</code><span> function since only a given implementation can say whether an index is valid.</span></p><pre><code class="cpp hljs"><span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">bool</span> <span class="token function">test</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
</code></pre><p><span>The next two methods requested for addition are actually </span><code>unsafe</code><span>. Though </span><code>unsafe</code><span>, these will be the foundation for which all of the </span><code>safe</code><span> functions will be built upon.</span></p><pre><code class="cpp hljs"><span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token function">unsafe</span><span class="token punctuation">(</span>reason<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"range"</span><span class="token punctuation">,</span> <span class="token string">"dangling_reference"</span><span class="token punctuation">,</span> <span class="token string">"reference_invalidation"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> reference <span class="token function">get_reference</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token function">unsafe</span><span class="token punctuation">(</span>reason<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"range"</span><span class="token punctuation">,</span> <span class="token string">"dangling_reference"</span><span class="token punctuation">,</span> <span class="token string">"reference_invalidation"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> const_reference <span class="token function">get_reference</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><span>It should be noted that these functions are just as </span><code>unsafe</code><span> as the current subscript operators. The difference is while the subscript operators has undefined unsafety, the proposed </span><code>get_reference</code><span> deliberately perform no checks as the checks will be performed either by the programmer or by </span><code>safe</code><span> functions that call these </span><code>unsafe</code><span> ones. This way when </span><code>contracts</code><span> arrive and when the undefined behavior is changed to defined behavior, the </span><code>safe</code><span> functions won’t be performing an additional superfluous test.</span></p><pre><code class="cpp hljs"><span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token function">unsafe</span><span class="token punctuation">(</span>reason<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"range"</span><span class="token punctuation">,</span> <span class="token string">"dangling_reference"</span><span class="token punctuation">,</span> <span class="token string">"reference_invalidation"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token function">unsafe</span><span class="token punctuation">(</span>reason<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"range"</span><span class="token punctuation">,</span> <span class="token string">"dangling_reference"</span><span class="token punctuation">,</span> <span class="token string">"reference_invalidation"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> const_reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
<span class="token comment">// ...</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token function">unsafe</span><span class="token punctuation">(</span>reason<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"dangling_reference"</span><span class="token punctuation">,</span> <span class="token string">"reference_invalidation"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> reference <span class="token function">at</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token function">unsafe</span><span class="token punctuation">(</span>reason<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"dangling_reference"</span><span class="token punctuation">,</span> <span class="token string">"reference_invalidation"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> const_reference <span class="token function">at</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
</code></pre><h3 id="The-common-challenges" data-id="The-common-challenges"><a class="anchor hidden-xs" href="#The-common-challenges" title="The-common-challenges"><span class="octicon octicon-link"></span></a><span>The common challenges</span></h3><ol>
<li><code>C++</code><span>'s subscript operators tend to have reference semantics instead of value semantics because our language does not have seperate operators for getting and setting values.</span>
<ol>
<li><code>C++</code><span>'s subscript operators does not support additional parameters such as </span><code>std::source_location</code><span> which are not part of the indexer.</span></li>
</ol>
</li>
<li><code>std::optional</code><span>, </span><code>std::variant</code><span> and </span><code>std::expected</code><span> does not support references</span></li>
</ol><p><span>Consequently, this proposal just use functions instead of any operators and transient proxy classes. While I prefer </span><code>deducing this</code><span> </span><sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup><span> style member functions since these won’t be overloaded, as most compilers currently do not support such feature, the examples will be regular member functions.</span></p><h3 id="The-common-safe-member-functions" data-id="The-common-safe-member-functions"><a class="anchor hidden-xs" href="#The-common-safe-member-functions" title="The-common-safe-member-functions"><span class="octicon octicon-link"></span></a><span>The common safe member functions</span></h3><p><span>Following are the function names of all the requested member functions. They are represented in table fashion to better illustrate the relationships between all of these variants of getters and setters.</span></p><ol>
<li><code>operator[]</code><span>/</span><code>at</code><span>, </span><code>front</code><span> and </span><code>back</code><span> get seperate getter and setter functions that take and return values.</span></li>
<li><span>The getter and setter variants gets multiplied by how programmers handle errors.</span>
<ul>
<li><span>throw exception</span></li>
<li><span>return default</span></li>
<li><span>return optional</span></li>
<li><span>terminate</span></li>
<li><span>do nothing i.e. void i.e. crop</span></li>
<li><span>grow</span></li>
</ul>
</li>
</ol><table>
<tbody><tr>
<th></th>
<th></th>
<th>front</th>
<th>back</th>
</tr>
<tr>
<th rowspan="3">get</th>
<td>get_value</td>
<td>get_front_value</td>
<td>get_back_value</td>
</tr>
<tr>
<td>get_optional</td>
<td>get_front_optional</td>
<td>get_back_optional</td>
</tr>
<tr>
<td>get_or_terminate</td>
<td>get_front_or_terminate</td>
<td>get_back_or_terminate</td>
</tr>
<tr>
<th rowspan="4">set</th>
<td>set_value</td>
<td>set_front_value</td>
<td>set_back_value</td>
</tr>
<tr>
<td>set_or_terminate</td>
<td>set_front_or_terminate</td>
<td>set_back_or_terminate</td>
</tr>
<tr>
<td>set_and_crop</td>
<td>set_front_and_crop</td>
<td>set_back_and_crop</td>
</tr>
<tr>
<td>set_and_grow</td>
<td>set_front_and_grow</td>
<td>set_back_and_grow</td>
</tr>
</tbody></table><p><span>Returning references don’t just allow the programmer to get and set the whole value but also modify a part of the indexed value or call some member function. In order to preserve that capability, the previous get/set table gets duplicated with a transform/visit versions. Like the value based get’s above, the transform member functions returns a subset of the index value as a value using a transformer object. Like the value based set’s above, the visit member functions are safe because they deal with values and always return void instead of a reference. Its provided copier objects performs a programmer decided action to the indexed value.</span></p><table>
<tbody><tr>
<th></th>
<th></th>
<th>front</th>
<th>back</th>
</tr>
<tr>
<th rowspan="3">transform</th>
<td>transform_value</td>
<td>transform_front_value</td>
<td>transform_back_value</td>
</tr>
<tr>
<td>transform_optional</td>
<td>transform_front_optional</td>
<td>transform_back_optional</td>
</tr>
<tr>
<td>transform_or_terminate</td>
<td>transform_front_or_terminate</td>
<td>transform_back_or_terminate</td>
</tr>
<tr>
<th rowspan="4">visit</th>
<td>visit_value</td>
<td>visit_front_value</td>
<td>visit_back_value</td>
</tr>
<tr>
<td>visit_or_terminate</td>
<td>visit_front_or_terminate</td>
<td>visit_back_or_terminate</td>
</tr>
<tr>
<td>visit_and_crop</td>
<td>visit_front_and_crop</td>
<td>visit_back_and_crop</td>
</tr>
<tr>
<td>visit_and_grow</td>
<td>visit_front_and_grow</td>
<td>visit_back_and_grow</td>
</tr>
</tbody></table><p><span>It would be preferable that all of these member functions in these two tables were actually free functions, if and only if we get the </span><code>pipe redirect operator</code><span> </span><sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup><span> </span><sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup><span>. This would save on have to specify all of the functions repeatedly on the </span><code>std::array</code><span>, </span><code>std::deque</code><span>, </span><code>std::span</code><span>, </span><code>std::string</code><span>, </span><code>std::string_view</code><span>, </span><code>std::vector</code><span> classes. The complete list of these member functions from the perspective of </span><code>std::vector</code><span> follows.</span></p><pre><code class="cpp hljs"><span class="token comment">// at and operator[] replacements</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> value_type <span class="token function">get_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> value_type <span class="token function">get_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">auto</span><span class="token operator">&amp;</span> default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span>value_type<span class="token operator">&gt;</span> <span class="token function">get_optional</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_optional</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> value_type <span class="token function">get_or_terminate</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_or_terminate</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_or_terminate</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_or_terminate</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_and_crop</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference value <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_and_crop</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_and_grow</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference value <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_and_grow</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_and_grow</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference value<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_and_grow</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// front replacements</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> value_type <span class="token function">get_front_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_front_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> value_type <span class="token function">get_front_value</span><span class="token punctuation">(</span> const_reference default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_front_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">auto</span><span class="token operator">&amp;</span> default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span>value_type<span class="token operator">&gt;</span> <span class="token function">get_front_optional</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_front_optional</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> value_type <span class="token function">get_front_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_front_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_front_value</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_front_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_front_or_terminate</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_front_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_front_and_crop</span><span class="token punctuation">(</span> const_reference value <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_front_and_crop</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_front_and_grow</span><span class="token punctuation">(</span> const_reference value <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_front_and_grow</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_front_and_grow</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_front_and_grow</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// back replacements</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> value_type <span class="token function">get_back_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_back_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> value_type <span class="token function">get_back_value</span><span class="token punctuation">(</span> const_reference default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_back_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">auto</span><span class="token operator">&amp;</span> default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span>value_type<span class="token operator">&gt;</span> <span class="token function">get_back_optional</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_back_optional</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> value_type <span class="token function">get_back_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_back_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_back_value</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_back_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_back_or_terminate</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_back_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_back_and_crop</span><span class="token punctuation">(</span> const_reference value <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_back_and_crop</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_back_and_grow</span><span class="token punctuation">(</span> const_reference value <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_back_and_grow</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_back_and_grow</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_back_and_grow</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><h3 id="The-common-safe-free-functions" data-id="The-common-safe-free-functions"><a class="anchor hidden-xs" href="#The-common-safe-free-functions" title="The-common-safe-free-functions"><span class="octicon octicon-link"></span></a><span>The common safe free functions</span></h3><p><span>Besides these member functions are a couple of safe free functions.</span></p><pre data-original-title="" title=""><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">copy_and_crop</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>span<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> destination<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>size_t pos<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>span<span class="token operator">&lt;</span><span class="token keyword">const</span> T<span class="token operator">&gt;</span> source <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">copy_and_grow</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token operator">&amp;</span> destination<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>size_t pos<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>span<span class="token operator">&lt;</span><span class="token keyword">const</span> T<span class="token operator">&gt;</span> source <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><span>Besides being safe for not returning a reference, these two functions perform batch copies, reducing the number of individual checks that have to be performed. Both batch copy a source span to a destination range based collection or view. In the case of </span><code>copy_and_crop</code><span>, any elements that are outside the range of the destination do not get copied. In the case of </span><code>copy_and_grow</code><span>, the destination range based collection grows to accommodate the elements of the source span that exceeds the destinations current bounds. These two functions are analogous to combining two dimensional arrays such as images.</span></p><h2 id="Optional-Design-Considerations" data-id="Optional-Design-Considerations"><a class="anchor hidden-xs" href="#Optional-Design-Considerations" title="Optional-Design-Considerations"><span class="octicon octicon-link"></span></a><span>Optional Design Considerations</span></h2><p><span>One of the criticisms of the checked </span><code>at</code><span> methods is that the </span><code>out_of_range</code><span> and other exceptions implies a dynamic allocation upon construction of the exception with a custom descriptive message.</span></p><p><span>This issue could be resolved by adding a new </span><code>virtual</code><span> </span><code>what</code><span> method to </span><code>std::exception</code><span> that instead of returning a </span><code>const char *</code><span>, rather it takes and returns a </span><code>std::ostream</code><span>.</span></p><pre><code class="cpp hljs"><span class="token keyword">class</span> <span class="token class-name">exception</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">virtual</span> <span class="token keyword">public</span> std<span class="token double-colon punctuation">::</span><span class="token class-name">exception</span></span> <span class="token punctuation">{</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token keyword">virtual</span> std<span class="token double-colon punctuation">::</span>ostream<span class="token operator">&amp;</span> <span class="token function">what</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>ostream<span class="token operator">&amp;</span> os<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> os <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>exception<span class="token double-colon punctuation">::</span><span class="token function">what</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
</code></pre><p><span>New </span><code>out_of_range</code><span> exceptions could be created that don’t initially take a </span><code>std::string</code><span>.</span></p><pre><code class="cpp hljs"><span class="token keyword">class</span> <span class="token class-name">logic_error_v2</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">virtual</span> <span class="token keyword">public</span> std<span class="token double-colon punctuation">::</span><span class="token class-name">exception</span></span> <span class="token punctuation">{</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">class</span> <span class="token class-name">out_of_range_v2</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">virtual</span> <span class="token keyword">public</span> <span class="token class-name">logic_error_v2</span></span> <span class="token punctuation">{</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token operator">&gt;</span>
<span class="token keyword">class</span> <span class="token class-name">out_of_range_v2_1</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">virtual</span> <span class="token keyword">public</span> <span class="token class-name">out_of_range_v2</span></span> <span class="token punctuation">{</span>
<span class="token keyword">private</span><span class="token operator">:</span>
    <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type pos<span class="token punctuation">;</span>
    <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location<span class="token punctuation">;</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token function">out_of_range_v2_1</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location<span class="token punctuation">)</span> <span class="token operator">:</span> pos<span class="token punctuation">{</span>pos<span class="token punctuation">}</span><span class="token punctuation">,</span> location<span class="token punctuation">{</span>location<span class="token punctuation">}</span>
    <span class="token punctuation">{</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">virtual</span> std<span class="token double-colon punctuation">::</span>ostream<span class="token operator">&amp;</span> <span class="token function">what</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>ostream<span class="token operator">&amp;</span> os<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span> <span class="token keyword">override</span>
    <span class="token punctuation">{</span>
        <span class="token comment">//os &lt;&lt; this-&gt;what();</span>
        <span class="token keyword">return</span> os <span class="token operator">&lt;&lt;</span> <span class="token string">"file: "</span>
            <span class="token operator">&lt;&lt;</span> location<span class="token punctuation">.</span><span class="token function">file_name</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token char">'('</span>
            <span class="token operator">&lt;&lt;</span> location<span class="token punctuation">.</span><span class="token function">line</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token char">':'</span>
            <span class="token operator">&lt;&lt;</span> location<span class="token punctuation">.</span><span class="token function">column</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token string">") `"</span>
            <span class="token operator">&lt;&lt;</span> location<span class="token punctuation">.</span><span class="token function">function_name</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token string">"`: "</span>
            <span class="token operator">&lt;&lt;</span> <span class="token string">"invalid index: "</span> <span class="token operator">&lt;&lt;</span> pos <span class="token operator">&lt;&lt;</span> <span class="token char">'\n'</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
</code></pre><p><span>This delays creation of the error message to point of use instead of exception creation. While getting the message into a </span><code>std::string</code><span> is still possible with </span><code>std::stringstream</code><span>, the end result is no dynamic allocation for </span><code>std::string</code><span> needs be created, if it was logged instead or sent to a static buffer.</span></p><h2 id="Example" data-id="Example"><a class="anchor hidden-xs" href="#Example" title="Example"><span class="octicon octicon-link"></span></a><span>Example</span></h2><pre><code class="cpp hljs"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;string&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;vector&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;iostream&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;source_location&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;optional&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;algorithm&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;span&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;cassert&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;sstream&gt;</span></span>

<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token double-colon punctuation">::</span>literals<span class="token double-colon punctuation">::</span>string_literals<span class="token punctuation">;</span>

<span class="token keyword">class</span> <span class="token class-name">exception_v2</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">virtual</span> <span class="token keyword">public</span> std<span class="token double-colon punctuation">::</span><span class="token class-name">exception</span></span> <span class="token punctuation">{</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token keyword">virtual</span> std<span class="token double-colon punctuation">::</span>ostream<span class="token operator">&amp;</span> <span class="token function">what</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>ostream<span class="token operator">&amp;</span> os<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> os <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>exception<span class="token double-colon punctuation">::</span><span class="token function">what</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">class</span> <span class="token class-name">logic_error_v2</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">virtual</span> <span class="token keyword">public</span> <span class="token class-name">exception_v2</span></span> <span class="token punctuation">{</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">class</span> <span class="token class-name">out_of_range_v2</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">virtual</span> <span class="token keyword">public</span> <span class="token class-name">logic_error_v2</span></span> <span class="token punctuation">{</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token operator">&gt;</span>
<span class="token keyword">class</span> <span class="token class-name">out_of_range_v2_1</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">virtual</span> <span class="token keyword">public</span> <span class="token class-name">out_of_range_v2</span></span> <span class="token punctuation">{</span>
<span class="token keyword">private</span><span class="token operator">:</span>
    <span class="token keyword">const</span> T pos<span class="token punctuation">;</span>
    <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location<span class="token punctuation">;</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token function">out_of_range_v2_1</span><span class="token punctuation">(</span><span class="token keyword">const</span> T pos<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location<span class="token punctuation">)</span> <span class="token operator">:</span> pos<span class="token punctuation">{</span>pos<span class="token punctuation">}</span><span class="token punctuation">,</span> location<span class="token punctuation">{</span>location<span class="token punctuation">}</span>
    <span class="token punctuation">{</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">virtual</span> std<span class="token double-colon punctuation">::</span>ostream<span class="token operator">&amp;</span> <span class="token function">what</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>ostream<span class="token operator">&amp;</span> os<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span> <span class="token keyword">override</span>
    <span class="token punctuation">{</span>
        <span class="token comment">//os &lt;&lt; this-&gt;what();</span>
        <span class="token keyword">return</span> os <span class="token operator">&lt;&lt;</span> <span class="token string">"file: "</span>
            <span class="token operator">&lt;&lt;</span> location<span class="token punctuation">.</span><span class="token function">file_name</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token char">'('</span>
            <span class="token operator">&lt;&lt;</span> location<span class="token punctuation">.</span><span class="token function">line</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token char">':'</span>
            <span class="token operator">&lt;&lt;</span> location<span class="token punctuation">.</span><span class="token function">column</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token string">") `"</span>
            <span class="token operator">&lt;&lt;</span> location<span class="token punctuation">.</span><span class="token function">function_name</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token string">"`: "</span>
            <span class="token operator">&lt;&lt;</span> <span class="token string">"invalid index: "</span> <span class="token operator">&lt;&lt;</span> pos <span class="token operator">&lt;&lt;</span> <span class="token char">'\n'</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>


<span class="token comment">// currently 12 unsafe element access methods</span>
<span class="token comment">// proposed  14 unsafe element access methods, 56 safe element access methods/functions</span>
<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token operator">&gt;</span>
<span class="token keyword">class</span> <span class="token class-name">my_vector</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">public</span> std<span class="token double-colon punctuation">::</span><span class="token class-name">vector</span><span class="token operator">&lt;</span><span class="token class-name">T</span><span class="token operator">&gt;</span></span> <span class="token punctuation">{</span>
<span class="token keyword">private</span><span class="token operator">:</span>
<span class="token comment">/*
    static std::string to_string(const std::vector&lt;T&gt;::size_type pos, const std::source_location location)
    {
        std::stringstream ss;
        ss &lt;&lt; "file: "
            &lt;&lt; location.file_name() &lt;&lt; '('
            &lt;&lt; location.line() &lt;&lt; ':'
            &lt;&lt; location.column() &lt;&lt; ") `"
            &lt;&lt; location.function_name() &lt;&lt; "`: "
            &lt;&lt; "invalid index: " &lt;&lt; pos &lt;&lt; '\n';
        return ss.str();
    }
*/</span>
    <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token comment">/*
        std::clog &lt;&lt; "file: "
            &lt;&lt; location.file_name() &lt;&lt; '('
            &lt;&lt; location.line() &lt;&lt; ':'
            &lt;&lt; location.column() &lt;&lt; ") `"
            &lt;&lt; location.function_name() &lt;&lt; "`: "
            &lt;&lt; "invalid index: " &lt;&lt; pos &lt;&lt; '\n';
        */</span>
        out_of_range_v2_1<span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span> oor<span class="token punctuation">{</span>pos<span class="token punctuation">,</span> location<span class="token punctuation">}</span><span class="token punctuation">;</span>
        oor<span class="token punctuation">.</span><span class="token function">what</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>clog<span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token char">'\n'</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token keyword">using</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>vector<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>value_type value_type<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type size_type<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>reference reference<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>const_reference const_reference<span class="token punctuation">;</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">bool</span> <span class="token function">test</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> pos <span class="token operator">&lt;</span> <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[unsafe]]</span>
    <span class="token keyword">constexpr</span> reference <span class="token function">get_reference</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token operator">*</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">[</span>pos<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[unsafe]]</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token function">get_reference</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token operator">*</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">[</span>pos<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// at and operator[] replacements</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> value_type <span class="token function">get_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(pos, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>pos<span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(pos, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>pos<span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> value_type <span class="token function">get_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> default_value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">auto</span><span class="token operator">&amp;</span> default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> default_value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span>value_type<span class="token operator">&gt;</span> <span class="token function">get_optional</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span>value_type<span class="token operator">&gt;</span><span class="token punctuation">{</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>nullopt<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_optional</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span><span class="token keyword">decltype</span><span class="token punctuation">(</span><span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token punctuation">{</span><span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span><span class="token keyword">decltype</span><span class="token punctuation">(</span><span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> value_type <span class="token function">get_or_terminate</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span>pos<span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_or_terminate</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span>pos<span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(pos, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>pos<span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_value</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(pos, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>pos<span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_or_terminate</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span>pos<span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_or_terminate</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span>pos<span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">// https://en.wikipedia.org/wiki/Cropping_(image)</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_and_crop</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference value <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_and_crop</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">test</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_and_grow</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference value <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> pos <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_and_grow</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> pos <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_and_grow</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> const_reference value<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> pos <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> default_value<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_and_grow</span><span class="token punctuation">(</span> size_type pos<span class="token punctuation">,</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> pos <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> default_value<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// front replacements</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> value_type <span class="token function">get_front_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(0, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_front_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(0, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> value_type <span class="token function">get_front_value</span><span class="token punctuation">(</span> const_reference default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> default_value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_front_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">auto</span><span class="token operator">&amp;</span> default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> default_value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span>value_type<span class="token operator">&gt;</span> <span class="token function">get_front_optional</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>nullopt<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span>value_type<span class="token operator">&gt;</span><span class="token punctuation">{</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_front_optional</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span><span class="token keyword">decltype</span><span class="token punctuation">(</span><span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span><span class="token keyword">decltype</span><span class="token punctuation">(</span><span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token punctuation">{</span><span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> value_type <span class="token function">get_front_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_front_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_front_value</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(0, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_front_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(0, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_front_or_terminate</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_front_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">// https://en.wikipedia.org/wiki/Cropping_(image)</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_front_and_crop</span><span class="token punctuation">(</span> const_reference value <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_front_and_crop</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_front_and_grow</span><span class="token punctuation">(</span> const_reference value <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1ul</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_front_and_grow</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1ul</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_front_and_grow</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1ul</span><span class="token punctuation">)</span><span class="token punctuation">,</span> default_value<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_front_and_grow</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1ul</span><span class="token punctuation">)</span><span class="token punctuation">,</span> default_value<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// back replacements</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> value_type <span class="token function">get_back_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(0, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_back_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(0, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> value_type <span class="token function">get_back_value</span><span class="token punctuation">(</span> const_reference default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> default_value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_back_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">auto</span><span class="token operator">&amp;</span> default_value <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> default_value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span>value_type<span class="token operator">&gt;</span> <span class="token function">get_back_optional</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>nullopt<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span>value_type<span class="token operator">&gt;</span><span class="token punctuation">{</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_back_optional</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span><span class="token keyword">decltype</span><span class="token punctuation">(</span><span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span><span class="token keyword">decltype</span><span class="token punctuation">(</span><span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token punctuation">{</span><span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> value_type <span class="token function">get_back_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">auto</span> <span class="token function">transform_back_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> transformer<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">transformer</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_back_value</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(0, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_back_value</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token comment">//throw std::out_of_range(to_string(0, location));</span>
            <span class="token keyword">throw</span> <span class="token generic-function"><span class="token function">out_of_range_v2_1</span><span class="token generic class-name"><span class="token operator">&lt;</span>size_type<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_back_or_terminate</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_back_or_terminate</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>source_location location <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>source_location<span class="token double-colon punctuation">::</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">log</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> location<span class="token punctuation">)</span><span class="token punctuation">;</span>
            std<span class="token double-colon punctuation">::</span><span class="token function">terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">else</span>
        <span class="token punctuation">{</span>
            <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">// https://en.wikipedia.org/wiki/Cropping_(image)</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_back_and_crop</span><span class="token punctuation">(</span> const_reference value <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_back_and_crop</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_back_and_grow</span><span class="token punctuation">(</span> const_reference value <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1ul</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_back_and_grow</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1ul</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">set_back_and_grow</span><span class="token punctuation">(</span> const_reference value<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1ul</span><span class="token punctuation">)</span><span class="token punctuation">,</span> default_value<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">F</span><span class="token operator">&gt;</span>
    <span class="token comment">//[[safe]]</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">visit_back_and_grow</span><span class="token punctuation">(</span> <span class="token keyword">const</span> F<span class="token operator">&amp;</span> copier<span class="token punctuation">,</span> const_reference default_value <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1ul</span><span class="token punctuation">)</span><span class="token punctuation">,</span> default_value<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">copier</span><span class="token punctuation">(</span><span class="token function">get_reference</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">-&gt;</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">copy_and_crop</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>span<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> destination<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>size_t pos<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>span<span class="token operator">&lt;</span><span class="token keyword">const</span> T<span class="token operator">&gt;</span> source <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
<span class="token punctuation">{</span>
    std<span class="token double-colon punctuation">::</span>size_t dsize <span class="token operator">=</span> destination<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>pos <span class="token operator">&lt;</span> dsize<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        std<span class="token double-colon punctuation">::</span>size_t length <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">min</span><span class="token punctuation">(</span>dsize <span class="token operator">-</span> pos<span class="token punctuation">,</span> source<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        std<span class="token double-colon punctuation">::</span><span class="token function">copy_n</span><span class="token punctuation">(</span>source<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> length<span class="token punctuation">,</span> destination<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> pos<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">copy_and_grow</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token operator">&amp;</span> destination<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>size_t pos<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>span<span class="token operator">&lt;</span><span class="token keyword">const</span> T<span class="token operator">&gt;</span> source <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
<span class="token punctuation">{</span>
    std<span class="token double-colon punctuation">::</span>size_t ssize <span class="token operator">=</span> source<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    destination<span class="token punctuation">.</span><span class="token function">resize</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">max</span><span class="token punctuation">(</span>destination<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> pos <span class="token operator">+</span> ssize<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    std<span class="token double-colon punctuation">::</span><span class="token function">copy_n</span><span class="token punctuation">(</span>source<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> ssize<span class="token punctuation">,</span> destination<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> pos<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">// gcc, clang: -std=c++2b -O3</span>
<span class="token comment">// msvc:       /std:c++20</span>
<span class="token comment">// shadowing to safety</span>
<span class="token comment">// shadowing enhances safety</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">try</span>
    <span class="token punctuation">{</span>
        my_vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> myints<span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token keyword">bool</span> t <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        t <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token comment">// get whole</span>
        <span class="token keyword">int</span> pv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_value</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token comment">/*5*/</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//throws</span>
        pv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_value</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//default value</span>
        std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> opv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_optional</span><span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        pv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_or_terminate</span><span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

        pv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_front_value</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//throws</span>
        pv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_front_value</span><span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//default value</span>
        opv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_front_optional</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        pv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_front_or_terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        pv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_back_value</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//throws</span>
        pv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_back_value</span><span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//default value</span>
        opv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_back_optional</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        pv <span class="token operator">=</span> myints<span class="token punctuation">.</span><span class="token function">get_back_or_terminate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token comment">// set whole</span>
        myints<span class="token punctuation">.</span><span class="token function">set_value</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//throws</span>
        myints<span class="token punctuation">.</span><span class="token function">set_or_terminate</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        myints<span class="token punctuation">.</span><span class="token function">set_and_crop</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        myints<span class="token punctuation">.</span><span class="token function">set_and_grow</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        myints<span class="token punctuation">.</span><span class="token function">set_and_grow</span><span class="token punctuation">(</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

        myints<span class="token punctuation">.</span><span class="token function">set_front_value</span><span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//throws</span>
        myints<span class="token punctuation">.</span><span class="token function">set_front_or_terminate</span><span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        myints<span class="token punctuation">.</span><span class="token function">set_front_and_crop</span><span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        myints<span class="token punctuation">.</span><span class="token function">set_front_and_grow</span><span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        myints<span class="token punctuation">.</span><span class="token function">set_front_and_grow</span><span class="token punctuation">(</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

        myints<span class="token punctuation">.</span><span class="token function">set_back_value</span><span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//throws</span>
        myints<span class="token punctuation">.</span><span class="token function">set_back_or_terminate</span><span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        myints<span class="token punctuation">.</span><span class="token function">set_back_and_crop</span><span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        myints<span class="token punctuation">.</span><span class="token function">set_back_and_grow</span><span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        myints<span class="token punctuation">.</span><span class="token function">set_back_and_grow</span><span class="token punctuation">(</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

        my_vector<span class="token operator">&lt;</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&gt;</span> mystrings<span class="token punctuation">{</span><span class="token string">"1"</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token keyword">bool</span> ts <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        ts <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">auto</span> s42 <span class="token operator">=</span> <span class="token string">"42"</span>s<span class="token punctuation">;</span>
        <span class="token comment">// get/transform whole or part</span>
        size_t pvi <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_value</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        pvi <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_value</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">42ul</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        std<span class="token double-colon punctuation">::</span>optional<span class="token operator">&lt;</span>size_t<span class="token operator">&gt;</span> opvs <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_optional</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        pvi <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_or_terminate</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

        pvi <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_front_value</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        pvi <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_front_value</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">42ul</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        opvs <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_front_optional</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        pvi <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_front_or_terminate</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

        pvi <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_back_value</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        pvi <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_back_value</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">42ul</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        opvs <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_back_optional</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        pvi <span class="token operator">=</span> mystrings<span class="token punctuation">.</span><span class="token function">transform_back_or_terminate</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> item<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token comment">// set/visit whole or part</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_value</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_or_terminate</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_and_crop</span><span class="token punctuation">(</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_and_grow</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_and_grow</span><span class="token punctuation">(</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"0"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

        mystrings<span class="token punctuation">.</span><span class="token function">visit_front_value</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_front_or_terminate</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_front_and_crop</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_front_and_grow</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_front_and_grow</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"0"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

        mystrings<span class="token punctuation">.</span><span class="token function">visit_back_value</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_back_or_terminate</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_back_and_crop</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_back_and_grow</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        mystrings<span class="token punctuation">.</span><span class="token function">visit_back_and_grow</span><span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token operator">&amp;</span>s42<span class="token punctuation">]</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&amp;</span> item<span class="token punctuation">)</span><span class="token punctuation">{</span>item <span class="token operator">=</span> s42<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"0"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

        std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&gt;</span> destination<span class="token punctuation">{</span><span class="token string">"1"</span><span class="token punctuation">,</span> <span class="token string">"2"</span><span class="token punctuation">,</span> <span class="token string">"3"</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token comment">/*const*/</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&gt;</span> source1<span class="token punctuation">{</span><span class="token string">"3"</span><span class="token punctuation">,</span> <span class="token string">"4"</span><span class="token punctuation">,</span> <span class="token string">"5"</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token comment">/*const*/</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&gt;</span> source2<span class="token punctuation">{</span><span class="token string">"6"</span><span class="token punctuation">,</span> <span class="token string">"7"</span><span class="token punctuation">,</span> <span class="token string">"8"</span><span class="token punctuation">}</span><span class="token punctuation">;</span>

        <span class="token function">copy_and_crop</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>span<span class="token operator">&lt;</span>std<span class="token double-colon punctuation">::</span>string<span class="token operator">&gt;</span><span class="token punctuation">{</span>destination<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>span<span class="token operator">&lt;</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&gt;</span><span class="token punctuation">{</span>source1<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 1, 3, 4</span>
        <span class="token function">copy_and_grow</span><span class="token punctuation">(</span>destination<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>span<span class="token operator">&lt;</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>string<span class="token operator">&gt;</span><span class="token punctuation">{</span>source2<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 1, 3, 6, 7, 8</span>
        <span class="token comment">//static_assert( destination[0] == "1"s );</span>
        <span class="token comment">//static_assert( destination[1] == "3"s );</span>
        <span class="token comment">//static_assert( destination[2] == "6"s );</span>
        <span class="token comment">//static_assert( destination[3] == "7"s );</span>
        <span class="token comment">//static_assert( destination[4] == "8"s );</span>
        <span class="token function">assert</span><span class="token punctuation">(</span> destination<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">5</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">assert</span><span class="token punctuation">(</span> destination<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"1"</span>s <span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">assert</span><span class="token punctuation">(</span> destination<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"3"</span>s <span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">assert</span><span class="token punctuation">(</span> destination<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"6"</span>s <span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">assert</span><span class="token punctuation">(</span> destination<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"7"</span>s <span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">assert</span><span class="token punctuation">(</span> destination<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"8"</span>s <span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//catch(const std::out_of_range&amp; oor)</span>
    <span class="token comment">//{</span>
    <span class="token comment">//    std::clog &lt;&lt; oor.what() &lt;&lt; '\n';</span>
    <span class="token comment">//}</span>
    <span class="token keyword">catch</span><span class="token punctuation">(</span><span class="token keyword">const</span> out_of_range_v2_1<span class="token operator">&lt;</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type<span class="token operator">&gt;</span><span class="token operator">&amp;</span> oor<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        std<span class="token double-colon punctuation">::</span>stringstream ss<span class="token punctuation">;</span>
        oor<span class="token punctuation">.</span><span class="token function">what</span><span class="token punctuation">(</span>ss<span class="token punctuation">)</span><span class="token punctuation">;</span>
        std<span class="token double-colon punctuation">::</span>clog <span class="token operator">&lt;&lt;</span> ss<span class="token punctuation">.</span><span class="token function">str</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token char">'\n'</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

</code></pre><h2 id="Resolution" data-id="Resolution"><a class="anchor hidden-xs" href="#Resolution" title="Resolution"><span class="octicon octicon-link"></span></a><span>Resolution</span></h2><p><span>How effective is the safety proposed? Let’s look at the </span><em><span>[exponential]</span></em><span> safety scale </span><sup class="footnote-ref"><a href="#fn4" id="fnref4">[4]</a></sup><span>.</span></p><p><img src="https://upload.wikimedia.org/wikipedia/commons/3/36/NIOSH%E2%80%99s_%E2%80%9CHierarchy_of_Controls_infographic%E2%80%9D_as_SVG.svg" alt="Hierarchy of Controls" loading="lazy"></p><p><span>While this proposal does greatly increase safety by increasing the number of safe element access functions from 0 to 56, based on this scale, the effectiveness is limited because it is at best </span><code>PPE</code><span>, personal protective equipment that only works if used. While </span><strong><span>NOT</span></strong><span> a part of the proposal, throughout this proposal you may have noticed the following description attributes.</span></p><pre><code class="cpp hljs"><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token function">unsafe</span><span class="token punctuation">(</span>reason<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"range"</span><span class="token punctuation">,</span> <span class="token string">"dangling_reference"</span><span class="token punctuation">,</span> <span class="token string">"reference_invalidation"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token function">unsafe</span><span class="token punctuation">(</span>reason<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"dangling_reference"</span><span class="token punctuation">,</span> <span class="token string">"reference_invalidation"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>safe<span class="token punctuation">]</span><span class="token punctuation">]</span>
</code></pre><p><span>Armed with this type of documentation, a tool could be provided that outputs a JSON/YAML statistical summary report representing an audit of the safety of the code. This report could be checked in with the source code so that a automated code reviewer could reject code submission if the patch would render the code base less safe or proportionally so. Further, those code who can’t have any unsafety, such as new code, would benefit from static analysis, preferably built into the compiler, that would reject any deprecated and documented unsafe code especially when a substitute has been provided. These are high level tools used by owners, architects, managers, team leads and auditors on the project/module level.</span></p><h2 id="Summary" data-id="Summary"><a class="anchor hidden-xs" href="#Summary" title="Summary"><span class="octicon octicon-link"></span></a><span>Summary</span></h2><p><span>Excluding overloads and contrasting the current </span><code>operator[]</code><span>, </span><code>at</code><span>, </span><code>back</code><span> and </span><code>front</code><span> methods with this proposals value based additions, the current design is 75% undefined/unsafe for range based access on </span><code>std::array</code><span>, </span><code>std::deque</code><span>, </span><code>std::string</code><span>, </span><code>std::string_view</code><span>, </span><code>std::vector</code><span>. This grows to 100% for </span><code>std::span</code><span> since it currently doesn’t have an </span><code>at</code><span> method. This doesn’t even include the undefined/unsafe behavior of iterators, direct access via </span><code>data</code><span> or the fact that </span><code>operator[]</code><span> is disproportionately used over </span><code>at</code><span>, even in large code bases, which means, in the wild, this percentage is closer to 100%. This proposal adds 44 safe functions and 1 unsafe function with defined behavior. This drops the percentage of undefined/unsafe behavior for range based access to &lt;11%</span><!-- (4+1) * 100 / (4 + 1 + 44) = 10.204% --><span>. Consequently, with minimal training, it will be easier for a programmer to reach for a safer function over a less safe one. This doesn’t even include the fact that all of the existing element access methods are also susceptible to dangling and invalidation issues which these new functions avoids and minimizes.</span></p><p><span>The advantages of adopting said proposal are as follows:</span></p><ol>
<li><span>Reduces range based access errors</span></li>
<li><span>Reduces dangling references at run time</span></li>
<li><span>Reduces reference invalidation errors at run time</span></li>
<li><span>Allows programmers to avoid superfluous dynamic allocation when working with exceptions</span></li>
</ol><h2 id="Frequently-Asked-Questions" data-id="Frequently-Asked-Questions"><a class="anchor hidden-xs" href="#Frequently-Asked-Questions" title="Frequently-Asked-Questions"><span class="octicon octicon-link"></span></a><span>Frequently Asked Questions</span></h2><h3 id="Why-not-just-wait-for-contracts" data-id="Why-not-just-wait-for-contracts"><a class="anchor hidden-xs" href="#Why-not-just-wait-for-contracts" title="Why-not-just-wait-for-contracts"><span class="octicon octicon-link"></span></a><span>Why not just wait for contracts?</span></h3><ol>
<li><span>Besides the fact that we do not know exactly when </span><code>contracts</code><span> will land, real harm is occuring in the mean time.</span></li>
<li><span>Even if </span><code>contracts</code><span> were added to </span><code>operator[]</code><span>, </span><code>front</code><span> and </span><code>back</code><span>, these methods would still be returning references which would still be susceptible to dangling and invalidation issues.</span></li>
<li><span>The following void returning, crop, grow and batch funtions has utility apart from </span><code>contracts</code><span> because no error is expected, rather just well designed behavior.</span>
<ul>
<li><code>set_and_crop</code></li>
<li><code>set_front_and_crop</code></li>
<li><code>set_back_and_crop</code></li>
<li><code>set_and_grow</code></li>
<li><code>set_front_and_grow</code></li>
<li><code>set_back_and_grow</code></li>
<li><code>visit_and_crop</code></li>
<li><code>visit_front_and_crop</code></li>
<li><code>visit_back_and_crop</code></li>
<li><code>visit_and_grow</code></li>
<li><code>visit_front_and_grow</code></li>
<li><code>visit_back_and_grow</code></li>
<li><code>copy_and_crop</code></li>
<li><code>copy_and_grow</code></li>
</ul>
</li>
<li><span>Programmers like to be in control of their error handling strategy, (return, throw, terminate, void/crop, void/grow), which can vary from one call to the next.</span></li>
</ol><h2 id="References" data-id="References"><a class="anchor hidden-xs" href="#References" title="References"><span class="octicon octicon-link"></span></a><span>References</span></h2><hr class="footnotes-sep"><section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0847r7.html" target="_blank" rel="noopener"><span>https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0847r7.html</span></a> <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2011r1.html" target="_blank" rel="noopener"><span>https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2011r1.html</span></a> <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn3" class="footnote-item"><p><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2672r0.html" target="_blank" rel="noopener"><span>https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2672r0.html</span></a> <a href="#fnref3" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn4" class="footnote-item"><p><a href="https://www.cdc.gov/niosh/topics/hierarchy/default.html" target="_blank" rel="noopener"><span>https://www.cdc.gov/niosh/topics/hierarchy/default.html</span></a> <a href="#fnref4" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section></div>
    <div class="ui-toc dropup unselectable hidden-print" style="display:none;">
        <div class="pull-right dropdown">
            <a id="tocLabel" class="ui-toc-label btn btn-default" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false" title="Table of content">
                <i class="fa fa-bars"></i>
            </a>
            <ul id="ui-toc" class="ui-toc-dropdown dropdown-menu" aria-labelledby="tocLabel">
                <div class="toc"><ul class="nav">
<li class=""><a href="#Safer-Range-Access" title="Safer Range Access">Safer Range Access</a><ul class="nav">
<li class=""><a href="#Table-of-contents" title="Table of contents">Table of contents</a></li>
<li><a href="#Abstract" title="Abstract">Abstract</a></li>
<li><a href="#Technical-Details" title="Technical Details">Technical Details</a><ul class="nav">
<li><a href="#The-common-challenges" title="The common challenges">The common challenges</a></li>
<li><a href="#The-common-safe-member-functions" title="The common safe member functions">The common safe member functions</a></li>
<li><a href="#The-common-safe-free-functions" title="The common safe free functions">The common safe free functions</a></li>
</ul>
</li>
<li><a href="#Optional-Design-Considerations" title="Optional Design Considerations">Optional Design Considerations</a></li>
<li><a href="#Example" title="Example">Example</a></li>
<li><a href="#Resolution" title="Resolution">Resolution</a></li>
<li><a href="#Summary" title="Summary">Summary</a></li>
<li><a href="#Frequently-Asked-Questions" title="Frequently Asked Questions">Frequently Asked Questions</a><ul class="nav">
<li><a href="#Why-not-just-wait-for-contracts" title="Why not just wait for contracts?">Why not just wait for contracts?</a></li>
</ul>
</li>
<li><a href="#References" title="References">References</a></li>
</ul>
</li>
</ul>
</div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div>
            </ul>
        </div>
    </div>
    <div id="ui-toc-affix" class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" style="top:17px;display:none;" null null>
        <div class="toc"><ul class="nav">
<li class=""><a href="#Safer-Range-Access" title="Safer Range Access">Safer Range Access</a><ul class="nav">
<li class=""><a href="#Table-of-contents" title="Table of contents">Table of contents</a></li>
<li><a href="#Abstract" title="Abstract">Abstract</a></li>
<li><a href="#Technical-Details" title="Technical Details">Technical Details</a><ul class="nav">
<li><a href="#The-common-challenges" title="The common challenges">The common challenges</a></li>
<li><a href="#The-common-safe-member-functions" title="The common safe member functions">The common safe member functions</a></li>
<li><a href="#The-common-safe-free-functions" title="The common safe free functions">The common safe free functions</a></li>
</ul>
</li>
<li><a href="#Optional-Design-Considerations" title="Optional Design Considerations">Optional Design Considerations</a></li>
<li><a href="#Example" title="Example">Example</a></li>
<li><a href="#Resolution" title="Resolution">Resolution</a></li>
<li><a href="#Summary" title="Summary">Summary</a></li>
<li><a href="#Frequently-Asked-Questions" title="Frequently Asked Questions">Frequently Asked Questions</a><ul class="nav">
<li><a href="#Why-not-just-wait-for-contracts" title="Why not just wait for contracts?">Why not just wait for contracts?</a></li>
</ul>
</li>
<li><a href="#References" title="References">References</a></li>
</ul>
</li>
</ul>
</div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous" defer></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
    <script>
        var markdown = $(".markdown-body");
        //smooth all hash trigger scrolling
        function smoothHashScroll() {
            var hashElements = $("a[href^='#']").toArray();
            for (var i = 0; i < hashElements.length; i++) {
                var element = hashElements[i];
                var $element = $(element);
                var hash = element.hash;
                if (hash) {
                    $element.on('click', function (e) {
                        // store hash
                        var hash = this.hash;
                        if ($(hash).length <= 0) return;
                        // prevent default anchor click behavior
                        e.preventDefault();
                        // animate
                        $('body, html').stop(true, true).animate({
                            scrollTop: $(hash).offset().top
                        }, 100, "linear", function () {
                            // when done, add hash to url
                            // (default click behaviour)
                            window.location.hash = hash;
                        });
                    });
                }
            }
        }

        smoothHashScroll();
        var toc = $('.ui-toc');
        var tocAffix = $('.ui-affix-toc');
        var tocDropdown = $('.ui-toc-dropdown');
        //toc
        tocDropdown.click(function (e) {
            e.stopPropagation();
        });

        var enoughForAffixToc = true;

        function generateScrollspy() {
            $(document.body).scrollspy({
                target: ''
            });
            $(document.body).scrollspy('refresh');
            if (enoughForAffixToc) {
                toc.hide();
                tocAffix.show();
            } else {
                tocAffix.hide();
                toc.show();
            }
            $(document.body).scroll();
        }

        function windowResize() {
            //toc right
            var paddingRight = parseFloat(markdown.css('padding-right'));
            var right = ($(window).width() - (markdown.offset().left + markdown.outerWidth() - paddingRight));
            toc.css('right', right + 'px');
            //affix toc left
            var newbool;
            var rightMargin = (markdown.parent().outerWidth() - markdown.outerWidth()) / 2;
            //for ipad or wider device
            if (rightMargin >= 133) {
                newbool = true;
                var affixLeftMargin = (tocAffix.outerWidth() - tocAffix.width()) / 2;
                var left = markdown.offset().left + markdown.outerWidth() - affixLeftMargin;
                tocAffix.css('left', left + 'px');
            } else {
                newbool = false;
            }
            if (newbool != enoughForAffixToc) {
                enoughForAffixToc = newbool;
                generateScrollspy();
            }
        }
        $(window).resize(function () {
            windowResize();
        });
        $(document).ready(function () {
            windowResize();
            generateScrollspy();
        });

        //remove hash
        function removeHash() {
            window.location.hash = '';
        }

        var backtotop = $('.back-to-top');
        var gotobottom = $('.go-to-bottom');

        backtotop.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            if (scrollToTop)
                scrollToTop();
            removeHash();
        });
        gotobottom.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            if (scrollToBottom)
                scrollToBottom();
            removeHash();
        });

        var toggle = $('.expand-toggle');
        var tocExpand = false;

        checkExpandToggle();
        toggle.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            tocExpand = !tocExpand;
            checkExpandToggle();
        })

        function checkExpandToggle () {
            var toc = $('.ui-toc-dropdown .toc');
            var toggle = $('.expand-toggle');
            if (!tocExpand) {
                toc.removeClass('expand');
                toggle.text('Expand all');
            } else {
                toc.addClass('expand');
                toggle.text('Collapse all');
            }
        }

        function scrollToTop() {
            $('body, html').stop(true, true).animate({
                scrollTop: 0
            }, 100, "linear");
        }

        function scrollToBottom() {
            $('body, html').stop(true, true).animate({
                scrollTop: $(document.body)[0].scrollHeight
            }, 100, "linear");
        }
    </script>
</body>

</html>
