From d2d4e7cb39247183a0472f64ee85b22c5e5183df Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 29 Nov 2023 12:37:30 +0100 Subject: [PATCH] Move `std::remove_copy_if` to its own file --- .../std/detail/libcxx/include/CMakeLists.txt | 1 + .../include/__algorithm/remove_copy_if.h | 44 ++++++++++ .../cuda/std/detail/libcxx/include/algorithm | 19 +--- .../alg.remove/remove_copy_if.pass.cpp | 86 +++++++++++++++++++ 4 files changed, 132 insertions(+), 18 deletions(-) create mode 100644 libcudacxx/include/cuda/std/detail/libcxx/include/__algorithm/remove_copy_if.h create mode 100644 libcudacxx/test/libcudacxx/std/algorithms/alg.modifying/alg.remove/remove_copy_if.pass.cpp diff --git a/libcudacxx/include/cuda/std/detail/libcxx/include/CMakeLists.txt b/libcudacxx/include/cuda/std/detail/libcxx/include/CMakeLists.txt index 00fae633713..1ef32cac3fd 100644 --- a/libcudacxx/include/cuda/std/detail/libcxx/include/CMakeLists.txt +++ b/libcudacxx/include/cuda/std/detail/libcxx/include/CMakeLists.txt @@ -30,6 +30,7 @@ set(files __algorithm/move_backward.h __algorithm/move.h __algorithm/none_of.h + __algorithm/remove_copy_if.h __algorithm/remove_copy.h __algorithm/remove_if.h __algorithm/remove.h diff --git a/libcudacxx/include/cuda/std/detail/libcxx/include/__algorithm/remove_copy_if.h b/libcudacxx/include/cuda/std/detail/libcxx/include/__algorithm/remove_copy_if.h new file mode 100644 index 00000000000..8443eee8a76 --- /dev/null +++ b/libcudacxx/include/cuda/std/detail/libcxx/include/__algorithm/remove_copy_if.h @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCUDACXX___ALGORITHM_REMOVE_COPY_IF_H +#define _LIBCUDACXX___ALGORITHM_REMOVE_COPY_IF_H + +#ifndef __cuda_std__ +# include <__config> +#endif // __cuda_std__ + +#if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC) +# pragma GCC system_header +#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG) +# pragma clang system_header +#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC) +# pragma system_header +#endif // no system header + +_LIBCUDACXX_BEGIN_NAMESPACE_STD + +template +inline _LIBCUDACXX_HIDE_FROM_ABI _LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX11 _OutputIterator +remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred) +{ + for (; __first != __last; ++__first) + { + if (!__pred(*__first)) + { + *__result = *__first; + ++__result; + } + } + return __result; +} + +_LIBCUDACXX_END_NAMESPACE_STD + +#endif // _LIBCUDACXX___ALGORITHM_REMOVE_COPY_IF_H diff --git a/libcudacxx/include/cuda/std/detail/libcxx/include/algorithm b/libcudacxx/include/cuda/std/detail/libcxx/include/algorithm index 3c2653f3be5..e8565a86c88 100644 --- a/libcudacxx/include/cuda/std/detail/libcxx/include/algorithm +++ b/libcudacxx/include/cuda/std/detail/libcxx/include/algorithm @@ -670,6 +670,7 @@ template #include "__algorithm/move_backward.h" #include "__algorithm/move.h" #include "__algorithm/none_of.h" +#include "__algorithm/remove_copy_if.h" #include "__algorithm/remove_copy.h" #include "__algorithm/remove_if.h" #include "__algorithm/remove.h" @@ -740,24 +741,6 @@ public: bool operator()(const _T1& __x, const _T2& __y) {return __p_(__y, __x);} }; -// remove_copy_if - -template -inline _LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 -_OutputIterator -remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred) -{ - for (; __first != __last; ++__first) - { - if (!__pred(*__first)) - { - *__result = *__first; - ++__result; - } - } - return __result; -} - // unique template diff --git a/libcudacxx/test/libcudacxx/std/algorithms/alg.modifying/alg.remove/remove_copy_if.pass.cpp b/libcudacxx/test/libcudacxx/std/algorithms/alg.modifying/alg.remove/remove_copy_if.pass.cpp new file mode 100644 index 00000000000..286473e378c --- /dev/null +++ b/libcudacxx/test/libcudacxx/std/algorithms/alg.modifying/alg.remove/remove_copy_if.pass.cpp @@ -0,0 +1,86 @@ +//===----------------------------------------------------------------------===// +// +// 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 OutIter, +// Predicate Pred> +// requires CopyConstructible +// constexpr OutIter // constexpr after C++17 +// remove_copy_if(InIter first, InIter last, OutIter result, Pred pred); + +#include +#include +#include + +#include "test_macros.h" +#include "test_iterators.h" + +__host__ __device__ TEST_CONSTEXPR bool equalToTwo(const int v) noexcept { return v == 2; } + +template +TEST_CONSTEXPR_CXX14 __host__ __device__ void test() { + constexpr int N = 9; + int ia[N] = {0, 1, 2, 3, 4, 2, 3, 4, 2}; + constexpr int expected[N - 3] = {0, 1, 3, 4, 3, 4}; + int ib[N] = {0}; + OutIter r = + cuda::std::remove_copy_if(InIter(ia), InIter(ia + N), OutIter(ib), equalToTwo); + assert(base(r) == ib + N - 3); + for (int i = 0; i < N - 3; ++i) { + assert(ib[i] == expected[i]); + } + + for (int i = N - 3; i < N; ++i) { + assert(ib[i] == 0); + } +} + +TEST_CONSTEXPR_CXX14 __host__ __device__ bool test() { + test, cpp17_output_iterator >(); + test, forward_iterator >(); + test, bidirectional_iterator >(); + test, random_access_iterator >(); + test, int*>(); + + test, cpp17_output_iterator >(); + test, forward_iterator >(); + test, bidirectional_iterator >(); + test, random_access_iterator >(); + test, int*>(); + + test, cpp17_output_iterator >(); + test, forward_iterator >(); + test, bidirectional_iterator >(); + test, random_access_iterator >(); + test, int*>(); + + test, cpp17_output_iterator >(); + test, forward_iterator >(); + test, bidirectional_iterator >(); + test, random_access_iterator >(); + test, int*>(); + + test >(); + test >(); + test >(); + test >(); + test(); + + return true; +} + +int main(int, char**) { + test(); + +#if TEST_STD_VER >= 14 + static_assert(test(), ""); +#endif // TEST_STD_VER >= 14 + + return 0; +}