Skip to content

Commit 71a35c6

Browse files
committed
Refactor to simplify resize(n) and resize(n, value)
1 parent 7380f53 commit 71a35c6

File tree

1 file changed

+14
-34
lines changed

1 file changed

+14
-34
lines changed

libcxx/include/forward_list

Lines changed: 14 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,9 @@ public:
806806
}
807807
# endif // _LIBCPP_CXX03_LANG
808808
_LIBCPP_HIDE_FROM_ABI iterator insert_after(const_iterator __p, const value_type& __v);
809-
_LIBCPP_HIDE_FROM_ABI iterator insert_after(const_iterator __p, size_type __n, const value_type& __v);
809+
_LIBCPP_HIDE_FROM_ABI iterator insert_after(const_iterator __p, size_type __n, const value_type& __v) {
810+
return __insert_after(__p, __n, __v);
811+
}
810812
template <class _InputIterator, __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0>
811813
_LIBCPP_HIDE_FROM_ABI iterator insert_after(const_iterator __p, _InputIterator __f, _InputIterator __l);
812814

@@ -876,6 +878,9 @@ private:
876878
template <class _Iter, class _Sent>
877879
_LIBCPP_HIDE_FROM_ABI void __assign_with_sentinel(_Iter __f, _Sent __l);
878880

881+
template <class... _Args>
882+
_LIBCPP_HIDE_FROM_ABI iterator __insert_after(const_iterator __p, size_type __n, _Args&&... __args);
883+
879884
template <class _Compare>
880885
static _LIBCPP_HIDE_FROM_ABI __node_pointer __merge(__node_pointer __f1, __node_pointer __f2, _Compare& __comp);
881886

@@ -1129,17 +1134,18 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __
11291134
}
11301135

11311136
template <class _Tp, class _Alloc>
1137+
template <class... _Args>
11321138
typename forward_list<_Tp, _Alloc>::iterator
1133-
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n, const value_type& __v) {
1139+
forward_list<_Tp, _Alloc>::__insert_after(const_iterator __p, size_type __n, _Args&&... __args) {
11341140
__begin_node_pointer __r = __p.__get_begin();
11351141
if (__n > 0) {
1136-
__node_pointer __first = this->__create_node(/* next = */ nullptr, __v);
1142+
__node_pointer __first = this->__create_node(/* next = */ nullptr, std::forward<_Args>(__args)...);
11371143
__node_pointer __last = __first;
11381144
# if _LIBCPP_HAS_EXCEPTIONS
11391145
try {
11401146
# endif // _LIBCPP_HAS_EXCEPTIONS
11411147
for (--__n; __n != 0; --__n, __last = __last->__next_) {
1142-
__last->__next_ = this->__create_node(/* next = */ nullptr, __v);
1148+
__last->__next_ = this->__create_node(/* next = */ nullptr, std::forward<_Args>(__args)...);
11431149
}
11441150
# if _LIBCPP_HAS_EXCEPTIONS
11451151
} catch (...) {
@@ -1239,33 +1245,8 @@ void forward_list<_Tp, _Alloc>::resize(size_type __n) {
12391245
;
12401246
if (__i != __e)
12411247
erase_after(__p, __e);
1242-
else {
1243-
__n -= __sz;
1244-
__begin_node_pointer __r = __p.__get_begin();
1245-
if (__n > 0) {
1246-
__node_pointer __first = this->__create_node(/* next = */ nullptr);
1247-
__node_pointer __last = __first;
1248-
# if _LIBCPP_HAS_EXCEPTIONS
1249-
try {
1250-
# endif // _LIBCPP_HAS_EXCEPTIONS
1251-
for (--__n; __n != 0; --__n, __last = __last->__next_) {
1252-
__last->__next_ = this->__create_node(/* next = */ nullptr);
1253-
}
1254-
# if _LIBCPP_HAS_EXCEPTIONS
1255-
} catch (...) {
1256-
while (__first != nullptr) {
1257-
__node_pointer __next = __first->__next_;
1258-
this->__delete_node(__first);
1259-
__first = __next;
1260-
}
1261-
throw;
1262-
}
1263-
# endif // _LIBCPP_HAS_EXCEPTIONS
1264-
__last->__next_ = __r->__next_;
1265-
__r->__next_ = __first;
1266-
__r = static_cast<__begin_node_pointer>(__last);
1267-
}
1268-
}
1248+
else
1249+
__insert_after(__p, __n - __sz);
12691250
}
12701251

12711252
template <class _Tp, class _Alloc>
@@ -1278,9 +1259,8 @@ void forward_list<_Tp, _Alloc>::resize(size_type __n, const value_type& __v) {
12781259
;
12791260
if (__i != __e)
12801261
erase_after(__p, __e);
1281-
else {
1282-
insert_after(__p, __n - __sz, __v);
1283-
}
1262+
else
1263+
__insert_after(__p, __n - __sz, __v);
12841264
}
12851265

12861266
template <class _Tp, class _Alloc>

0 commit comments

Comments
 (0)