From Jason Turner

[insert.iterators]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpb2ermarb/{from.md → to.md} +59 -88
tmp/tmpb2ermarb/{from.md → to.md} RENAMED
@@ -14,16 +14,16 @@ insert corresponding elements into the container. This device allows all
14
  of the copying algorithms in the library to work in the *insert mode*
15
  instead of the *regular overwrite* mode.
16
 
17
  An insert iterator is constructed from a container and possibly one of
18
  its iterators pointing to where insertion takes place if it is neither
19
- at the beginning nor at the end of the container. Insert iterators
20
- satisfy the requirements of output iterators. `operator*` returns the
21
- insert iterator itself. The assignment `operator=(const T& x)` is
22
- defined on insert iterators to allow writing into them, it inserts `x`
23
- right before where the insert iterator is pointing. In other words, an
24
- insert iterator is like a cursor pointing into the container where the
25
  insertion takes place. `back_insert_iterator` inserts elements at the
26
  end of a container, `front_insert_iterator` inserts elements at the
27
  beginning of a container, and `insert_iterator` inserts elements where
28
  the iterator points to in a container. `back_inserter`,
29
  `front_inserter`, and `inserter` are three functions making the insert
@@ -34,84 +34,74 @@ iterators out of a container.
34
  ``` cpp
35
  namespace std {
36
  template<class Container>
37
  class back_insert_iterator {
38
  protected:
39
- Container* container;
40
 
41
  public:
42
  using iterator_category = output_iterator_tag;
43
  using value_type = void;
44
- using difference_type = void;
45
  using pointer = void;
46
  using reference = void;
47
  using container_type = Container;
48
 
49
- explicit back_insert_iterator(Container& x);
50
- back_insert_iterator& operator=(const typename Container::value_type& value);
51
- back_insert_iterator& operator=(typename Container::value_type&& value);
 
52
 
53
- back_insert_iterator& operator*();
54
- back_insert_iterator& operator++();
55
- back_insert_iterator operator++(int);
56
  };
57
-
58
- template <class Container>
59
- back_insert_iterator<Container> back_inserter(Container& x);
60
  }
61
  ```
62
 
63
- #### `back_insert_iterator` operations <a id="back.insert.iter.ops">[[back.insert.iter.ops]]</a>
64
-
65
- ##### `back_insert_iterator` constructor <a id="back.insert.iter.cons">[[back.insert.iter.cons]]</a>
66
 
67
  ``` cpp
68
- explicit back_insert_iterator(Container& x);
69
  ```
70
 
71
  *Effects:* Initializes `container` with `addressof(x)`.
72
 
73
- ##### `back_insert_iterator::operator=` <a id="back.insert.iter.op=">[[back.insert.iter.op=]]</a>
74
-
75
  ``` cpp
76
- back_insert_iterator& operator=(const typename Container::value_type& value);
77
  ```
78
 
79
  *Effects:* As if by: `container->push_back(value);`
80
 
81
  *Returns:* `*this`.
82
 
83
  ``` cpp
84
- back_insert_iterator& operator=(typename Container::value_type&& value);
85
  ```
86
 
87
  *Effects:* As if by: `container->push_back(std::move(value));`
88
 
89
  *Returns:* `*this`.
90
 
91
- ##### `back_insert_iterator::operator*` <a id="back.insert.iter.op*">[[back.insert.iter.op*]]</a>
92
-
93
  ``` cpp
94
- back_insert_iterator& operator*();
95
  ```
96
 
97
  *Returns:* `*this`.
98
 
99
- ##### `back_insert_iterator::operator++` <a id="back.insert.iter.op++">[[back.insert.iter.op++]]</a>
100
-
101
  ``` cpp
102
- back_insert_iterator& operator++();
103
- back_insert_iterator operator++(int);
104
  ```
105
 
106
  *Returns:* `*this`.
107
 
108
  ##### `back_inserter` <a id="back.inserter">[[back.inserter]]</a>
