16
16
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
17
17
*/
18
18
19
- #pragma once
19
+ #ifndef ILIST_H
20
+ #define ILIST_H
20
21
21
22
#include < cstddef>
22
23
#include < iterator>
23
24
24
25
// Derive your class from this struct to insert to a linked list.
25
26
template <class Tag = void > struct ilist_node
26
27
{
27
- ilist_node ()
28
+ ilist_node () noexcept
28
29
#ifndef DBUG_OFF
29
- :
30
- next (NULL ), prev(NULL )
30
+ : next(NULL ), prev(NULL )
31
31
#endif
32
32
{
33
33
}
34
34
35
- ilist_node (ilist_node *next, ilist_node *prev) : next(next), prev(prev) {}
35
+ ilist_node (ilist_node *next, ilist_node *prev) noexcept
36
+ : next(next), prev(prev)
37
+ {
38
+ }
36
39
37
40
ilist_node *next;
38
41
ilist_node *prev;
@@ -70,40 +73,40 @@ template <class T, class Tag= void> class ilist
70
73
typedef T *pointer;
71
74
typedef T &reference;
72
75
73
- Iterator (ListNode *node) : node_(node) {}
76
+ Iterator (ListNode *node) noexcept : node_(node) {}
74
77
75
- Iterator &operator ++()
78
+ Iterator &operator ++() noexcept
76
79
{
77
80
node_= node_->next ;
78
81
return *this ;
79
82
}
80
- Iterator operator ++(int )
83
+ Iterator operator ++(int ) noexcept
81
84
{
82
85
Iterator tmp (*this );
83
86
operator ++();
84
87
return tmp;
85
88
}
86
89
87
- Iterator &operator --()
90
+ Iterator &operator --() noexcept
88
91
{
89
92
node_= node_->prev ;
90
93
return *this ;
91
94
}
92
- Iterator operator --(int )
95
+ Iterator operator --(int ) noexcept
93
96
{
94
97
Iterator tmp (*this );
95
98
operator --();
96
99
return tmp;
97
100
}
98
101
99
- reference operator *() { return *static_cast <pointer>(node_); }
100
- pointer operator ->() { return static_cast <pointer>(node_); }
102
+ reference operator *() noexcept { return *static_cast <pointer>(node_); }
103
+ pointer operator ->() noexcept { return static_cast <pointer>(node_); }
101
104
102
- friend bool operator ==(const Iterator &lhs, const Iterator &rhs)
105
+ friend bool operator ==(const Iterator &lhs, const Iterator &rhs) noexcept
103
106
{
104
107
return lhs.node_ == rhs.node_ ;
105
108
}
106
- friend bool operator !=(const Iterator &lhs, const Iterator &rhs)
109
+ friend bool operator !=(const Iterator &lhs, const Iterator &rhs) noexcept
107
110
{
108
111
return !(lhs == rhs);
109
112
}
@@ -114,44 +117,50 @@ template <class T, class Tag= void> class ilist
114
117
friend class ilist ;
115
118
};
116
119
117
- ilist () : sentinel_(&sentinel_, &sentinel_) {}
120
+ ilist () noexcept : sentinel_(&sentinel_, &sentinel_) {}
118
121
119
- reference front () { return *begin (); }
120
- reference back () { return *--end (); }
121
- const_reference front () const { return *begin (); }
122
- const_reference back () const { return *--end (); }
122
+ reference front () noexcept { return *begin (); }
123
+ reference back () noexcept { return *--end (); }
124
+ const_reference front () const noexcept { return *begin (); }
125
+ const_reference back () const noexcept { return *--end (); }
123
126
124
- iterator begin () { return iterator (sentinel_.next ); }
125
- const_iterator begin () const
127
+ iterator begin () noexcept { return iterator (sentinel_.next ); }
128
+ const_iterator begin () const noexcept
126
129
{
127
130
return iterator (const_cast <ListNode *>(sentinel_.next ));
128
131
}
129
- iterator end () { return iterator (&sentinel_); }
130
- const_iterator end () const
132
+ iterator end () noexcept { return iterator (&sentinel_); }
133
+ const_iterator end () const noexcept
131
134
{
132
135
return iterator (const_cast <ListNode *>(&sentinel_));
133
136
}
134
137
135
- reverse_iterator rbegin () { return reverse_iterator (end ()); }
136
- const_reverse_iterator rbegin () const { return reverse_iterator (end ()); }
137
- reverse_iterator rend () { return reverse_iterator (begin ()); }
138
- const_reverse_iterator rend () const { return reverse_iterator (begin ()); }
138
+ reverse_iterator rbegin () noexcept { return reverse_iterator (end ()); }
139
+ const_reverse_iterator rbegin () const noexcept
140
+ {
141
+ return reverse_iterator (end ());
142
+ }
143
+ reverse_iterator rend () noexcept { return reverse_iterator (begin ()); }
144
+ const_reverse_iterator rend () const noexcept
145
+ {
146
+ return reverse_iterator (begin ());
147
+ }
139
148
140
- bool empty () const { return sentinel_.next == &sentinel_; }
149
+ bool empty () const noexcept { return sentinel_.next == &sentinel_; }
141
150
142
151
// Not implemented because it's O(N)
143
152
// size_type size() const
144
153
// {
145
154
// return static_cast<size_type>(std::distance(begin(), end()));
146
155
// }
147
156
148
- void clear ()
157
+ void clear () noexcept
149
158
{
150
159
sentinel_.next = &sentinel_;
151
160
sentinel_.prev = &sentinel_;
152
161
}
153
162
154
- iterator insert (iterator pos, reference value)
163
+ iterator insert (iterator pos, reference value) noexcept
155
164
{
156
165
ListNode *curr= pos.node_ ;
157
166
ListNode *prev= pos.node_ ->prev ;
@@ -165,7 +174,7 @@ template <class T, class Tag= void> class ilist
165
174
return iterator (&value);
166
175
}
167
176
168
- iterator erase (iterator pos)
177
+ iterator erase (iterator pos) noexcept
169
178
{
170
179
ListNode *prev= pos.node_ ->prev ;
171
180
ListNode *next= pos.node_ ->next ;
@@ -182,15 +191,15 @@ template <class T, class Tag= void> class ilist
182
191
return next;
183
192
}
184
193
185
- void push_back (reference value) { insert (end (), value); }
186
- void pop_back () { erase (end ()); }
194
+ void push_back (reference value) noexcept { insert (end (), value); }
195
+ void pop_back () noexcept { erase (end ()); }
187
196
188
- void push_front (reference value) { insert (begin (), value); }
189
- void pop_front () { erase (begin ()); }
197
+ void push_front (reference value) noexcept { insert (begin (), value); }
198
+ void pop_front () noexcept { erase (begin ()); }
190
199
191
200
// STL version is O(n) but this is O(1) because an element can't be inserted
192
201
// several times in the same ilist.
193
- void remove (reference value) { erase (iterator (&value)); }
202
+ void remove (reference value) noexcept { erase (iterator (&value)); }
194
203
195
204
private:
196
205
ListNode sentinel_;
@@ -216,36 +225,38 @@ template <class T, class Tag= void> class sized_ilist : public ilist<T, Tag>
216
225
typedef std::reverse_iterator<iterator> reverse_iterator;
217
226
typedef std::reverse_iterator<const iterator> const_reverse_iterator;
218
227
219
- sized_ilist () : size_(0 ) {}
228
+ sized_ilist () noexcept : size_(0 ) {}
220
229
221
- size_type size () const { return size_; }
230
+ size_type size () const noexcept { return size_; }
222
231
223
- void clear ()
232
+ void clear () noexcept
224
233
{
225
234
BASE::clear ();
226
235
size_= 0 ;
227
236
}
228
237
229
- iterator insert (iterator pos, reference value)
238
+ iterator insert (iterator pos, reference value) noexcept
230
239
{
231
240
++size_;
232
241
return BASE::insert (pos, value);
233
242
}
234
243
235
- iterator erase (iterator pos)
244
+ iterator erase (iterator pos) noexcept
236
245
{
237
246
--size_;
238
247
return BASE::erase (pos);
239
248
}
240
249
241
- void push_back (reference value) { insert (BASE::end (), value); }
242
- void pop_back () { erase (BASE::end ()); }
250
+ void push_back (reference value) noexcept { insert (BASE::end (), value); }
251
+ void pop_back () noexcept { erase (BASE::end ()); }
243
252
244
- void push_front (reference value) { insert (BASE::begin (), value); }
245
- void pop_front () { erase (BASE::begin ()); }
253
+ void push_front (reference value) noexcept { insert (BASE::begin (), value); }
254
+ void pop_front () noexcept { erase (BASE::begin ()); }
246
255
247
- void remove (reference value) { erase (iterator (&value)); }
256
+ void remove (reference value) noexcept { erase (iterator (&value)); }
248
257
249
258
private:
250
259
size_type size_;
251
260
};
261
+
262
+ #endif
0 commit comments