From 64bfc39f67039ba0a7fd50f1bf23241486bc7966 Mon Sep 17 00:00:00 2001 From: nouman-10x Date: Sun, 8 Sep 2024 20:39:31 +0500 Subject: [PATCH] Remove conditonal check --- libcxx/include/__algorithm/fill.h | 3 +- .../alg.fill/fill_n.pass.cpp | 174 ++++++++++++++++++ 2 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 libcxx/test/std/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp diff --git a/libcxx/include/__algorithm/fill.h b/libcxx/include/__algorithm/fill.h index 93aa980d8f12dc..c64593a6ac95f2 100644 --- a/libcxx/include/__algorithm/fill.h +++ b/libcxx/include/__algorithm/fill.h @@ -44,8 +44,7 @@ __fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& _ } template ::value, int> = 0> + class _Tp> inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __fill(_SegmentedIterator __first, _SegmentedIterator __last, const _Tp& __value) { std::for_each(__first, __last, [__value](_Tp& __val) { __val = __value; }); diff --git a/libcxx/test/std/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp b/libcxx/test/std/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp new file mode 100644 index 00000000000000..c682e3335a58fc --- /dev/null +++ b/libcxx/test/std/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp @@ -0,0 +1,174 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// template +// requires OutputIterator +// constexpr OutputIterator // constexpr after C++17 +// fill_n(Iter first, Size n, const T& value); + +#include +#include + +#include "test_macros.h" +#include "test_iterators.h" +#include "user_defined_integral.h" + +#if TEST_STD_VER > 17 +TEST_CONSTEXPR bool test_constexpr() { + const std::size_t N = 5; + int ib[] = {0, 0, 0, 0, 0, 0}; // one bigger than N + + auto it = std::fill_n(std::begin(ib), N, 5); + return it == (std::begin(ib) + N) + && std::all_of(std::begin(ib), it, [](int a) {return a == 5; }) + && *it == 0 // don't overwrite the last value in the output array + ; + } +#endif + +typedef UserDefinedIntegral UDI; + +template +void +test_char() +{ + char a[4] = {}; + Iter it = std::fill_n(Iter(a), UDI(4), char(1)); + assert(base(it) == a + 4); + assert(a[0] == 1); + assert(a[1] == 1); + assert(a[2] == 1); + assert(a[3] == 1); +} + +template +void +test_int() +{ + int a[4] = {}; + Iter it = std::fill_n(Iter(a), UDI(4), 1); + assert(base(it) == a + 4); + assert(a[0] == 1); + assert(a[1] == 1); + assert(a[2] == 1); + assert(a[3] == 1); +} + +void +test_int_array() +{ + int a[4] = {}; + assert(std::fill_n(a, UDI(4), static_cast(1)) == a + 4); + assert(a[0] == 1); + assert(a[1] == 1); + assert(a[2] == 1); + assert(a[3] == 1); +} + +struct source { + source() : i(0) { } + + operator int() const { return i++; } + mutable int i; +}; + +void +test_int_array_struct_source() +{ + int a[4] = {}; + assert(std::fill_n(a, UDI(4), source()) == a + 4); + assert(a[0] == 0); + assert(a[1] == 1); + assert(a[2] == 2); + assert(a[3] == 3); +} + +struct test1 { + test1() : c(0) { } + test1(char xc) : c(xc + 1) { } + char c; +}; + +void +test_struct_array() +{ + test1 test1a[4] = {}; + assert(std::fill_n(test1a, UDI(4), static_cast(10)) == test1a + 4); + assert(test1a[0].c == 11); + assert(test1a[1].c == 11); + assert(test1a[2].c == 11); + assert(test1a[3].c == 11); +} + +class A +{ + char a_; +public: + A() {} + explicit A(char a) : a_(a) {} + operator unsigned char() const {return 'b';} + + friend bool operator==(const A& x, const A& y) + {return x.a_ == y.a_;} +}; + +void +test5() +{ + A a[3]; + assert(std::fill_n(&a[0], UDI(3), A('a')) == a+3); + assert(a[0] == A('a')); + assert(a[1] == A('a')); + assert(a[2] == A('a')); +} + +struct Storage +{ + union + { + unsigned char a; + unsigned char b; + }; +}; + +void test6() +{ + Storage foo[5]; + std::fill_n(&foo[0], UDI(5), Storage()); +} + + +int main(int, char**) +{ + test_char >(); + test_char >(); + test_char >(); + test_char >(); + test_char(); + + test_int >(); + test_int >(); + test_int >(); + test_int >(); + test_int(); + + test_int_array(); + test_int_array_struct_source(); + test_struct_array(); + + test5(); + test6(); + +#if TEST_STD_VER > 17 + static_assert(test_constexpr()); +#endif + + return 0; +} \ No newline at end of file