xref: /freebsd-src/contrib/llvm-project/libcxx/include/__ranges/all.h (revision fe6060f10f634930ff71b7c50291ddc610da2475)
1*fe6060f1SDimitry Andric // -*- C++ -*-
2*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
3*fe6060f1SDimitry Andric //
4*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
6*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*fe6060f1SDimitry Andric //
8*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
9*fe6060f1SDimitry Andric #ifndef _LIBCPP___RANGES_ALL_H
10*fe6060f1SDimitry Andric #define _LIBCPP___RANGES_ALL_H
11*fe6060f1SDimitry Andric 
12*fe6060f1SDimitry Andric #include <__config>
13*fe6060f1SDimitry Andric #include <__iterator/concepts.h>
14*fe6060f1SDimitry Andric #include <__iterator/iterator_traits.h>
15*fe6060f1SDimitry Andric #include <__ranges/access.h>
16*fe6060f1SDimitry Andric #include <__ranges/concepts.h>
17*fe6060f1SDimitry Andric #include <__ranges/ref_view.h>
18*fe6060f1SDimitry Andric #include <__ranges/subrange.h>
19*fe6060f1SDimitry Andric #include <__utility/__decay_copy.h>
20*fe6060f1SDimitry Andric #include <__utility/declval.h>
21*fe6060f1SDimitry Andric #include <__utility/forward.h>
22*fe6060f1SDimitry Andric #include <type_traits>
23*fe6060f1SDimitry Andric 
24*fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
25*fe6060f1SDimitry Andric #pragma GCC system_header
26*fe6060f1SDimitry Andric #endif
27*fe6060f1SDimitry Andric 
28*fe6060f1SDimitry Andric _LIBCPP_PUSH_MACROS
29*fe6060f1SDimitry Andric #include <__undef_macros>
30*fe6060f1SDimitry Andric 
31*fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
32*fe6060f1SDimitry Andric 
33*fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_RANGES)
34*fe6060f1SDimitry Andric 
35*fe6060f1SDimitry Andric namespace views {
36*fe6060f1SDimitry Andric 
37*fe6060f1SDimitry Andric namespace __all {
38*fe6060f1SDimitry Andric   struct __fn {
39*fe6060f1SDimitry Andric     template<class _Tp>
40*fe6060f1SDimitry Andric       requires ranges::view<decay_t<_Tp>>
41*fe6060f1SDimitry Andric     _LIBCPP_HIDE_FROM_ABI
42*fe6060f1SDimitry Andric     constexpr auto operator()(_Tp&& __t) const
43*fe6060f1SDimitry Andric       noexcept(noexcept(_VSTD::__decay_copy(_VSTD::forward<_Tp>(__t))))
44*fe6060f1SDimitry Andric     {
45*fe6060f1SDimitry Andric       return _VSTD::forward<_Tp>(__t);
46*fe6060f1SDimitry Andric     }
47*fe6060f1SDimitry Andric 
48*fe6060f1SDimitry Andric     template<class _Tp>
49*fe6060f1SDimitry Andric       requires (!ranges::view<decay_t<_Tp>>) &&
50*fe6060f1SDimitry Andric                requires (_Tp&& __t) { ranges::ref_view{_VSTD::forward<_Tp>(__t)}; }
51*fe6060f1SDimitry Andric     _LIBCPP_HIDE_FROM_ABI
52*fe6060f1SDimitry Andric     constexpr auto operator()(_Tp&& __t) const
53*fe6060f1SDimitry Andric       noexcept(noexcept(ranges::ref_view{_VSTD::forward<_Tp>(__t)}))
54*fe6060f1SDimitry Andric     {
55*fe6060f1SDimitry Andric       return ranges::ref_view{_VSTD::forward<_Tp>(__t)};
56*fe6060f1SDimitry Andric     }
57*fe6060f1SDimitry Andric 
58*fe6060f1SDimitry Andric     template<class _Tp>
59*fe6060f1SDimitry Andric       requires (!ranges::view<decay_t<_Tp>> &&
60*fe6060f1SDimitry Andric                 !requires (_Tp&& __t) { ranges::ref_view{_VSTD::forward<_Tp>(__t)}; } &&
61*fe6060f1SDimitry Andric                  requires (_Tp&& __t) { ranges::subrange{_VSTD::forward<_Tp>(__t)}; })
62*fe6060f1SDimitry Andric     _LIBCPP_HIDE_FROM_ABI
63*fe6060f1SDimitry Andric     constexpr auto operator()(_Tp&& __t) const
64*fe6060f1SDimitry Andric       noexcept(noexcept(ranges::subrange{_VSTD::forward<_Tp>(__t)}))
65*fe6060f1SDimitry Andric     {
66*fe6060f1SDimitry Andric       return ranges::subrange{_VSTD::forward<_Tp>(__t)};
67*fe6060f1SDimitry Andric     }
68*fe6060f1SDimitry Andric   };
69*fe6060f1SDimitry Andric }
70*fe6060f1SDimitry Andric 
71*fe6060f1SDimitry Andric inline namespace __cpo {
72*fe6060f1SDimitry Andric   inline constexpr auto all = __all::__fn{};
73*fe6060f1SDimitry Andric } // namespace __cpo
74*fe6060f1SDimitry Andric 
75*fe6060f1SDimitry Andric template<ranges::viewable_range _Range>
76*fe6060f1SDimitry Andric using all_t = decltype(views::all(declval<_Range>()));
77*fe6060f1SDimitry Andric 
78*fe6060f1SDimitry Andric } // namespace views
79*fe6060f1SDimitry Andric 
80*fe6060f1SDimitry Andric #endif // !defined(_LIBCPP_HAS_NO_RANGES)
81*fe6060f1SDimitry Andric 
82*fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD
83*fe6060f1SDimitry Andric 
84*fe6060f1SDimitry Andric _LIBCPP_POP_MACROS
85*fe6060f1SDimitry Andric 
86*fe6060f1SDimitry Andric #endif // _LIBCPP___RANGES_ALL_H
87