@@ -806,7 +806,9 @@ public:
806
806
}
807
807
# endif // _LIBCPP_CXX03_LANG
808
808
_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
+ }
810
812
template <class _InputIterator , __enable_if_t <__has_input_iterator_category<_InputIterator>::value, int > = 0 >
811
813
_LIBCPP_HIDE_FROM_ABI iterator insert_after (const_iterator __p, _InputIterator __f, _InputIterator __l);
812
814
@@ -876,6 +878,9 @@ private:
876
878
template <class _Iter , class _Sent >
877
879
_LIBCPP_HIDE_FROM_ABI void __assign_with_sentinel (_Iter __f, _Sent __l);
878
880
881
+ template <class ... _Args>
882
+ _LIBCPP_HIDE_FROM_ABI iterator __insert_after (const_iterator __p, size_type __n, _Args&&... __args);
883
+
879
884
template <class _Compare >
880
885
static _LIBCPP_HIDE_FROM_ABI __node_pointer __merge (__node_pointer __f1, __node_pointer __f2, _Compare& __comp);
881
886
@@ -1129,17 +1134,18 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __
1129
1134
}
1130
1135
1131
1136
template <class _Tp , class _Alloc >
1137
+ template <class ... _Args>
1132
1138
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 ) {
1134
1140
__begin_node_pointer __r = __p.__get_begin ();
1135
1141
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)... );
1137
1143
__node_pointer __last = __first;
1138
1144
# if _LIBCPP_HAS_EXCEPTIONS
1139
1145
try {
1140
1146
# endif // _LIBCPP_HAS_EXCEPTIONS
1141
1147
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)... );
1143
1149
}
1144
1150
# if _LIBCPP_HAS_EXCEPTIONS
1145
1151
} catch (...) {
@@ -1239,33 +1245,8 @@ void forward_list<_Tp, _Alloc>::resize(size_type __n) {
1239
1245
;
1240
1246
if (__i != __e)
1241
1247
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);
1269
1250
}
1270
1251
1271
1252
template <class _Tp , class _Alloc >
@@ -1278,9 +1259,8 @@ void forward_list<_Tp, _Alloc>::resize(size_type __n, const value_type& __v) {
1278
1259
;
1279
1260
if (__i != __e)
1280
1261
erase_after (__p, __e);
1281
- else {
1282
- insert_after (__p, __n - __sz, __v);
1283
- }
1262
+ else
1263
+ __insert_after (__p, __n - __sz, __v);
1284
1264
}
1285
1265
1286
1266
template <class _Tp , class _Alloc >
0 commit comments