• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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">&amp;</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">&amp;</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">&amp;</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">&amp;</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">&amp;&amp;</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">&lt;(</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">&amp;&amp;</span> <span class="identifier">lhs</span><span class="special">.</span><span class="identifier">n_</span> <span class="special">&lt;</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">&lt;=(</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">&lt;</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">&gt;(</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">&lt;</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">&gt;=(</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">&lt;=</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">&lt;</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">&gt;</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">&amp;</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