Skip to content

Commit 5d47145

Browse files
committed
noexcept ilist
1 parent 873eb4a commit 5d47145

File tree

1 file changed

+57
-46
lines changed

1 file changed

+57
-46
lines changed

include/ilist.h

Lines changed: 57 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,26 @@
1616
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
1717
*/
1818

19-
#pragma once
19+
#ifndef ILIST_H
20+
#define ILIST_H
2021

2122
#include <cstddef>
2223
#include <iterator>
2324

2425
// Derive your class from this struct to insert to a linked list.
2526
template <class Tag= void> struct ilist_node
2627
{
27-
ilist_node()
28+
ilist_node() noexcept
2829
#ifndef DBUG_OFF
29-
:
30-
next(NULL), prev(NULL)
30+
: next(NULL), prev(NULL)
3131
#endif
3232
{
3333
}
3434

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+
}
3639

3740
ilist_node *next;
3841
ilist_node *prev;
@@ -70,40 +73,40 @@ template <class T, class Tag= void> class ilist
7073
typedef T *pointer;
7174
typedef T &reference;
7275

73-
Iterator(ListNode *node) : node_(node) {}
76+
Iterator(ListNode *node) noexcept : node_(node) {}
7477

75-
Iterator &operator++()
78+
Iterator &operator++() noexcept
7679
{
7780
node_= node_->next;
7881
return *this;
7982
}
80-
Iterator operator++(int)
83+
Iterator operator++(int) noexcept
8184
{
8285
Iterator tmp(*this);
8386
operator++();
8487
return tmp;
8588
}
8689

87-
Iterator &operator--()
90+
Iterator &operator--() noexcept
8891
{
8992
node_= node_->prev;
9093
return *this;
9194
}
92-
Iterator operator--(int)
95+
Iterator operator--(int) noexcept
9396
{
9497
Iterator tmp(*this);
9598
operator--();
9699
return tmp;
97100
}
98101

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_); }
101104

102-
friend bool operator==(const Iterator &lhs, const Iterator &rhs)
105+
friend bool operator==(const Iterator &lhs, const Iterator &rhs) noexcept
103106
{
104107
return lhs.node_ == rhs.node_;
105108
}
106-
friend bool operator!=(const Iterator &lhs, const Iterator &rhs)
109+
friend bool operator!=(const Iterator &lhs, const Iterator &rhs) noexcept
107110
{
108111
return !(lhs == rhs);
109112
}
@@ -114,44 +117,50 @@ template <class T, class Tag= void> class ilist
114117
friend class ilist;
115118
};
116119

117-
ilist() : sentinel_(&sentinel_, &sentinel_) {}
120+
ilist() noexcept : sentinel_(&sentinel_, &sentinel_) {}
118121

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(); }
123126

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
126129
{
127130
return iterator(const_cast<ListNode *>(sentinel_.next));
128131
}
129-
iterator end() { return iterator(&sentinel_); }
130-
const_iterator end() const
132+
iterator end() noexcept { return iterator(&sentinel_); }
133+
const_iterator end() const noexcept
131134
{
132135
return iterator(const_cast<ListNode *>(&sentinel_));
133136
}
134137

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+
}
139148

140-
bool empty() const { return sentinel_.next == &sentinel_; }
149+
bool empty() const noexcept { return sentinel_.next == &sentinel_; }
141150

142151
// Not implemented because it's O(N)
143152
// size_type size() const
144153
// {
145154
// return static_cast<size_type>(std::distance(begin(), end()));
146155
// }
147156

148-
void clear()
157+
void clear() noexcept
149158
{
150159
sentinel_.next= &sentinel_;
151160
sentinel_.prev= &sentinel_;
152161
}
153162

154-
iterator insert(iterator pos, reference value)
163+
iterator insert(iterator pos, reference value) noexcept
155164
{
156165
ListNode *curr= pos.node_;
157166
ListNode *prev= pos.node_->prev;
@@ -165,7 +174,7 @@ template <class T, class Tag= void> class ilist
165174
return iterator(&value);
166175
}
167176

168-
iterator erase(iterator pos)
177+
iterator erase(iterator pos) noexcept
169178
{
170179
ListNode *prev= pos.node_->prev;
171180
ListNode *next= pos.node_->next;
@@ -182,15 +191,15 @@ template <class T, class Tag= void> class ilist
182191
return next;
183192
}
184193

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()); }
187196

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()); }
190199

191200
// STL version is O(n) but this is O(1) because an element can't be inserted
192201
// several times in the same ilist.
193-
void remove(reference value) { erase(iterator(&value)); }
202+
void remove(reference value) noexcept { erase(iterator(&value)); }
194203

195204
private:
196205
ListNode sentinel_;
@@ -216,36 +225,38 @@ template <class T, class Tag= void> class sized_ilist : public ilist<T, Tag>
216225
typedef std::reverse_iterator<iterator> reverse_iterator;
217226
typedef std::reverse_iterator<const iterator> const_reverse_iterator;
218227

219-
sized_ilist() : size_(0) {}
228+
sized_ilist() noexcept : size_(0) {}
220229

221-
size_type size() const { return size_; }
230+
size_type size() const noexcept { return size_; }
222231

223-
void clear()
232+
void clear() noexcept
224233
{
225234
BASE::clear();
226235
size_= 0;
227236
}
228237

229-
iterator insert(iterator pos, reference value)
238+
iterator insert(iterator pos, reference value) noexcept
230239
{
231240
++size_;
232241
return BASE::insert(pos, value);
233242
}
234243

235-
iterator erase(iterator pos)
244+
iterator erase(iterator pos) noexcept
236245
{
237246
--size_;
238247
return BASE::erase(pos);
239248
}
240249

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()); }
243252

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()); }
246255

247-
void remove(reference value) { erase(iterator(&value)); }
256+
void remove(reference value) noexcept { erase(iterator(&value)); }
248257

249258
private:
250259
size_type size_;
251260
};
261+
262+
#endif

0 commit comments

Comments
 (0)