109
 
110
  ``` cpp
111
  template<class Container>
112
- back_insert_iterator<Container> back_inserter(Container& x);
113
  ```
114
 
115
  *Returns:* `back_insert_iterator<Container>(x)`.
116
 
117
  #### Class template `front_insert_iterator` <a id="front.insert.iterator">[[front.insert.iterator]]</a>
@@ -119,84 +109,74 @@ template <class Container>
119
  ``` cpp
120
  namespace std {
121
  template<class Container>
122
  class front_insert_iterator {
123
  protected:
124
- Container* container;
125
 
126
  public:
127
  using iterator_category = output_iterator_tag;
128
  using value_type = void;
129
- using difference_type = void;
130
  using pointer = void;
131
  using reference = void;
132
  using container_type = Container;
133
 
134
- explicit front_insert_iterator(Container& x);
135
- front_insert_iterator& operator=(const typename Container::value_type& value);
136
- front_insert_iterator& operator=(typename Container::value_type&& value);
 
137
 
138
- front_insert_iterator& operator*();
139
- front_insert_iterator& operator++();
140
- front_insert_iterator operator++(int);
141
  };
142
-
143
- template <class Container>
144
- front_insert_iterator<Container> front_inserter(Container& x);
145
  }
146
  ```
147
 
148
- #### `front_insert_iterator` operations <a id="front.insert.iter.ops">[[front.insert.iter.ops]]</a>
149
-
150
- ##### `front_insert_iterator` constructor <a id="front.insert.iter.cons">[[front.insert.iter.cons]]</a>
151
 
152
  ``` cpp
153
- explicit front_insert_iterator(Container& x);
154
  ```
155
 
156
  *Effects:* Initializes `container` with `addressof(x)`.
157
 
158
- ##### `front_insert_iterator::operator=` <a id="front.insert.iter.op=">[[front.insert.iter.op=]]</a>
159
-
160
  ``` cpp
161
- front_insert_iterator& operator=(const typename Container::value_type& value);
162
  ```
163
 
164
  *Effects:* As if by: `container->push_front(value);`
165
 
166
  *Returns:* `*this`.
167
 
168
  ``` cpp
169
- front_insert_iterator& operator=(typename Container::value_type&& value);
170
  ```
171
 
172
  *Effects:* As if by: `container->push_front(std::move(value));`
173
 
174
  *Returns:* `*this`.
175
 
176
- ##### `front_insert_iterator::operator*` <a id="front.insert.iter.op*">[[front.insert.iter.op*]]</a>
177
-
178
  ``` cpp
179
- front_insert_iterator& operator*();
180
  ```
181
 
182
  *Returns:* `*this`.
183
 
184
- ##### `front_insert_iterator::operator++` <a id="front.insert.iter.op++">[[front.insert.iter.op++]]</a>
185
-
186
  ``` cpp
187
- front_insert_iterator& operator++();
188
- front_insert_iterator operator++(int);
189
  ```
190
 
191
  *Returns:* `*this`.
192
 
193
  ##### `front_inserter` <a id="front.inserter">[[front.inserter]]</a>
194
 
195
  ``` cpp
196
  template<class Container>
197
- front_insert_iterator<Container> front_inserter(Container& x);
198
  ```
199
 
200
  *Returns:* `front_insert_iterator<Container>(x)`.
201
 
202
  #### Class template `insert_iterator` <a id="insert.iterator">[[insert.iterator]]</a>
