1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>Chapter 38. Boost.STLInterfaces</title> 6<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="libraries.html" title="Part I. The Boost C++ Libraries (BoostBook Subset)"> 10<link rel="prev" href="boost_staticassert/test.html" title="Test Programs"> 11<link rel="next" href="boost_stlinterfaces/this_library_s_relationship_to_boost_iterator.html" title="This Library's Relationship to Boost.Iterator"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../boost.png"></td> 16<td align="center"><a href="../../index.html">Home</a></td> 17<td align="center"><a href="../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="boost_staticassert/test.html"><img src="../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="libraries.html"><img src="../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="boost_stlinterfaces/this_library_s_relationship_to_boost_iterator.html"><img src="../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="chapter"> 27<div class="titlepage"><div> 28<div><h2 class="title"> 29<a name="stl_interfaces"></a>Chapter 38. Boost.STLInterfaces</h2></div> 30<div><div class="author"><h3 class="author"> 31<span class="firstname">Zach</span> <span class="surname">Laine</span> 32</h3></div></div> 33<div><p class="copyright">Copyright © 2019 T. Zachary Laine</p></div> 34<div><div class="legalnotice"> 35<a name="stl_interfaces.legal"></a><p> 36 Distributed under the Boost Software License, Version 1.0. (See accompanying 37 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) 38 </p> 39</div></div> 40</div></div> 41<div class="toc"> 42<p><b>Table of Contents</b></p> 43<dl class="toc"> 44<dt><span class="section"><a href="stl_interfaces.html#boost_stlinterfaces.introduction">Introduction</a></span></dt> 45<dt><span class="section"><a href="boost_stlinterfaces/this_library_s_relationship_to_boost_iterator.html">This 46 Library's Relationship to Boost.Iterator</a></span></dt> 47<dt><span class="section"><a href="boost_stlinterfaces/tutorial___iterator_interface_.html">Tutorial: 48 <code class="computeroutput"><span class="identifier">iterator_interface</span></code></a></span></dt> 49<dt><span class="section"><a href="boost_stlinterfaces/tutorial___view_interface_.html">Tutorial: 50 <code class="computeroutput"><span class="identifier">view_interface</span></code></a></span></dt> 51<dt><span class="section"><a href="boost_stlinterfaces/tutorial___sequence_container_interface_.html">Tutorial: 52 <code class="computeroutput"><span class="identifier">sequence_container_interface</span></code></a></span></dt> 53<dt><span class="section"><a href="boost_stlinterfaces/tutorial___reverse_iterator_.html">Tutorial: 54 <code class="computeroutput"><span class="identifier">reverse_iterator</span></code></a></span></dt> 55<dt><span class="section"><a href="boost_stlinterfaces/examples.html">Examples</a></span></dt> 56<dd><dl> 57<dt><span class="section"><a href="boost_stlinterfaces/examples.html#boost_stlinterfaces.examples.random_access_iterator">Random 58 Access Iterator</a></span></dt> 59<dt><span class="section"><a href="boost_stlinterfaces/examples.html#boost_stlinterfaces.examples.mutable_and_constant_iterator_interoperability">Mutable 60 and Constant Iterator Interoperability</a></span></dt> 61<dt><span class="section"><a href="boost_stlinterfaces/examples.html#boost_stlinterfaces.examples.zip_iterator___proxy_iterator">Zip 62 Iterator / Proxy Iterator</a></span></dt> 63<dt><span class="section"><a href="boost_stlinterfaces/examples.html#boost_stlinterfaces.examples.reimplementing__back_insert_iterator_">Reimplementing 64 <code class="computeroutput"><span class="identifier">back_insert_iterator</span></code></a></span></dt> 65<dt><span class="section"><a href="boost_stlinterfaces/examples.html#boost_stlinterfaces.examples.reimplementing__reverse_iterator_">Reimplementing 66 <code class="computeroutput"><span class="identifier">reverse_iterator</span></code></a></span></dt> 67</dl></dd> 68<dt><span class="section"><a href="stl_interfaces/compiler_support.html">Compiler Support</a></span></dt> 69<dt><span class="section"><a href="stl_interfaces/reference.html">Reference</a></span></dt> 70<dd><dl><dt><span class="section"><a href="stl_interfaces/reference.html#headers">Headers</a></span></dt></dl></dd> 71<dt><span class="section"><a href="boost_stlinterfaces/rationale.html">Rationale</a></span></dt> 72</dl> 73</div> 74<div class="section"> 75<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 76<a name="boost_stlinterfaces.introduction"></a><a class="link" href="stl_interfaces.html#boost_stlinterfaces.introduction" title="Introduction">Introduction</a> 77</h2></div></div></div> 78<p> 79 Writing STL iterators, views, and containers is surprisingly hard. There are 80 a lot of things that can subtly go wrong. It is also very tedious, which of 81 course makes it error-prone. 82 </p> 83<p> 84 Iterators have numerous typedefs and operations, even though all the operations 85 of a given iterator can be implemented in terms of at most four operations 86 (and usually only three). Writing all the other operations yields very similar-looking 87 code that is hard to review, and all but requires that you write full-coverage 88 tests for each iterator. 89 </p> 90<p> 91 Writing view types like those found in <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">ranges</span></code> 92 is also laborious, considering that most of each view type's API can be derived 93 from <code class="computeroutput"><span class="identifier">begin</span><span class="special">()</span></code> 94 and <code class="computeroutput"><span class="identifier">end</span><span class="special">()</span></code>. 95 C++20 has a template that does exactly this, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">ranges</span><span class="special">::</span><span class="identifier">view_interface</span></code>; 96 Boost.STLInterfaces provides a pre-C++20-friendly implementation. 97 </p> 98<p> 99 Most daunting of all is the task of writing a type or template that meets the 100 container requirements in the standard. Boost.STLInterfaces provides another 101 template called <code class="computeroutput"><a class="link" href="boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 102 that reduces the implementation and testing burden dramatically. 103 </p> 104<div class="note"><table border="0" summary="Note"> 105<tr> 106<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../doc/src/images/note.png"></td> 107<th align="left">Note</th> 108</tr> 109<tr><td align="left" valign="top"><p> 110 C++20 versions of <code class="computeroutput"><a class="link" href="boost/stl_interfaces/v1/iterator_interface.html" title="Struct template iterator_interface">iterator_interface</a></code> and <code class="computeroutput"><a class="link" href="boost/stl_interfaces/v1/sequ_1_3_39_11_2_5_1_1_1_1.html" title="Struct template sequence_container_interface">sequence_container_interface</a></code> 111 are provided (C++20 provides <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">view_interface</span></code>). 112 These are constrained templates using C++20 concepts. These are in the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">v2</span></code> namespace, and are considered experimental, 113 because at the time of this writing, no C++20-conforming compiler exists. 114 </p></td></tr> 115</table></div> 116<h4> 117<a name="boost_stlinterfaces.introduction.h0"></a> 118 <span class="phrase"><a name="boost_stlinterfaces.introduction.a_quick_example"></a></span><a class="link" href="stl_interfaces.html#boost_stlinterfaces.introduction.a_quick_example">A 119 Quick Example</a> 120 </h4> 121<p> 122 Here is an example of the iterator portion of the library. Let's say that we 123 wanted to make a random access iterator that represents a string of arbitrary 124 length constructed by repeating a shorter string. Let's call this iterator 125 <code class="computeroutput"><span class="identifier">repeated_chars_iterator</span></code>. Here 126 it is in action: 127 </p> 128<p> 129</p> 130<pre class="programlisting"><span class="identifier">repeated_chars_iterator</span> <span class="identifier">first</span><span class="special">(</span><span class="string">"foo"</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// 3 is the length of "foo", 0 is this iterator's position.</span> 131<span class="identifier">repeated_chars_iterator</span> <span class="identifier">last</span><span class="special">(</span><span class="string">"foo"</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">7</span><span class="special">);</span> <span class="comment">// Same as above, but now the iterator's position is 7.</span> 132<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">result</span><span class="special">;</span> 133<span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">result</span><span class="special">));</span> 134<span class="identifier">assert</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="string">"foofoof"</span><span class="special">);</span> 135</pre> 136<p> 137 </p> 138<p> 139 There's nothing in the standard library that gets us that kind of behavior, 140 so we have to write it. This library seeks to turn what we write from this: 141 </p> 142<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">repeated_chars_iterator</span> 143<span class="special">{</span> 144 <span class="keyword">using</span> <span class="identifier">value_type</span> <span class="special">=</span> <span class="keyword">char</span><span class="special">;</span> 145 <span class="keyword">using</span> <span class="identifier">difference_type</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ptrdiff_t</span><span class="special">;</span> 146 <span class="keyword">using</span> <span class="identifier">pointer</span> <span class="special">=</span> <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*;</span> 147 <span class="keyword">using</span> <span class="identifier">reference</span> <span class="special">=</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">;</span> 148 <span class="keyword">using</span> <span class="identifier">iterator_category</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">random_access_iterator_tag</span><span class="special">;</span> 149 150 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">:</span> 151 <span class="identifier">first_</span><span class="special">(</span><span class="keyword">nullptr</span><span class="special">),</span> 152 <span class="identifier">size_</span><span class="special">(</span><span class="number">0</span><span class="special">),</span> 153 <span class="identifier">n_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> 154 <span class="special">{}</span> 155 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span><span class="special">(</span> 156 <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> <span class="identifier">first</span><span class="special">,</span> 157 <span class="identifier">difference_type</span> <span class="identifier">size</span><span class="special">,</span> 158 <span class="identifier">difference_type</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">:</span> 159 <span class="identifier">first_</span><span class="special">(</span><span class="identifier">first</span><span class="special">),</span> 160 <span class="identifier">size_</span><span class="special">(</span><span class="identifier">size</span><span class="special">),</span> 161 <span class="identifier">n_</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span> 162 <span class="special">{}</span> 163 164 <span class="keyword">constexpr</span> <span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> 165 <span class="special">{</span> 166 <span class="keyword">return</span> <span class="identifier">first_</span><span class="special">[</span><span class="identifier">n_</span> <span class="special">%</span> <span class="identifier">size_</span><span class="special">];</span> 167 <span class="special">}</span> 168 169 <span class="keyword">constexpr</span> <span class="identifier">value_type</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">difference_type</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> 170 <span class="special">{</span> 171 <span class="keyword">return</span> <span class="identifier">first_</span><span class="special">[(</span><span class="identifier">n_</span> <span class="special">+</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">%</span> <span class="identifier">size_</span><span class="special">];</span> 172 <span class="special">}</span> 173 174 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">++()</span> <span class="keyword">noexcept</span> 175 <span class="special">{</span> 176 <span class="special">++</span><span class="identifier">n_</span><span class="special">;</span> 177 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 178 <span class="special">}</span> 179 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span> <span class="keyword">operator</span><span class="special">++(</span><span class="keyword">int</span><span class="special">)</span><span class="keyword">noexcept</span> 180 <span class="special">{</span> 181 <span class="identifier">repeated_chars_iterator</span> <span class="identifier">retval</span> <span class="special">=</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 182 <span class="special">++*</span><span class="keyword">this</span><span class="special">;</span> 183 <span class="keyword">return</span> <span class="identifier">retval</span><span class="special">;</span> 184 <span class="special">}</span> 185 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">+=(</span><span class="identifier">difference_type</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span> 186 <span class="special">{</span> 187 <span class="identifier">n_</span> <span class="special">+=</span> <span class="identifier">n</span><span class="special">;</span> 188 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 189 <span class="special">}</span> 190 191 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">--()</span> <span class="keyword">noexcept</span> 192 <span class="special">{</span> 193 <span class="special">--</span><span class="identifier">n_</span><span class="special">;</span> 194 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 195 <span class="special">}</span> 196 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span> <span class="keyword">operator</span><span class="special">--(</span><span class="keyword">int</span><span class="special">)</span><span class="keyword">noexcept</span> 197 <span class="special">{</span> 198 <span class="identifier">repeated_chars_iterator</span> <span class="identifier">retval</span> <span class="special">=</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 199 <span class="special">--*</span><span class="keyword">this</span><span class="special">;</span> 200 <span class="keyword">return</span> <span class="identifier">retval</span><span class="special">;</span> 201 <span class="special">}</span> 202 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">-=(</span><span class="identifier">difference_type</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span> 203 <span class="special">{</span> 204 <span class="identifier">n_</span> <span class="special">-=</span> <span class="identifier">n</span><span class="special">;</span> 205 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 206 <span class="special">}</span> 207 208 <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> 209 <span class="identifier">repeated_chars_iterator</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">repeated_chars_iterator</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span> 210 <span class="special">{</span> 211 <span class="keyword">return</span> <span class="identifier">lhs</span><span class="special">.</span><span class="identifier">first_</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">first_</span> <span class="special">&&</span> <span class="identifier">lhs</span><span class="special">.</span><span class="identifier">n_</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">n_</span><span class="special">;</span> 212 <span class="special">}</span> 213 <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span> 214 <span class="identifier">repeated_chars_iterator</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">repeated_chars_iterator</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span> 215 <span class="special">{</span> 216 <span class="keyword">return</span> <span class="special">!(</span><span class="identifier">lhs</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">);</span> 217 <span class="special">}</span> 218 <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span> 219 <span class="identifier">repeated_chars_iterator</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">repeated_chars_iterator</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span> 220 <span class="special">{</span> 221 <span class="keyword">return</span> <span class="identifier">lhs</span><span class="special">.</span><span class="identifier">first_</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">first_</span> <span class="special">&&</span> <span class="identifier">lhs</span><span class="special">.</span><span class="identifier">n_</span> <span class="special"><</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">n_</span><span class="special">;</span> 222 <span class="special">}</span> 223 <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><=(</span> 224 <span class="identifier">repeated_chars_iterator</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">repeated_chars_iterator</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span> 225 <span class="special">{</span> 226 <span class="keyword">return</span> <span class="identifier">lhs</span> <span class="special">==</span> <span class="identifier">rhs</span> <span class="special">||</span> <span class="identifier">lhs</span> <span class="special"><</span> <span class="identifier">rhs</span><span class="special">;</span> 227 <span class="special">}</span> 228 <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>(</span> 229 <span class="identifier">repeated_chars_iterator</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">repeated_chars_iterator</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span> 230 <span class="special">{</span> 231 <span class="keyword">return</span> <span class="identifier">rhs</span> <span class="special"><</span> <span class="identifier">lhs</span><span class="special">;</span> 232 <span class="special">}</span> 233 <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>=(</span> 234 <span class="identifier">repeated_chars_iterator</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">repeated_chars_iterator</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span> 235 <span class="special">{</span> 236 <span class="keyword">return</span> <span class="identifier">rhs</span> <span class="special"><=</span> <span class="identifier">lhs</span><span class="special">;</span> 237 <span class="special">}</span> 238 239 <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span> 240 <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">repeated_chars_iterator</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">difference_type</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span> 241 <span class="special">{</span> 242 <span class="keyword">return</span> <span class="identifier">lhs</span> <span class="special">+=</span> <span class="identifier">rhs</span><span class="special">;</span> 243 <span class="special">}</span> 244 <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span> 245 <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">difference_type</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">repeated_chars_iterator</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span> 246 <span class="special">{</span> 247 <span class="keyword">return</span> <span class="identifier">rhs</span> <span class="special">+=</span> <span class="identifier">lhs</span><span class="special">;</span> 248 <span class="special">}</span> 249 <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span> 250 <span class="keyword">operator</span><span class="special">-(</span><span class="identifier">repeated_chars_iterator</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">difference_type</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span> 251 <span class="special">{</span> 252 <span class="keyword">return</span> <span class="identifier">lhs</span> <span class="special">-=</span> <span class="identifier">rhs</span><span class="special">;</span> 253 <span class="special">}</span> 254 <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="identifier">difference_type</span> <span class="keyword">operator</span><span class="special">-(</span> 255 <span class="identifier">repeated_chars_iterator</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">repeated_chars_iterator</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span> 256 <span class="special">{</span> 257 <span class="keyword">return</span> <span class="identifier">lhs</span><span class="special">.</span><span class="identifier">n_</span> <span class="special">-</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">n_</span><span class="special">;</span> 258 <span class="special">}</span> 259 260<span class="keyword">private</span><span class="special">:</span> 261 <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> <span class="identifier">first_</span><span class="special">;</span> 262 <span class="identifier">difference_type</span> <span class="identifier">size_</span><span class="special">;</span> 263 <span class="identifier">difference_type</span> <span class="identifier">n_</span><span class="special">;</span> 264<span class="special">};</span> 265</pre> 266<p> 267 (that's a lot of code!) into this: 268 </p> 269<p> 270</p> 271<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">repeated_chars_iterator</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">iterator_interface</span><span class="special"><</span> 272 <span class="identifier">repeated_chars_iterator</span><span class="special">,</span> 273 <span class="identifier">std</span><span class="special">::</span><span class="identifier">random_access_iterator_tag</span><span class="special">,</span> 274 <span class="keyword">char</span><span class="special">,</span> 275 <span class="keyword">char</span><span class="special">></span> 276<span class="special">{</span> 277 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">:</span> 278 <span class="identifier">first_</span><span class="special">(</span><span class="keyword">nullptr</span><span class="special">),</span> 279 <span class="identifier">size_</span><span class="special">(</span><span class="number">0</span><span class="special">),</span> 280 <span class="identifier">n_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> 281 <span class="special">{}</span> 282 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span><span class="special">(</span> 283 <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">difference_type</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">difference_type</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">:</span> 284 <span class="identifier">first_</span><span class="special">(</span><span class="identifier">first</span><span class="special">),</span> 285 <span class="identifier">size_</span><span class="special">(</span><span class="identifier">size</span><span class="special">),</span> 286 <span class="identifier">n_</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span> 287 <span class="special">{}</span> 288 289 <span class="keyword">constexpr</span> <span class="keyword">char</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">first_</span><span class="special">[</span><span class="identifier">n_</span> <span class="special">%</span> <span class="identifier">size_</span><span class="special">];</span> <span class="special">}</span> 290 <span class="keyword">constexpr</span> <span class="identifier">repeated_chars_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">+=(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ptrdiff_t</span> <span class="identifier">i</span><span class="special">)</span> <span class="keyword">noexcept</span> 291 <span class="special">{</span> 292 <span class="identifier">n_</span> <span class="special">+=</span> <span class="identifier">i</span><span class="special">;</span> 293 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 294 <span class="special">}</span> 295 <span class="keyword">constexpr</span> <span class="keyword">auto</span> <span class="keyword">operator</span><span class="special">-(</span><span class="identifier">repeated_chars_iterator</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> 296 <span class="special">{</span> 297 <span class="keyword">return</span> <span class="identifier">n_</span> <span class="special">-</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">n_</span><span class="special">;</span> 298 <span class="special">}</span> 299 300<span class="keyword">private</span><span class="special">:</span> 301 <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> <span class="identifier">first_</span><span class="special">;</span> 302 <span class="identifier">difference_type</span> <span class="identifier">size_</span><span class="special">;</span> 303 <span class="identifier">difference_type</span> <span class="identifier">n_</span><span class="special">;</span> 304<span class="special">};</span> 305</pre> 306<p> 307 </p> 308<p> 309 Ah, that's better. Both of these definitions for <code class="computeroutput"><span class="identifier">repeated_chars_iterator</span></code> 310 have the same semantics and performance profile. It's just a lot less code 311 to write the second one, and writing the second one is more novice-friendly. 312 </p> 313<div class="note"><table border="0" summary="Note"> 314<tr> 315<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../doc/src/images/note.png"></td> 316<th align="left">Note</th> 317</tr> 318<tr><td align="left" valign="top"><p> 319 Boost.STLInterfaces's <code class="computeroutput"><span class="identifier">iterator_interface</span></code> 320 implements iterators that model the C++20 iterator concepts. 321 </p></td></tr> 322</table></div> 323</div> 324</div> 325<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 326<td align="left"><p><small>Last revised: August 11, 2020 at 15:03:11 GMT</small></p></td> 327<td align="right"><div class="copyright-footer"></div></td> 328</tr></table> 329<hr> 330<div class="spirit-nav"> 331<a accesskey="p" href="boost_staticassert/test.html"><img src="../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="libraries.html"><img src="../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="boost_stlinterfaces/this_library_s_relationship_to_boost_iterator.html"><img src="../../doc/src/images/next.png" alt="Next"></a> 332</div> 333</body> 334</html> 335