// -*- C++ -*- //===----------------------------------------------------------------------===// // // 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) 2025 NVIDIA CORPORATION & AFFILIATES // //===----------------------------------------------------------------------===// #ifndef _LIBCUDACXX___RANGES_OWNING_VIEW_H #define _LIBCUDACXX___RANGES_OWNING_VIEW_H #include #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 #include #include #include #include #include #include #include #include #include #include #include #include #include _LIBCUDACXX_BEGIN_NAMESPACE_RANGES _LIBCUDACXX_BEGIN_NAMESPACE_RANGES_ABI #if !defined(_CCCL_NO_CONCEPTS) template requires movable<_Rp> && (!__is_std_initializer_list>) #else // ^^^ !_CCCL_NO_CONCEPTS ^^^ / vvv _CCCL_NO_CONCEPTS vvv template , int> = 0, enable_if_t, int> = 0, enable_if_t>, int> = 0> #endif // _CCCL_NO_CONCEPTS class owning_view : public view_interface> { _Rp __r_ = _Rp(); public: #if !defined(_CCCL_NO_CONCEPTS) _CCCL_HIDE_FROM_ABI owning_view() requires default_initializable<_Rp> = default; #else // ^^^ !_CCCL_NO_CONCEPTS ^^^ / vvv _CCCL_NO_CONCEPTS vvv _CCCL_TEMPLATE(class _Range = _Rp) _CCCL_REQUIRES(default_initializable<_Range>) _LIBCUDACXX_HIDE_FROM_ABI constexpr owning_view() noexcept(is_nothrow_default_constructible_v<_Range>) : view_interface>() {} #endif // _CCCL_NO_CONCEPTS _LIBCUDACXX_HIDE_FROM_ABI constexpr owning_view(_Rp&& __r) noexcept(is_nothrow_move_constructible_v<_Rp>) : view_interface>() , __r_(_CUDA_VSTD::move(__r)) {} _CCCL_HIDE_FROM_ABI owning_view(owning_view&&) = default; _CCCL_HIDE_FROM_ABI owning_view& operator=(owning_view&&) = default; _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr _Rp& base() & noexcept { return __r_; } _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr const _Rp& base() const& noexcept { return __r_; } _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr _Rp&& base() && noexcept { return _CUDA_VSTD::move(__r_); } _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr const _Rp&& base() const&& noexcept { return _CUDA_VSTD::move(__r_); } _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr iterator_t<_Rp> begin() { return _CUDA_VRANGES::begin(__r_); } _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr sentinel_t<_Rp> end() { return _CUDA_VRANGES::end(__r_); } _CCCL_TEMPLATE(class _Range = _Rp) _CCCL_REQUIRES(range) _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr auto begin() const { return _CUDA_VRANGES::begin(__r_); } _CCCL_TEMPLATE(class _Range = _Rp) _CCCL_REQUIRES(range) _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr auto end() const { return _CUDA_VRANGES::end(__r_); } _CCCL_TEMPLATE(class _Range = _Rp) _CCCL_REQUIRES(invocable<_CUDA_VRANGES::__empty::__fn, _Range&>) _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr bool empty() { return _CUDA_VRANGES::empty(__r_); } _CCCL_TEMPLATE(class _Range = _Rp) _CCCL_REQUIRES(invocable<_CUDA_VRANGES::__empty::__fn, const _Range&>) _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr bool empty() const { return _CUDA_VRANGES::empty(__r_); } _CCCL_TEMPLATE(class _Range = _Rp) _CCCL_REQUIRES(sized_range<_Range>) _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr auto size() { return _CUDA_VRANGES::size(__r_); } _CCCL_TEMPLATE(class _Range = _Rp) _CCCL_REQUIRES(sized_range) _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr auto size() const { return _CUDA_VRANGES::size(__r_); } _CCCL_TEMPLATE(class _Range = _Rp) _CCCL_REQUIRES(contiguous_range<_Range>) _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr auto data() { return _CUDA_VRANGES::data(__r_); } _CCCL_TEMPLATE(class _Range = _Rp) _CCCL_REQUIRES(contiguous_range) _CCCL_NODISCARD _LIBCUDACXX_HIDE_FROM_ABI constexpr auto data() const { return _CUDA_VRANGES::data(__r_); } }; _LIBCUDACXX_CTAD_SUPPORTED_FOR_TYPE(owning_view); _LIBCUDACXX_END_NAMESPACE_RANGES_ABI template _CCCL_INLINE_VAR constexpr bool enable_borrowed_range> = enable_borrowed_range<_Rp>; _LIBCUDACXX_END_NAMESPACE_RANGES #endif // _LIBCUDACXX___RANGES_OWNING_VIEW_H