@@ -204,50 +184,44 @@ template <class Container>
204
  ``` cpp
205
  namespace std {
206
  template<class Container>
207
  class insert_iterator {
208
  protected:
209
- Container* container;
210
- typename Container::iterator iter;
211
 
212
  public:
213
  using iterator_category = output_iterator_tag;
214
  using value_type = void;
215
- using difference_type = void;
216
  using pointer = void;
217
  using reference = void;
218
  using container_type = Container;
219
 
220
- insert_iterator(Container& x, typename Container::iterator i);
221
- insert_iterator& operator=(const typename Container::value_type& value);
222
- insert_iterator& operator=(typename Container::value_type&& value);
 
223
 
224
- insert_iterator& operator*();
225
- insert_iterator& operator++();
226
- insert_iterator& operator++(int);
227
  };
228
-
229
- template <class Container>
230
- insert_iterator<Container> inserter(Container& x, typename Container::iterator i);
231
  }
232
  ```
233
 
234
- #### `insert_iterator` operations <a id="insert.iter.ops">[[insert.iter.ops]]</a>
235
-
236
- ##### `insert_iterator` constructor <a id="insert.iter.cons">[[insert.iter.cons]]</a>
237
 
238
  ``` cpp
239
- insert_iterator(Container& x, typename Container::iterator i);
240
  ```
241
 
242
  *Effects:* Initializes `container` with `addressof(x)` and `iter` with
243
  `i`.
244
 
245
- ##### `insert_iterator::operator=` <a id="insert.iter.op=">[[insert.iter.op=]]</a>
246
-
247
  ``` cpp
248
- insert_iterator& operator=(const typename Container::value_type& value);
249
  ```
250
 
251
  *Effects:* As if by:
252
 
253
  ``` cpp
@@ -256,11 +230,11 @@ iter = container->insert(iter, value);
256
  ```
257
 
258
  *Returns:* `*this`.
259
 
260
  ``` cpp
261
- insert_iterator& operator=(typename Container::value_type&& value);
262
  ```
263
 
264
  *Effects:* As if by:
265
 
266
  ``` cpp
@@ -268,31 +242,28 @@ iter = container->insert(iter, std::move(value));
268
  ++iter;
269
  ```
270
 
271
  *Returns:* `*this`.
272
 
273
- ##### `insert_iterator::operator*` <a id="insert.iter.op*">[[insert.iter.op*]]</a>
274
-
275
  ``` cpp
276
- insert_iterator& operator*();
277
  ```
278
 
279
  *Returns:* `*this`.
280
 
281
- ##### `insert_iterator::operator++` <a id="insert.iter.op++">[[insert.iter.op++]]</a>
282
-
283
  ``` cpp
284
- insert_iterator& operator++();
285
- insert_iterator& operator++(int);
286
  ```
287
 
288
  *Returns:* `*this`.
289
 
290
  ##### `inserter` <a id="inserter">[[inserter]]</a>
291
 
292
  ``` cpp
293
  template<class Container>
294
- insert_iterator<Container> inserter(Container& x, typename Container::iterator i);
 
295
  ```
296
 
297
  *Returns:* `insert_iterator<Container>(x, i)`.
298
 
 
14
  of the copying algorithms in the library to work in the *insert mode*
15
  instead of the *regular overwrite* mode.
16
 
17
  An insert iterator is constructed from a container and possibly one of
18
  its iterators pointing to where insertion takes place if it is neither
19
+ at the beginning nor at the end of the container. Insert iterators meet
20
+ the requirements of output iterators. `operator*` returns the insert
21
+ iterator itself. The assignment `operator=(const T& x)` is defined on
22
+ insert iterators to allow writing into them, it inserts `x` right before
23
+ where the insert iterator is pointing. In other words, an insert
24
+ iterator is like a cursor pointing into the container where the
25
  insertion takes place. `back_insert_iterator` inserts elements at the
26
  end of a container, `front_insert_iterator` inserts elements at the
27
  beginning of a container, and `insert_iterator` inserts elements where
28
  the iterator points to in a container. `back_inserter`,
29
  `front_inserter`, and `inserter` are three functions making the insert
 
