xref: /llvm-project/libcxx/include/__fwd/subrange.h (revision d6832a611a7c4ec36f08b1cfe9af850dad32da2e)
194461822SHui Xie //===---------------------------------------------------------------------===//
294461822SHui Xie //
394461822SHui Xie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
494461822SHui Xie // See https://llvm.org/LICENSE.txt for license information.
594461822SHui Xie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
694461822SHui Xie //
794461822SHui Xie //===---------------------------------------------------------------------===//
894461822SHui Xie 
994461822SHui Xie #ifndef _LIBCPP___FWD_SUBRANGE_H
1094461822SHui Xie #define _LIBCPP___FWD_SUBRANGE_H
1194461822SHui Xie 
12f9d6d6fbSNikolas Klauser #include <__concepts/copyable.h>
1394461822SHui Xie #include <__config>
14*d6832a61SLouis Dionne #include <__cstddef/size_t.h>
15f9d6d6fbSNikolas Klauser #include <__iterator/concepts.h>
1694461822SHui Xie 
1794461822SHui Xie #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1894461822SHui Xie #  pragma GCC system_header
1994461822SHui Xie #endif
2094461822SHui Xie 
2194461822SHui Xie #if _LIBCPP_STD_VER >= 20
2294461822SHui Xie 
2394461822SHui Xie _LIBCPP_BEGIN_NAMESPACE_STD
2494461822SHui Xie 
2594461822SHui Xie namespace ranges {
2694461822SHui Xie 
273583bf3aSNikolas Klauser enum class subrange_kind : bool { unsized, sized };
2894461822SHui Xie 
2994461822SHui Xie template <input_or_output_iterator _Iter, sentinel_for<_Iter> _Sent, subrange_kind _Kind>
3094461822SHui Xie   requires(_Kind == subrange_kind::sized || !sized_sentinel_for<_Sent, _Iter>)
3194461822SHui Xie class _LIBCPP_TEMPLATE_VIS subrange;
3294461822SHui Xie 
33f9d6d6fbSNikolas Klauser template <size_t _Index, class _Iter, class _Sent, subrange_kind _Kind>
34f9d6d6fbSNikolas Klauser   requires((_Index == 0 && copyable<_Iter>) || _Index == 1)
35f9d6d6fbSNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr auto get(const subrange<_Iter, _Sent, _Kind>&);
36f9d6d6fbSNikolas Klauser 
37f9d6d6fbSNikolas Klauser template <size_t _Index, class _Iter, class _Sent, subrange_kind _Kind>
38f9d6d6fbSNikolas Klauser   requires(_Index < 2)
39f9d6d6fbSNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr auto get(subrange<_Iter, _Sent, _Kind>&&);
40f9d6d6fbSNikolas Klauser 
4194461822SHui Xie } // namespace ranges
4294461822SHui Xie 
43f9d6d6fbSNikolas Klauser using ranges::get;
44f9d6d6fbSNikolas Klauser 
4594461822SHui Xie _LIBCPP_END_NAMESPACE_STD
4694461822SHui Xie 
4794461822SHui Xie #endif // _LIBCPP_STD_VER >= 20
4894461822SHui Xie 
4994461822SHui Xie #endif // _LIBCPP___FWD_SUBRANGE_H
50