[libcxx-commits] [libcxx] [libc++] <experimental/simd> Add operator value_type() of simd reference (PR #68960)

via libcxx-commits libcxx-commits at lists.llvm.org
Fri Oct 13 00:32:37 PDT 2023


https://github.com/joy2myself updated https://github.com/llvm/llvm-project/pull/68960

>From 0a213f3243f86288b811c306c1809eaf1b1c2c75 Mon Sep 17 00:00:00 2001
From: Zhangyin <zhangyin2018 at iscas.ac.cn>
Date: Mon, 25 Sep 2023 16:29:03 +0800
Subject: [PATCH] [libc++] <experimental/simd> Add operator value_type() of
 simd reference

---
 libcxx/docs/Status/ParallelismProjects.csv    |  1 +
 .../include/experimental/__simd/reference.h   |  2 +
 .../reference_value_type.pass.cpp             | 49 +++++++++++++++++++
 3 files changed, 52 insertions(+)
 create mode 100644 libcxx/test/std/experimental/simd/simd.reference/reference_value_type.pass.cpp

diff --git a/libcxx/docs/Status/ParallelismProjects.csv b/libcxx/docs/Status/ParallelismProjects.csv
index be3663bf087b47e..dd14e963281e99f 100644
--- a/libcxx/docs/Status/ParallelismProjects.csv
+++ b/libcxx/docs/Status/ParallelismProjects.csv
@@ -14,6 +14,7 @@ Section,Description,Dependencies,Assignee,Complete
 | `[parallel.simd.traits] <https://wg21.link/N4808>`_, "simd type traits rebind_simd", None, Yin Zhang, |In Progress|
 | `[parallel.simd.traits] <https://wg21.link/N4808>`_, "simd type traits resize_simd", None, Yin Zhang, |In Progress|
 | `[parallel.simd.whereexpr] <https://wg21.link/N4808>`_, "Where expression class templates", None, Yin Zhang, |In Progress|
+| `[parallel.simd.reference] <https://wg21.link/N4808>`_, "`Element references operator value_type() <https://github.com/llvm/llvm-project/pull/68960>`_", None, Yin Zhang, |Complete|
 | `[parallel.simd.class] <https://wg21.link/N4808>`_, "`Class template simd declaration and alias <https://reviews.llvm.org/D144362>`_", [parallel.simd.abi], Yin Zhang, |Complete|
 | `[parallel.simd.class] <https://wg21.link/N4808>`_, "`simd<>::size() <https://reviews.llvm.org/D144363>`_", [parallel.simd.traits] simd_size[_v], Yin Zhang, |Complete|
 | `[parallel.simd.class] <https://wg21.link/N4808>`_, "`simd broadcast constructor <https://reviews.llvm.org/D156225>`_", None, Yin Zhang, |Complete|
diff --git a/libcxx/include/experimental/__simd/reference.h b/libcxx/include/experimental/__simd/reference.h
index a9c17a230458d61..63b00848a849c4b 100644
--- a/libcxx/include/experimental/__simd/reference.h
+++ b/libcxx/include/experimental/__simd/reference.h
@@ -40,6 +40,8 @@ class __simd_reference {
 
   __simd_reference()                        = delete;
   __simd_reference(const __simd_reference&) = delete;
+
+  _LIBCPP_HIDE_FROM_ABI operator value_type() const noexcept { return __get(); }
 };
 
 } // namespace parallelism_v2
diff --git a/libcxx/test/std/experimental/simd/simd.reference/reference_value_type.pass.cpp b/libcxx/test/std/experimental/simd/simd.reference/reference_value_type.pass.cpp
new file mode 100644
index 000000000000000..3191cc7b238c34c
--- /dev/null
+++ b/libcxx/test/std/experimental/simd/simd.reference/reference_value_type.pass.cpp
@@ -0,0 +1,49 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14
+
+// <experimental/simd>
+//
+// [simd.reference]
+// operator value_type() const noexcept;
+
+#include "../test_utils.h"
+#include <experimental/simd>
+
+namespace ex = std::experimental::parallelism_v2;
+
+template <class T, std::size_t>
+struct CheckSimdReferenceValueType {
+  template <class SimdAbi>
+  void operator()() {
+    ex::simd<T, SimdAbi> origin_simd([](T i) { return static_cast<T>(i); });
+    for (size_t i = 0; i < origin_simd.size(); ++i) {
+      static_assert(std::is_same_v<T, decltype(T(origin_simd[i]))>);
+      assert(T(origin_simd[i]) == static_cast<T>(i));
+    }
+  }
+};
+
+template <class T, std::size_t>
+struct CheckMaskReferenceValueType {
+  template <class SimdAbi>
+  void operator()() {
+    ex::simd_mask<T, SimdAbi> origin_simd_mask(true);
+    for (size_t i = 0; i < origin_simd_mask.size(); ++i) {
+      static_assert(std::is_same_v<bool, decltype(bool(origin_simd_mask[i]))>);
+      assert(bool(origin_simd_mask[i]) == true);
+    }
+  }
+};
+
+int main(int, char**) {
+  test_all_simd_abi<CheckSimdReferenceValueType>();
+  test_all_simd_abi<CheckMaskReferenceValueType>();
+  return 0;
+}



More information about the libcxx-commits mailing list