34
  ``` cpp
35
  namespace std {
36
  template<class Container>
37
  class back_insert_iterator {
38
  protected:
39
+ Container* container = nullptr;
40
 
41
  public:
42
  using iterator_category = output_iterator_tag;
43
  using value_type = void;
44
+ using difference_type = ptrdiff_t;
45
  using pointer = void;
46
  using reference = void;
47
  using container_type = Container;
48
 
49
+ constexpr back_insert_iterator() noexcept = default;
50
+ constexpr explicit back_insert_iterator(Container& x);
51
+ constexpr back_insert_iterator& operator=(const typename Container::value_type& value);
52
+ constexpr back_insert_iterator& operator=(typename Container::value_type&& value);
53
 
54
+ constexpr back_insert_iterator& operator*();
55
+ constexpr back_insert_iterator& operator++();
56
+ constexpr back_insert_iterator operator++(int);
57
  };
 
 
 
58
  }
59
  ```
60
 
61
+ ##### Operations <a id="back.insert.iter.ops">[[back.insert.iter.ops]]</a>
 
 
62
 
63
  ``` cpp
64
+ constexpr explicit back_insert_iterator(Container& x);
65
  ```
66
 
67
  *Effects:* Initializes `container` with `addressof(x)`.
68
 
 
 
69
  ``` cpp
70
+ constexpr back_insert_iterator& operator=(const typename Container::value_type& value);
71
  ```
72
 
73
  *Effects:* As if by: `container->push_back(value);`
74
 
75
  *Returns:* `*this`.
76
 
77
  ``` cpp
78
+ constexpr back_insert_iterator& operator=(typename Container::value_type&& value);
79
  ```
80
 
81
  *Effects:* As if by: `container->push_back(std::move(value));`
82
 
83
  *Returns:* `*this`.
84
 
 
 
85
  ``` cpp
86
+ constexpr back_insert_iterator& operator*();
87
  ```
88
 
89
  *Returns:* `*this`.
90
 
 
 
91
  ``` cpp
92
+ constexpr back_insert_iterator& operator++();
93
+ constexpr back_insert_iterator operator++(int);
94
  ```
95
 
96
  *Returns:* `*this`.
97
 
98
  ##### `back_inserter` <a id="back.inserter">[[back.inserter]]</a>
99
 
100
  ``` cpp
101
  template<class Container>
102
+ constexpr back_insert_iterator<Container> back_inserter(Container& x);
103
  ```
104
 
105
  *Returns:* `back_insert_iterator<Container>(x)`.
106
 
107
  #### Class template `front_insert_iterator` <a id="front.insert.iterator">[[front.insert.iterator]]</a>
 
109
  ``` cpp
110
  namespace std {
111
  template<class Container>
112
  class front_insert_iterator {
113
  protected:
114
+ Container* container = nullptr;
115
 
116
  public:
117
  using iterator_category = output_iterator_tag;
118
  using value_type = void;
119
+ using difference_type = ptrdiff_t;
120
  using pointer = void;
121
  using reference = void;
122
  using container_type = Container;
123
 
124
+ constexpr front_insert_iterator() noexcept = default;
125
+ constexpr explicit front_insert_iterator(Container& x);
126
+ constexpr front_insert_iterator& operator=(const typename Container::value_type& value);
127
+ constexpr front_insert_iterator& operator=(typename Container::value_type&& value);
128
 
129
+ constexpr front_insert_iterator& operator*();
130
+ constexpr front_insert_iterator& operator++();
131
+ constexpr front_insert_iterator operator++(int);
132
  };
 
 
 
133
  }
134
  ```
135
 
136
+ ##### Operations <a id="front.insert.iter.ops">[[front.insert.iter.ops]]</a>
 
 
137
 
138
  ``` cpp
139
+ constexpr explicit front_insert_iterator(Container& x);
140
  ```
141
 
142
  *Effects:* Initializes `container` with `addressof(x)`.
143
 
 
 
144
  ``` cpp
145
+ constexpr front_insert_iterator& operator=(const typename Container::value_type& value);
146
  ```
147
 
