File indexing completed on 2026-05-03 08:13:45
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LIBCPP___CXX03_EXPERIMENTAL___SIMD_SIMD_MASK_H
0011 #define _LIBCPP___CXX03_EXPERIMENTAL___SIMD_SIMD_MASK_H
0012
0013 #include <__cxx03/__type_traits/is_same.h>
0014 #include <__cxx03/cstddef>
0015 #include <__cxx03/experimental/__config>
0016 #include <__cxx03/experimental/__simd/declaration.h>
0017 #include <__cxx03/experimental/__simd/reference.h>
0018 #include <__cxx03/experimental/__simd/traits.h>
0019
0020 #if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
0021
0022 _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
0023 inline namespace parallelism_v2 {
0024
0025
0026
0027 template <class _Tp, class _Abi>
0028 class simd_mask {
0029 using _Impl = __mask_operations<_Tp, _Abi>;
0030 using _Storage = typename _Impl::_MaskStorage;
0031
0032 _Storage __s_;
0033
0034 public:
0035 using value_type = bool;
0036 using reference = __simd_reference<_Tp, _Storage, value_type>;
0037 using simd_type = simd<_Tp, _Abi>;
0038 using abi_type = _Abi;
0039
0040 static _LIBCPP_HIDE_FROM_ABI constexpr size_t size() noexcept { return simd_type::size(); }
0041
0042 _LIBCPP_HIDE_FROM_ABI simd_mask() noexcept = default;
0043
0044
0045 _LIBCPP_HIDE_FROM_ABI explicit simd_mask(value_type __v) noexcept : __s_(_Impl::__broadcast(__v)) {}
0046
0047
0048 template <class _Up, enable_if_t<!is_same_v<_Up, _Tp> && is_same_v<abi_type, simd_abi::fixed_size<size()>>, int> = 0>
0049 _LIBCPP_HIDE_FROM_ABI simd_mask(const simd_mask<_Up, simd_abi::fixed_size<size()>>& __v) noexcept {
0050 for (size_t __i = 0; __i < size(); __i++) {
0051 (*this)[__i] = __v[__i];
0052 }
0053 }
0054
0055
0056 template <class _Flags, enable_if_t<is_simd_flag_type_v<_Flags>, int> = 0>
0057 _LIBCPP_HIDE_FROM_ABI simd_mask(const value_type* __mem, _Flags) {
0058 _Impl::__load(__s_, _Flags::template __apply<simd_mask>(__mem));
0059 }
0060
0061
0062 template <class _Flags, enable_if_t<is_simd_flag_type_v<_Flags>, int> = 0>
0063 _LIBCPP_HIDE_FROM_ABI void copy_from(const value_type* __mem, _Flags) {
0064 _Impl::__load(__s_, _Flags::template __apply<simd_mask>(__mem));
0065 }
0066
0067 template <class _Flags, enable_if_t<is_simd_flag_type_v<_Flags>, int> = 0>
0068 _LIBCPP_HIDE_FROM_ABI void copy_to(value_type* __mem, _Flags) const {
0069 _Impl::__store(__s_, _Flags::template __apply<simd_mask>(__mem));
0070 }
0071
0072
0073 _LIBCPP_HIDE_FROM_ABI reference operator[](size_t __i) noexcept { return reference(__s_, __i); }
0074 _LIBCPP_HIDE_FROM_ABI value_type operator[](size_t __i) const noexcept { return __s_.__get(__i); }
0075 };
0076
0077 template <class _Tp, class _Abi>
0078 inline constexpr bool is_simd_mask_v<simd_mask<_Tp, _Abi>> = true;
0079
0080 template <class _Tp>
0081 using native_simd_mask = simd_mask<_Tp, simd_abi::native<_Tp>>;
0082
0083 template <class _Tp, int _Np>
0084 using fixed_size_simd_mask = simd_mask<_Tp, simd_abi::fixed_size<_Np>>;
0085
0086 }
0087 _LIBCPP_END_NAMESPACE_EXPERIMENTAL
0088
0089 #endif
0090 #endif