File indexing completed on 2024-11-15 09:54:58
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
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
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
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
0069 namespace views
0070 {
0071 }
0072
0073 namespace actions
0074 {
0075 }
0076
0077
0078
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
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
0185 namespace detail
0186 {
0187 template<typename T>
0188 struct difference_type_;
0189
0190 template<typename T>
0191 struct value_type_;
0192 }
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
0208
0209
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
0441
0442 template<typename T>
0443 char (&is_function_impl_(priority_tag<0>))[1];
0444
0445
0446 template<typename T, typename = decltype((*(T *)0)[0])>
0447 char (&is_function_impl_(priority_tag<1>))[2];
0448
0449
0450
0451 template<typename T, typename = T (*)()>
0452 char (&is_function_impl_(priority_tag<2>))[3];
0453
0454
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
0478
0479
0480
0481 template<typename From, typename To>
0482 using is_convertible =
0483 std::is_convertible<meta::_t<std::add_rvalue_reference<From>>, To>;
0484 }
0485
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
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 }
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
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 }
0570
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
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
0661 namespace detail
0662 {
0663 template<typename I>
0664 struct reverse_cursor;
0665 }
0666
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 }
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
0777
0778
0779
0780
0781
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
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 }
0818
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 }
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 }
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 }
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 }
0926 }
0927
0928
0929 namespace ranges
0930 {
0931 namespace concepts = ::concepts;
0932 using namespace ::concepts::defs;
0933 using ::concepts::and_v;
0934 }
0935
0936
0937 RANGES_DIAGNOSTIC_POP
0938
0939 #include <range/v3/detail/epilogue.hpp>
0940
0941 #endif