11#pragma once
2-
32#include " ../compare/compare.h"
43#include " ../functional/invoke.h"
54#include " ../functional/operations.h"
@@ -14,7 +13,7 @@ namespace stdsharp
1413 {
1514 template <typename T, typename U, std::predicate<U, T> Comp>
1615 requires std::assignable_from<T&, U>
17- constexpr T& operator ()(T& left, U&& right, Comp comp = {}) const
16+ static constexpr T& operator ()(T& left, U&& right, Comp comp = {}) //
1817 noexcept (nothrow_predicate<Comp, U, T> && nothrow_assignable_from<T&, U>)
1918 {
2019 if (invoke (cpp_move (comp), right, left)) left = cpp_forward (right);
@@ -26,7 +25,7 @@ namespace stdsharp
2625 {
2726 template <typename T, typename U>
2827 requires std::invocable<set_if_fn, T&, U, std::ranges::greater>
29- constexpr T& operator ()(T& left, U&& right) const
28+ static constexpr T& operator ()(T& left, U&& right) //
3029 noexcept (nothrow_invocable<set_if_fn, T&, U, std::ranges::greater>)
3130 {
3231 return set_if (left, cpp_forward (right), greater_v);
@@ -37,7 +36,7 @@ namespace stdsharp
3736 {
3837 template <typename T, typename U>
3938 requires std::invocable<set_if_fn, T&, U, std::ranges::less>
40- constexpr T& operator ()(T& left, U&& right) const
39+ static constexpr T& operator ()(T& left, U&& right) //
4140 noexcept (nothrow_invocable<set_if_fn, T&, U, std::ranges::less>)
4241 {
4342 return set_if (left, cpp_forward (right), less_v);
@@ -46,17 +45,19 @@ namespace stdsharp
4645
4746 inline constexpr struct is_between_fn
4847 {
49- template < //
48+ template <
5049 typename T,
5150 typename Proj = std::identity,
52- std::indirect_strict_weak_order<std::projected<const T*, Proj>> Compare = std::ranges::
53- less>
54- [[nodiscard]] constexpr auto operator ()(const T& t,
51+ std::indirect_strict_weak_order<std::projected<const T*, Proj>> Compare = //
52+ std::ranges::less>
53+ [[nodiscard]] static constexpr auto operator ()(
54+ const T& t,
5555 decltype (t) min,
5656 decltype(t) max,
5757 Compare cmp = {},
58- Proj proj = {}) const noexcept ( //
59- nothrow_predicate< //
58+ Proj proj = {}
59+ ) noexcept ( //
60+ nothrow_predicate<
6061 Compare,
6162 std::projected<const T*, Proj>,
6263 std::projected<const T*, Proj>> //
@@ -65,9 +66,7 @@ namespace stdsharp
6566 const auto & proj_max = invoke (proj, max);
6667 const auto & proj_min = invoke (proj, min);
6768 const auto & proj_t = invoke (proj, t);
68-
6969 Expects (!invoke (cmp, proj_max, proj_min));
70-
7170 return !invoke (cmp, proj_t , proj_min) && !invoke (cmp, proj_max, proj_t );
7271 }
7372 } is_between{};
@@ -96,7 +95,13 @@ namespace stdsharp
9695 std::sentinel_for<I2 > S2 ,
9796 typename Cmp = std::compare_three_way>
9897 requires ordering_predicate<Cmp&, std::iter_reference_t <I1 >, std::iter_reference_t <I2 >>
99- constexpr auto operator ()(I1 i1, const S1 s1, I2 i2, const S2 s2, Cmp cmp = {}) const
98+ [[nodiscard]] static constexpr auto operator ()(
99+ I1 i1,
100+ const S1 s1,
101+ I2 i2,
102+ const S2 s2,
103+ Cmp cmp = {}
104+ )
100105 {
101106 auto pre = ordering::equivalent;
102107
@@ -128,13 +133,15 @@ namespace stdsharp
128133 Cmp&,
129134 std::ranges::range_reference_t <R1 >,
130135 std::ranges::range_reference_t <R2 >>
131- constexpr auto operator ()(R1 && r1, R2 && r2, Cmp cmp = {}) const
136+ [[nodiscard]] static constexpr auto operator ()(R1 && r1, R2 && r2, Cmp cmp = {}) noexcept
132137 {
133- return (*this )(std::ranges::begin (r1),
138+ return strict_compare_fn::operator ()(
139+ std::ranges::begin (r1),
134140 std::ranges::end (r1),
135141 std::ranges::begin (r2),
136142 std::ranges::end (r2),
137- cmp);
143+ cmp
144+ );
138145 }
139146 } strict_compare{};
140147
@@ -145,11 +152,13 @@ namespace stdsharp
145152 {
146153 template <std::input_iterator In, std::weakly_incrementable Out>
147154 requires std::indirectly_movable<In, Out>
148- constexpr move_n_result<In, Out>
149- operator ()(In in, const std::iter_difference_t <In> n, Out out) const
155+ static constexpr move_n_result<In, Out> operator ()(
156+ In in,
157+ const std::iter_difference_t <In> n,
158+ Out out //
159+ )
150160 {
151161 auto && r = std::ranges::copy_n (std::move_iterator{cpp_move (in)}, n, cpp_move (out));
152-
153162 return {cpp_move (r).in .base (), cpp_move (r).out };
154163 }
155164 } move_n{};
0 commit comments