Skip to content

Commit f477816

Browse files
committed
[vector] Add specialization of fill_n
Addresses #625
1 parent a714e76 commit f477816

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

stl/inc/xutility

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4596,7 +4596,11 @@ _CONSTEXPR20 _OutIt fill_n(_OutIt _Dest, const _Diff _Count_raw, const _Ty& _Val
45964596
_Algorithm_int_t<_Diff> _Count = _Count_raw;
45974597
if (0 < _Count) {
45984598
auto _UDest = _Get_unwrapped_n(_Dest, _Count);
4599-
if constexpr (_Fill_memset_is_safe<decltype(_UDest), _Ty>) {
4599+
if constexpr (_Is_vb_iterator<_OutIt>) {
4600+
const auto _Last = _Dest + static_cast<typename _OutIt::difference_type>(_Count);
4601+
_Fill_vbool(_Dest, _Last, _Val);
4602+
return _Last;
4603+
} else if constexpr (_Fill_memset_is_safe<decltype(_UDest), _Ty>) {
46004604
#ifdef __cpp_lib_is_constant_evaluated
46014605
if (!_STD is_constant_evaluated())
46024606
#endif // __cpp_lib_is_constant_evaluated

tests/std/tests/GH_000625_vector_bool_optimization/test.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,19 @@ void test_fill_helper(const size_t length) {
2424
vector<bool> dest_false(length + 3, true);
2525
fill(dest_false.begin(), prev(dest_false.end(), 3), false);
2626
assert(dest_false == result_false);
27+
28+
vector<bool> result_true_n(length, true);
29+
result_true_n.resize(length + 3, false);
30+
vector<bool> dest_true_n(length + 3, false);
31+
const auto res_fill_n = fill_n(dest_true_n.begin(), length, true);
32+
assert(dest_true_n == result_true_n);
33+
assert(res_fill_n == prev(dest_true_n.end(), 3));
34+
35+
vector<bool> result_false_n(length, false);
36+
result_false_n.resize(length + 3, true);
37+
vector<bool> dest_false_n(length + 3, true);
38+
fill_n(dest_false_n.begin(), length, false);
39+
assert(dest_false_n == result_false_n);
2740
}
2841

2942
// With offset
@@ -41,6 +54,21 @@ void test_fill_helper(const size_t length) {
4154
vector<bool> dest_false(length + 4, true);
4255
fill(next(dest_false.begin()), prev(dest_false.end(), 3), false);
4356
assert(dest_false == result_false);
57+
58+
vector<bool> result_true_n(length, true);
59+
result_true_n.resize(length + 3, false);
60+
result_true_n.insert(result_true_n.begin(), false);
61+
vector<bool> dest_true_n(length + 4, false);
62+
const auto res_fill_n = fill_n(next(dest_true_n.begin()), length, true);
63+
assert(dest_true_n == result_true_n);
64+
assert(res_fill_n == prev(dest_true_n.end(), 3));
65+
66+
vector<bool> result_false_n(length, false);
67+
result_false_n.resize(length + 3, true);
68+
result_false_n.insert(result_false_n.begin(), true);
69+
vector<bool> dest_false_n(length + 4, true);
70+
fill_n(next(dest_false_n.begin()), length, false);
71+
assert(dest_false_n == result_false_n);
4472
}
4573
}
4674

0 commit comments

Comments
 (0)