Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-11-15 09:54:58

0001 /// \file
0002 // Range v3 library
0003 //
0004 //  Copyright Eric Niebler 2013-present
0005 //
0006 //  Use, modification and distribution is subject to the
0007 //  Boost Software License, Version 1.0. (See accompanying
0008 //  file LICENSE_1_0.txt or copy at
0009 //  http://www.boost.org/LICENSE_1_0.txt)
0010 //
0011 // Project home: https://github.com/ericniebler/range-v3
0012 //
0013 
0014 #ifndef RANGES_V3_RANGE_FWD_HPP
0015 #define RANGES_V3_RANGE_FWD_HPP
0016 
0017 #include <type_traits>
0018 #include <utility>
0019 
0020 #include <meta/meta.hpp>
0021 
0022 #include <concepts/concepts.hpp>
0023 #include <concepts/compare.hpp>
0024 
0025 #include <range/v3/detail/config.hpp>
0026 #include <range/v3/utility/static_const.hpp>
0027 #include <range/v3/version.hpp>
0028 
0029 /// \defgroup group-iterator Iterator
0030 /// Iterator functionality
0031 
0032 /// \defgroup group-iterator-concepts Iterator Concepts
0033 /// \ingroup group-iterator
0034 /// Iterator concepts
0035 
0036 /// \defgroup group-range Range
0037 /// Core range functionality
0038 
0039 /// \defgroup group-range-concepts Range Concepts
0040 /// \ingroup group-range
0041 /// Range concepts
0042 
0043 /// \defgroup group-algorithms Algorithms
0044 /// Iterator- and range-based algorithms, like the standard algorithms
0045 
0046 /// \defgroup group-views Views
0047 /// Lazy, non-owning, non-mutating, composable range views
0048 
0049 /// \defgroup group-actions Actions
0050 /// Eager, mutating, composable algorithms
0051 
0052 /// \defgroup group-utility Utility
0053 /// Utility classes
0054 
0055 /// \defgroup group-functional Functional
0056 /// Function and function object utilities
0057 
0058 /// \defgroup group-numerics Numerics
0059 /// Numeric utilities
0060 
0061 #include <range/v3/detail/prologue.hpp>
0062 
0063 RANGES_DIAGNOSTIC_PUSH
0064 RANGES_DIAGNOSTIC_IGNORE_CXX17_COMPAT
0065 
0066 namespace ranges
0067 {
0068     /// \cond
0069     namespace views
0070     {
0071     }
0072 
0073     namespace actions
0074     {
0075     }
0076 
0077 // GCC either fails to accept an attribute on a namespace, or else
0078 // it ignores the deprecation attribute. Frustrating.
0079 #if(RANGES_CXX_VER < RANGES_CXX_STD_17 || defined(__GNUC__) && !defined(__clang__))
0080     inline namespace v3
0081     {
0082         using namespace ranges;
0083     }
0084 
0085     namespace view = views;
0086     namespace action = actions;
0087 #else
0088     inline namespace RANGES_DEPRECATED(
0089         "The name ranges::v3 namespace is deprecated. "
0090         "Please discontinue using it.") v3
0091     {
0092         using namespace ranges;
0093     }
0094 
0095     namespace RANGES_DEPRECATED(
0096         "The ranges::view namespace has been renamed to ranges::views. "
0097         "(Sorry!)") view
0098     {
0099         using namespace views;
0100     }
0101 
0102     namespace RANGES_DEPRECATED(
0103         "The ranges::action namespace has been renamed to ranges::actions. "
0104         "(Sorry!)") action
0105     {
0106         using namespace actions;
0107     }
0108 #endif
0109 
0110     namespace _end_
0111     {
0112         struct fn;
0113     }
0114     using end_fn = _end_::fn;
0115 
0116     namespace _size_
0117     {
0118         struct fn;
0119     }
0120 
0121     template<typename>
0122     struct result_of;
0123 
0124     template<typename Sig>
0125     using result_of_t RANGES_DEPRECATED(
0126         "ranges::result_of_t is deprecated. "
0127         "Please use ranges::invoke_result_t") = meta::_t<result_of<Sig>>;
0128     /// \endcond
0129 
0130     template<typename...>
0131     struct variant;
0132 
0133     struct dangling;
0134 
0135     struct make_pipeable_fn;
0136 
0137     struct pipeable_base;
0138 
0139     template<typename First, typename Second>
0140     struct composed;
0141 
0142     template<typename... Fns>
0143     struct overloaded;
0144 
0145     namespace actions
0146     {
0147         template<typename ActionFn>
0148         struct action_closure;
0149     }
0150 
0151     namespace views
0152     {
0153         template<typename ViewFn>
0154         struct view_closure;
0155     }
0156 
0157     struct advance_fn;
0158 
0159     struct advance_to_fn;
0160 
0161     struct advance_bounded_fn;
0162 
0163     struct next_fn;
0164 
0165     struct prev_fn;
0166 
0167     struct distance_fn;
0168 
0169     struct iter_size_fn;
0170 
0171     template<typename T>
0172     struct indirectly_readable_traits;
0173 
0174     template<typename T>
0175     using readable_traits RANGES_DEPRECATED("Please use ranges::indirectly_readable_traits")
0176      = indirectly_readable_traits<T>;
0177 
0178     template<typename T>
0179     struct incrementable_traits;
0180 
0181     struct view_base
0182     {};
0183 
0184     /// \cond
0185     namespace detail
0186     {
0187         template<typename T>
0188         struct difference_type_;
0189 
0190         template<typename T>
0191         struct value_type_;
0192     } // namespace detail
0193 
0194     template<typename T>
0195     using difference_type RANGES_DEPRECATED(
0196         "ranges::difference_type<T>::type is deprecated. Use "
0197         "ranges::incrementable_traits<T>::difference_type instead.") =
0198         detail::difference_type_<T>;
0199 
0200     template<typename T>
0201     using value_type RANGES_DEPRECATED(
0202         "ranges::value_type<T>::type is deprecated. Use "
0203         "ranges::indirectly_readable_traits<T>::value_type instead.") = detail::value_type_<T>;
0204 
0205     template<typename T>
0206     struct size_type;
0207     /// \endcond
0208 
0209     /// \cond
0210     namespace detail
0211     {
0212         struct ignore_t
0213         {
0214             ignore_t() = default;
0215             template<typename T>
0216             constexpr ignore_t(T &&) noexcept
0217             {}
0218             template<typename T>
0219             constexpr ignore_t const & operator=(T &&) const noexcept
0220             {
0221                 return *this;
0222             }
0223         };
0224 
0225         struct value_init
0226         {
0227             template<typename T>
0228             operator T() const
0229             {
0230                 return T{};
0231             }
0232         };
0233 
0234         struct make_compressed_pair_fn;
0235 
0236         template<typename T>
0237         constexpr meta::_t<std::remove_reference<T>> && move(T && t) noexcept
0238         {
0239             return static_cast<meta::_t<std::remove_reference<T>> &&>(t);
0240         }
0241 
0242         struct as_const_fn
0243         {
0244             template<typename T>
0245             constexpr T const & operator()(T & t) const noexcept
0246             {
0247                 return t;
0248             }
0249             template<typename T>
0250             constexpr T const && operator()(T && t) const noexcept
0251             {
0252                 return (T &&) t;
0253             }
0254         };
0255 
0256         RANGES_INLINE_VARIABLE(as_const_fn, as_const)
0257 
0258         template<typename T>
0259         using as_const_t = decltype(as_const(std::declval<T>()));
0260 
0261         template<typename T>
0262         using decay_t = meta::_t<std::decay<T>>;
0263 
0264         template<typename T, typename R = meta::_t<std::remove_reference<T>>>
0265         using as_ref_t =
0266             meta::_t<std::add_lvalue_reference<meta::_t<std::remove_const<R>>>>;
0267 
0268         template<typename T, typename R = meta::_t<std::remove_reference<T>>>
0269         using as_cref_t = meta::_t<std::add_lvalue_reference<R const>>;
0270 
0271         struct get_first;
0272         struct get_second;
0273 
0274         template<typename Val1, typename Val2>
0275         struct replacer_fn;
0276 
0277         template<typename Pred, typename Val>
0278         struct replacer_if_fn;
0279 
0280         template<typename I>
0281         struct move_into_cursor;
0282 
0283         template<typename Int>
0284         struct from_end_;
0285 
0286         template<typename... Ts>
0287         constexpr int ignore_unused(Ts &&...)
0288         {
0289             return 42;
0290         }
0291 
0292         template<int I>
0293         struct priority_tag : priority_tag<I - 1>
0294         {};
0295 
0296         template<>
0297         struct priority_tag<0>
0298         {};
0299 
0300 #if defined(__clang__) && !defined(_LIBCPP_VERSION)
0301         template<typename T, typename... Args>
0302         RANGES_INLINE_VAR constexpr bool is_trivially_constructible_v =
0303             __is_trivially_constructible(T, Args...);
0304         template<typename T>
0305         RANGES_INLINE_VAR constexpr bool is_trivially_default_constructible_v =
0306             is_trivially_constructible_v<T>;
0307         template<typename T>
0308         RANGES_INLINE_VAR constexpr bool is_trivially_copy_constructible_v =
0309             is_trivially_constructible_v<T, T const &>;
0310         template<typename T>
0311         RANGES_INLINE_VAR constexpr bool is_trivially_move_constructible_v =
0312             is_trivially_constructible_v<T, T>;
0313         template<typename T>
0314         RANGES_INLINE_VAR constexpr bool is_trivially_copyable_v =
0315             __is_trivially_copyable(T);
0316         template<typename T, typename U>
0317         RANGES_INLINE_VAR constexpr bool is_trivially_assignable_v =
0318             __is_trivially_assignable(T, U);
0319         template<typename T>
0320         RANGES_INLINE_VAR constexpr bool is_trivially_copy_assignable_v =
0321             is_trivially_assignable_v<T &, T const &>;
0322         template<typename T>
0323         RANGES_INLINE_VAR constexpr bool is_trivially_move_assignable_v =
0324             is_trivially_assignable_v<T &, T>;
0325 
0326         template<typename T, typename... Args>
0327         struct is_trivially_constructible
0328           : meta::bool_<is_trivially_constructible_v<T, Args...>>
0329         {};
0330         template<typename T>
0331         struct is_trivially_default_constructible
0332           : meta::bool_<is_trivially_default_constructible_v<T>>
0333         {};
0334         template<typename T>
0335         struct is_trivially_copy_constructible
0336           : meta::bool_<is_trivially_copy_constructible_v<T>>
0337         {};
0338         template<typename T>
0339         struct is_trivially_move_constructible
0340           : meta::bool_<is_trivially_move_constructible_v<T>>
0341         {};
0342         template<typename T>
0343         struct is_trivially_copyable
0344           : meta::bool_<is_trivially_copyable_v<T>>
0345         {};
0346         template<typename T, typename U>
0347         struct is_trivially_assignable
0348           : meta::bool_<is_trivially_assignable_v<T, U>>
0349         {};
0350         template<typename T>
0351         struct is_trivially_copy_assignable
0352           : meta::bool_<is_trivially_copy_assignable_v<T>>
0353         {};
0354         template<typename T>
0355         struct is_trivially_move_assignable
0356           : meta::bool_<is_trivially_move_assignable_v<T>>
0357         {};
0358 #else
0359         using std::is_trivially_constructible;
0360         using std::is_trivially_default_constructible;
0361         using std::is_trivially_copy_assignable;
0362         using std::is_trivially_copy_constructible;
0363         using std::is_trivially_copyable;
0364         using std::is_trivially_assignable;
0365         using std::is_trivially_move_assignable;
0366         using std::is_trivially_move_constructible;
0367 #if META_CXX_TRAIT_VARIABLE_TEMPLATES
0368         using std::is_trivially_constructible_v;
0369         using std::is_trivially_default_constructible_v;
0370         using std::is_trivially_copy_assignable_v;
0371         using std::is_trivially_copy_constructible_v;
0372         using std::is_trivially_copyable_v;
0373         using std::is_trivially_assignable_v;
0374         using std::is_trivially_move_assignable_v;
0375         using std::is_trivially_move_constructible_v;
0376 #else
0377         template<typename T, typename... Args>
0378         RANGES_INLINE_VAR constexpr bool is_trivially_constructible_v =
0379             is_trivially_constructible<T, Args...>::value;
0380         template<typename T>
0381         RANGES_INLINE_VAR constexpr bool is_trivially_default_constructible_v =
0382             is_trivially_default_constructible<T>::value;
0383         template<typename T>
0384         RANGES_INLINE_VAR constexpr bool is_trivially_copy_constructible_v =
0385             is_trivially_copy_constructible<T>::value;
0386         template<typename T>
0387         RANGES_INLINE_VAR constexpr bool is_trivially_move_constructible_v =
0388             is_trivially_move_constructible<T>::value;
0389         template<typename T>
0390         RANGES_INLINE_VAR constexpr bool is_trivially_copyable_v =
0391             is_trivially_copyable<T>::value;
0392         template<typename T, typename U>
0393         RANGES_INLINE_VAR constexpr bool is_trivially_assignable_v =
0394             is_trivially_assignable<T, U>::value;
0395         template<typename T>
0396         RANGES_INLINE_VAR constexpr bool is_trivially_copy_assignable_v =
0397             is_trivially_copy_assignable<T>::value;
0398         template<typename T>
0399         RANGES_INLINE_VAR constexpr bool is_trivially_move_assignable_v =
0400             is_trivially_move_assignable<T>::value;
0401 #endif
0402 #endif
0403 
0404         template<typename T>
0405         RANGES_INLINE_VAR constexpr bool is_trivial_v =
0406             is_trivially_copyable_v<T> &&
0407             is_trivially_default_constructible_v<T>;
0408 
0409         template<typename T>
0410         struct is_trivial
0411           : meta::bool_<is_trivial_v<T>>
0412         {};
0413 
0414 #if RANGES_CXX_LIB_IS_FINAL > 0
0415 #if defined(__clang__) && !defined(_LIBCPP_VERSION)
0416         template<typename T>
0417         RANGES_INLINE_VAR constexpr bool is_final_v = __is_final(T);
0418 
0419         template<typename T>
0420         struct is_final
0421           : meta::bool_<is_final_v<T>>
0422         {};
0423 #else
0424         using std::is_final;
0425 #if META_CXX_TRAIT_VARIABLE_TEMPLATES
0426         using std::is_final_v;
0427 #else
0428         template<typename T>
0429         RANGES_INLINE_VAR constexpr bool is_final_v = is_final<T>::value;
0430 #endif
0431 #endif
0432 #else
0433         template<typename T>
0434         RANGES_INLINE_VAR constexpr bool is_final_v = false;
0435 
0436         template<typename T>
0437         using is_final = std::false_type;
0438 #endif
0439 
0440         // Work around libc++'s buggy std::is_function
0441         // Function types here:
0442         template<typename T>
0443         char (&is_function_impl_(priority_tag<0>))[1];
0444 
0445         // Array types here:
0446         template<typename T, typename = decltype((*(T *)0)[0])>
0447         char (&is_function_impl_(priority_tag<1>))[2];
0448 
0449         // Anything that can be returned from a function here (including
0450         // void and reference types):
0451         template<typename T, typename = T (*)()>
0452         char (&is_function_impl_(priority_tag<2>))[3];
0453 
0454         // Classes and unions (including abstract types) here:
0455         template<typename T, typename = int T::*>
0456         char (&is_function_impl_(priority_tag<3>))[4];
0457 
0458         template<typename T>
0459         RANGES_INLINE_VAR constexpr bool is_function_v =
0460             sizeof(detail::is_function_impl_<T>(priority_tag<3>{})) == 1;
0461 
0462         template<typename T>
0463         struct remove_rvalue_reference
0464         {
0465             using type = T;
0466         };
0467 
0468         template<typename T>
0469         struct remove_rvalue_reference<T &&>
0470         {
0471             using type = T;
0472         };
0473 
0474         template<typename T>
0475         using remove_rvalue_reference_t = meta::_t<remove_rvalue_reference<T>>;
0476 
0477         // Workaround bug in the Standard Library:
0478         // From cannot be an incomplete class type despite that
0479         // is_convertible<X, Y> should be equivalent to is_convertible<X&&, Y>
0480         // in such a case.
0481         template<typename From, typename To>
0482         using is_convertible =
0483             std::is_convertible<meta::_t<std::add_rvalue_reference<From>>, To>;
0484     } // namespace detail
0485     /// \endcond
0486 
0487     struct begin_tag
0488     {};
0489     struct end_tag
0490     {};
0491     struct copy_tag
0492     {};
0493     struct move_tag
0494     {};
0495 
0496     template<typename T>
0497     using uncvref_t = meta::_t<std::remove_cv<meta::_t<std::remove_reference<T>>>>;
0498 
0499     struct not_equal_to;
0500     struct equal_to;
0501     struct less;
0502 #if __cplusplus > 201703L && __has_include(<compare>) && \
0503     defined(__cpp_concepts) && defined(__cpp_impl_three_way_comparison)
0504     struct compare_three_way;
0505 #endif // __cplusplus
0506     struct identity;
0507     template<typename Pred>
0508     struct logical_negate;
0509 
0510     enum cardinality : std::ptrdiff_t
0511     {
0512         infinite = -3,
0513         unknown = -2,
0514         finite = -1
0515     };
0516 
0517     template<typename Rng, typename Void = void>
0518     struct range_cardinality;
0519 
0520     template<typename Rng>
0521     using is_finite = meta::bool_<range_cardinality<Rng>::value >= finite>;
0522 
0523     template<typename Rng>
0524     using is_infinite = meta::bool_<range_cardinality<Rng>::value == infinite>;
0525 
0526     template<typename S, typename I>
0527     RANGES_INLINE_VAR constexpr bool disable_sized_sentinel = false;
0528 
0529     template<typename R>
0530     RANGES_INLINE_VAR constexpr bool enable_borrowed_range = false;
0531 
0532     namespace detail
0533     {
0534         template<typename R>
0535         RANGES_DEPRECATED("Please use ranges::enable_borrowed_range instead.")
0536         RANGES_INLINE_VAR constexpr bool enable_safe_range = enable_borrowed_range<R>;
0537     } // namespace detail
0538 
0539     using detail::enable_safe_range;
0540 
0541     template<typename Cur>
0542     struct basic_mixin;
0543 
0544     template<typename Cur>
0545     struct RANGES_EMPTY_BASES basic_iterator;
0546 
0547     template<cardinality>
0548     struct basic_view : view_base
0549     {};
0550 
0551     template<typename Derived, cardinality C = finite>
0552     struct view_facade;
0553 
0554     template<typename Derived, typename BaseRng,
0555              cardinality C = range_cardinality<BaseRng>::value>
0556     struct view_adaptor;
0557 
0558     template<typename I, typename S>
0559     struct common_iterator;
0560 
0561     /// \cond
0562     namespace detail
0563     {
0564         template<typename I>
0565         struct cpp17_iterator_cursor;
0566 
0567         template<typename I>
0568         using cpp17_iterator = basic_iterator<cpp17_iterator_cursor<I>>;
0569     } // namespace detail
0570     /// \endcond
0571 
0572     template<typename First, typename Second>
0573     struct compressed_pair;
0574 
0575     template<typename T>
0576     struct bind_element;
0577 
0578     template<typename T>
0579     using bind_element_t = meta::_t<bind_element<T>>;
0580 
0581     template<typename Derived, cardinality = finite>
0582     struct view_interface;
0583 
0584     template<typename T>
0585     struct istream_view;
0586 
0587     template<typename I, typename S = I>
0588     struct RANGES_EMPTY_BASES iterator_range;
0589 
0590     template<typename I, typename S = I>
0591     struct sized_iterator_range;
0592 
0593     template<typename T>
0594     struct reference_wrapper;
0595 
0596     // Views
0597     //
0598     template<typename Rng, typename Pred>
0599     struct RANGES_EMPTY_BASES adjacent_filter_view;
0600 
0601     namespace views
0602     {
0603         struct adjacent_filter_fn;
0604     }
0605 
0606     template<typename Rng, typename Pred>
0607     struct RANGES_EMPTY_BASES adjacent_remove_if_view;
0608 
0609     namespace views
0610     {
0611         struct adjacent_remove_if_fn;
0612     }
0613 
0614     namespace views
0615     {
0616         struct all_fn;
0617     }
0618 
0619 
0620     template<typename Rng, typename Fun>
0621     struct chunk_by_view;
0622 
0623     namespace views
0624     {
0625         struct chunk_by_fn;
0626     }
0627 
0628     template<typename Rng>
0629     struct const_view;
0630 
0631     namespace views
0632     {
0633         struct const_fn;
0634     }
0635 
0636     template<typename I>
0637     struct counted_view;
0638 
0639     namespace views
0640     {
0641         struct counted_fn;
0642     }
0643 
0644     struct default_sentinel_t;
0645 
0646     template<typename I>
0647     struct move_iterator;
0648 
0649     template<typename I>
0650     using move_into_iterator = basic_iterator<detail::move_into_cursor<I>>;
0651 
0652     template<typename Rng, bool = (bool)is_infinite<Rng>()>
0653     struct RANGES_EMPTY_BASES cycled_view;
0654 
0655     namespace views
0656     {
0657         struct cycle_fn;
0658     }
0659 
0660     /// \cond
0661     namespace detail
0662     {
0663         template<typename I>
0664         struct reverse_cursor;
0665     }
0666     /// \endcond
0667 
0668     template<typename I>
0669     using reverse_iterator = basic_iterator<detail::reverse_cursor<I>>;
0670 
0671     template<typename T>
0672     struct empty_view;
0673 
0674     namespace views
0675     {
0676         struct empty_fn;
0677     }
0678 
0679     template<typename Rng, typename Fun>
0680     struct group_by_view;
0681 
0682     namespace views
0683     {
0684         struct group_by_fn;
0685     }
0686 
0687     template<typename Rng>
0688     struct indirect_view;
0689 
0690     namespace views
0691     {
0692         struct indirect_fn;
0693     }
0694 
0695     struct unreachable_sentinel_t;
0696 
0697     template<typename From, typename To = unreachable_sentinel_t>
0698     struct iota_view;
0699 
0700     template<typename From, typename To = From>
0701     struct closed_iota_view;
0702 
0703     namespace views
0704     {
0705         struct iota_fn;
0706         struct closed_iota_fn;
0707     } // namespace views
0708 
0709     template<typename Rng>
0710     struct join_view;
0711 
0712     template<typename Rng, typename ValRng>
0713     struct join_with_view;
0714 
0715     namespace views
0716     {
0717         struct join_fn;
0718     }
0719 
0720     template<typename... Rngs>
0721     struct concat_view;
0722 
0723     namespace views
0724     {
0725         struct concat_fn;
0726     }
0727 
0728     template<typename Rng, typename Fun>
0729     struct partial_sum_view;
0730 
0731     namespace views
0732     {
0733         struct partial_sum_fn;
0734     }
0735 
0736     template<typename Rng>
0737     struct move_view;
0738 
0739     namespace views
0740     {
0741         struct move_fn;
0742     }
0743 
0744     template<typename Rng>
0745     struct ref_view;
0746 
0747     namespace views
0748     {
0749         struct ref_fn;
0750     }
0751 
0752     template<typename Val>
0753     struct repeat_view;
0754 
0755     namespace views
0756     {
0757         struct repeat_fn;
0758     }
0759 
0760     template<typename Rng>
0761     struct RANGES_EMPTY_BASES reverse_view;
0762 
0763     namespace views
0764     {
0765         struct reverse_fn;
0766     }
0767 
0768     template<typename Rng>
0769     struct slice_view;
0770 
0771     namespace views
0772     {
0773         struct slice_fn;
0774     }
0775 
0776     // template<typename Rng, typename Fun>
0777     // struct split_view;
0778 
0779     // namespace views
0780     // {
0781     //     struct split_fn;
0782     // }
0783 
0784     template<typename Rng>
0785     struct single_view;
0786 
0787     namespace views
0788     {
0789         struct single_fn;
0790     }
0791 
0792     template<typename Rng>
0793     struct stride_view;
0794 
0795     namespace views
0796     {
0797         struct stride_fn;
0798     }
0799 
0800     template<typename Rng>
0801     struct take_view;
0802 
0803     namespace views
0804     {
0805         struct take_fn;
0806     }
0807 
0808     /// \cond
0809     namespace detail
0810     {
0811         template<typename Rng>
0812         struct is_random_access_common_;
0813 
0814         template<typename Rng,
0815                  bool IsRandomAccessCommon = is_random_access_common_<Rng>::value>
0816         struct take_exactly_view_;
0817     } // namespace detail
0818     /// \endcond
0819 
0820     template<typename Rng>
0821     using take_exactly_view = detail::take_exactly_view_<Rng>;
0822 
0823     namespace views
0824     {
0825         struct take_exactly_fn;
0826     }
0827 
0828     template<typename Rng, typename Pred>
0829     struct iter_take_while_view;
0830 
0831     template<typename Rng, typename Pred>
0832     struct take_while_view;
0833 
0834     namespace views
0835     {
0836         struct iter_take_while_fn;
0837         struct take_while_fn;
0838     } // namespace views
0839 
0840     template<typename Rng, typename Regex, typename SubMatchRange>
0841     struct tokenize_view;
0842 
0843     namespace views
0844     {
0845         struct tokenize_fn;
0846     }
0847 
0848     template<typename Rng, typename Fun>
0849     struct iter_transform_view;
0850 
0851     template<typename Rng, typename Fun>
0852     struct transform_view;
0853 
0854     namespace views
0855     {
0856         struct transform_fn;
0857     }
0858 
0859     template<typename Rng, typename Val1, typename Val2>
0860     using replace_view = iter_transform_view<Rng, detail::replacer_fn<Val1, Val2>>;
0861 
0862     template<typename Rng, typename Pred, typename Val>
0863     using replace_if_view = iter_transform_view<Rng, detail::replacer_if_fn<Pred, Val>>;
0864 
0865     namespace views
0866     {
0867         struct replace_fn;
0868 
0869         struct replace_if_fn;
0870     } // namespace views
0871 
0872     template<typename Rng, typename Pred>
0873     struct trim_view;
0874 
0875     namespace views
0876     {
0877         struct trim_fn;
0878     }
0879 
0880     template<typename I>
0881     struct unbounded_view;
0882 
0883     namespace views
0884     {
0885         struct unbounded_fn;
0886     }
0887 
0888     template<typename Rng>
0889     using unique_view = adjacent_filter_view<Rng, logical_negate<equal_to>>;
0890 
0891     namespace views
0892     {
0893         struct unique_fn;
0894     }
0895 
0896     template<typename Rng>
0897     using keys_range_view = transform_view<Rng, detail::get_first>;
0898 
0899     template<typename Rng>
0900     using values_view = transform_view<Rng, detail::get_second>;
0901 
0902     namespace views
0903     {
0904         struct keys_fn;
0905 
0906         struct values_fn;
0907     } // namespace views
0908 
0909     template<typename Fun, typename... Rngs>
0910     struct iter_zip_with_view;
0911 
0912     template<typename Fun, typename... Rngs>
0913     struct zip_with_view;
0914 
0915     template<typename... Rngs>
0916     struct zip_view;
0917 
0918     namespace views
0919     {
0920         struct iter_zip_with_fn;
0921 
0922         struct zip_with_fn;
0923 
0924         struct zip_fn;
0925     } // namespace views
0926 } // namespace ranges
0927 
0928 /// \cond
0929 namespace ranges
0930 {
0931     namespace concepts = ::concepts;
0932     using namespace ::concepts::defs;
0933     using ::concepts::and_v;
0934 } // namespace ranges
0935 /// \endcond
0936 
0937 RANGES_DIAGNOSTIC_POP
0938 
0939 #include <range/v3/detail/epilogue.hpp>
0940 
0941 #endif