148
  *Effects:* As if by: `container->push_front(value);`
149
 
150
  *Returns:* `*this`.
151
 
152
  ``` cpp
153
+ constexpr front_insert_iterator& operator=(typename Container::value_type&& value);
154
  ```
155
 
156
  *Effects:* As if by: `container->push_front(std::move(value));`
157
 
158
  *Returns:* `*this`.
159
 
 
 
160
  ``` cpp
161
+ constexpr front_insert_iterator& operator*();
162
  ```
163
 
164
  *Returns:* `*this`.
165
 
 
 
166
  ``` cpp
167
+ constexpr front_insert_iterator& operator++();
168
+ constexpr front_insert_iterator operator++(int);
169
  ```
170
 
171
  *Returns:* `*this`.
172
 
173
  ##### `front_inserter` <a id="front.inserter">[[front.inserter]]</a>
174
 
175
  ``` cpp
176
  template<class Container>
177
+ constexpr front_insert_iterator<Container> front_inserter(Container& x);
178
  ```
179
 
180
  *Returns:* `front_insert_iterator<Container>(x)`.
181
 
182
  #### Class template `insert_iterator` <a id="insert.iterator">[[insert.iterator]]</a>
 
184
  ``` cpp
185
  namespace std {
186
  template<class Container>
187
  class insert_iterator {
188
  protected:
189
+ Container* container = nullptr;
190
+ ranges::iterator_t<Container> iter = ranges::iterator_t<Container>();
191
 
192
  public:
193
  using iterator_category = output_iterator_tag;
194
  using value_type = void;
195
+ using difference_type = ptrdiff_t;
196
  using pointer = void;
197
  using reference = void;
198
  using container_type = Container;
199
 
200
+ insert_iterator() = default;
201
+ constexpr insert_iterator(Container& x, ranges::iterator_t<Container> i);
202
+ constexpr insert_iterator& operator=(const typename Container::value_type& value);
203
+ constexpr insert_iterator& operator=(typename Container::value_type&& value);
204
 
205
+ constexpr insert_iterator& operator*();
206
+ constexpr insert_iterator& operator++();
207
+ constexpr insert_iterator& operator++(int);
208
  };
 
 
 
209
  }
210
  ```
211
 
212
+ ##### Operations <a id="insert.iter.ops">[[insert.iter.ops]]</a>
 
 
213
 
214
  ``` cpp
215
+ constexpr insert_iterator(Container& x, ranges::iterator_t<Container> i);
216
  ```
217
 
218
  *Effects:* Initializes `container` with `addressof(x)` and `iter` with
219
  `i`.
220
 
 
 
221
  ``` cpp
222
+ constexpr insert_iterator& operator=(const typename Container::value_type& value);
223
  ```
224
 
225
  *Effects:* As if by:
226
 
227
  ``` cpp
 
230
  ```
231
 
232
  *Returns:* `*this`.
233
 
234
  ``` cpp
235
+ constexpr insert_iterator& operator=(typename Container::value_type&& value);
236
  ```
237
 
238
  *Effects:* As if by:
239
 
240
  ``` cpp
 
242
  ++iter;
243
  ```
244
 
245
  *Returns:* `*this`.
246
 
 
 
247
  ``` cpp
248
+ constexpr insert_iterator& operator*();
249
  ```
250
 
251
  *Returns:* `*this`.
252
 
 
 
253
  ``` cpp
254
+ constexpr insert_iterator& operator++();
255
+ constexpr insert_iterator& operator++(int);
256
  ```
257
 
258
  *Returns:* `*this`.
259
 
260
  ##### `inserter` <a id="inserter">[[inserter]]</a>
261
 
262
  ``` cpp
263
  template<class Container>
264
+ constexpr insert_iterator<Container>
265
+ inserter(Container& x, ranges::iterator_t<Container> i);
266
  ```
267
 
268
  *Returns:* `insert_iterator<Container>(x, i)`.
269