6#ifndef MIMICPP_MATCHERS_RANGE_MATCHERS_HPP
7#define MIMICPP_MATCHERS_RANGE_MATCHERS_HPP
14#ifndef MIMICPP_DETAIL_IS_MODULE
23namespace mimicpp::matches::range::detail
25#if MIMICPP_DETAIL_IS_GCC \
29 template <std::ranges::range Range>
31 constexpr auto store(Range&&
range)
33 if constexpr (std::ranges::view<std::decay_t<Range>>)
35 return std::forward<Range>(
range);
37 else if constexpr (
requires { std::ranges::ref_view{std::declval<Range>()}; })
39 return std::ranges::ref_view{std::forward<Range>(
range)};
43 return std::forward<Range>(
range);
48 constexpr auto store = std::views::all;
69 template <std::ranges::forward_range Range,
typename Comparator = std::equal_to<>>
71 constexpr auto eq(Range&& expected, Comparator comparator = Comparator{})
74 [comp = std::move(comparator)]<
typename Target>(Target&& target,
auto&
range)
75 requires std::predicate<
77 std::ranges::range_reference_t<Target>,
78 std::ranges::range_reference_t<Range>>
80 return std::ranges::equal(
86 "elements are not {}",
87 std::make_tuple(detail::store(std::forward<Range>(expected)))};
97 template <std::ranges::forward_range Range,
typename Comparator = std::equal_to<>>
99 constexpr auto unordered_eq(Range&& expected, Comparator comparator = Comparator{})
102 [comp = std::move(comparator)]<
typename Target>(Target&& target,
auto&
range)
103 requires std::predicate<
105 std::ranges::range_reference_t<Target>,
106 std::ranges::range_reference_t<Range>>
108 return std::ranges::is_permutation(
113 "is a permutation of {}",
114 "is not a permutation of {}",
115 std::make_tuple(detail::store(std::forward<Range>(expected)))};
123 template <
typename Relation = std::ranges::less>
125 constexpr auto is_sorted(Relation relation = Relation{})
128 [rel = std::move(relation)]<
typename Target>(Target&& target)
129 requires std::equivalence_relation<
131 std::ranges::range_reference_t<Target>,
132 std::ranges::range_reference_t<Target>>
134 return std::ranges::is_sorted(
139 "is an unsorted range"};
149 [](std::ranges::range
auto&& target) {
150 return std::ranges::empty(target);
153 "is not an empty range"};
161 constexpr auto has_size(
const std::integral
auto expected)
164 [](std::ranges::range
auto&& target,
const std::integral
auto size) {
165 return std::cmp_equal(
167 std::ranges::size(target));
170 "has different size than {}",
171 std::make_tuple(expected)};
178 template <
typename Matcher>
182 using MatcherType = std::remove_cvref_t<Matcher>;
183 using arg_storage = mimicpp::detail::arg_storage<
186 mimicpp::detail::describe_hook::describe_fn>;
189 []<std::ranges::range Range>(Range&& target, MatcherType
const& m) {
190 return std::ranges::all_of(
191 std::forward<Range>(target),
192 [&](
auto&& element) {
193 return mimicpp::detail::matches_hook::matches(m, element);
196 "each el in range: el {}",
197 "not each el in range: el {}",
198 std::tuple<arg_storage>{std::forward<Matcher>(matcher)}};
205 template <
typename Matcher>
209 using MatcherType = std::remove_cvref_t<Matcher>;
210 using arg_storage = mimicpp::detail::arg_storage<
213 mimicpp::detail::describe_hook::describe_fn>;
216 []<std::ranges::range Range>(Range&& target, MatcherType
const& m) {
217 return std::ranges::any_of(
218 std::forward<Range>(target),
219 [&](
auto&& element) {
220 return mimicpp::detail::matches_hook::matches(m, element);
223 "any el in range: el {}",
224 "none el in range: el {}",
225 std::tuple<arg_storage>{std::forward<Matcher>(matcher)}};
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
Generic matcher and the basic building block of most of the built-in matchers.
Definition GeneralMatchers.hpp:75
constexpr auto eq(Range &&expected, Comparator comparator=Comparator{})
Tests, whether the target range compares equal to the expected range, by comparing them element-wise.
Definition RangeMatchers.hpp:71
constexpr auto each_element(Matcher &&matcher)
Tests, whether each element of the target range matches the specified matcher.
Definition RangeMatchers.hpp:180
constexpr auto unordered_eq(Range &&expected, Comparator comparator=Comparator{})
Tests, whether the target range is a permutation of the expected range, by comparing them element-wis...
Definition RangeMatchers.hpp:99
constexpr auto any_element(Matcher &&matcher)
Tests, whether any element of the target range matches the specified matcher.
Definition RangeMatchers.hpp:207
constexpr auto has_size(const std::integral auto expected)
Tests, whether the target range has the expected size.
Definition RangeMatchers.hpp:161
constexpr auto is_sorted(Relation relation=Relation{})
Tests, whether the target range is sorted, by applying the relation on each adjacent elements.
Definition RangeMatchers.hpp:125
constexpr auto is_empty()
Tests, whether the target range is empty.
Definition RangeMatchers.hpp:146
Definition RangeMatchers.hpp:24