Skip to content

Commit eb057f2

Browse files
author
Hana Dusíková
committed
own filter for C++17
1 parent 6f07b91 commit eb057f2

File tree

4 files changed

+37
-29
lines changed

4 files changed

+37
-29
lines changed

include/ctre/range.hpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,23 +39,24 @@ template <typename BeginIterator, typename EndIterator, typename RE, typename Re
3939

4040
template <typename... Ts> constexpr bool is_range<regex_split_range<Ts...>> = true;
4141

42-
template <typename First, typename Last, typename RE> struct multi_subject_range {
43-
static constexpr bool is_input = std::is_same_v<std::iterator_traits<First>::iterator_category, std::input_iterator_tag>;
44-
42+
template <typename Range, typename RE> struct multi_subject_range {
4543
struct end_iterator { };
4644

45+
using first_type = decltype(std::declval<Range>().begin());
46+
using last_type = decltype(std::declval<Range>().end());
47+
4748
struct iterator {
48-
using value_type = decltype(RE::exec(std::declval<typename std::iterator_traits<First>::value_type>()));
49+
using value_type = decltype(RE::exec(std::declval<typename std::iterator_traits<first_type>::value_type>()));
4950
using iterator_category = std::forward_iterator_tag;
5051
using pointer = void;
5152
using reference = const value_type &;
5253
using difference_type = ssize_t;
5354

54-
First first{};
55-
Last last{};
55+
first_type first{};
56+
last_type last{};
5657
value_type current_result{};
5758

58-
constexpr CTRE_FORCE_INLINE iterator(First f, Last l) noexcept: first{f}, last{l}, current_result{find_first()} { }
59+
constexpr CTRE_FORCE_INLINE iterator(first_type f, last_type l) noexcept: first{f}, last{l}, current_result{find_first()} { }
5960

6061
constexpr CTRE_FORCE_INLINE value_type find_first() noexcept {
6162
while (first != last) {
@@ -112,12 +113,12 @@ template <typename First, typename Last, typename RE> struct multi_subject_range
112113
}
113114
};
114115

115-
iterator everything;
116+
Range range;
116117

117-
constexpr CTRE_FORCE_INLINE multi_subject_range(First f, Last l) noexcept: everything{f,l} { }
118+
constexpr CTRE_FORCE_INLINE multi_subject_range(Range r) noexcept: range{r} { }
118119

119120
constexpr CTRE_FORCE_INLINE auto begin() const noexcept {
120-
return everything;
121+
return iterator{range.begin(), range.end()};
121122
}
122123
constexpr CTRE_FORCE_INLINE auto end() const noexcept {
123124
return end_iterator{};
@@ -135,6 +136,7 @@ namespace std::ranges {
135136

136137
template <typename... Ts> inline constexpr bool enable_borrowed_range<::ctre::regex_range<Ts...>> = true;
137138
template <typename... Ts> inline constexpr bool enable_borrowed_range<::ctre::regex_split_range<Ts...>> = true;
139+
template <typename Range, typename... Ts> inline constexpr bool enable_borrowed_range<::ctre::multi_subject_range<Range, Ts...>> = enable_borrowed_range<Range>;
138140

139141
}
140142
#endif

include/ctre/wrapper.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ template <typename RE, typename Method, typename Modifier> struct regular_expres
148148
return Method::template exec<Modifier, ResultIterator>(begin, end, RE{});
149149
}
150150
template <typename Range> constexpr CTRE_FORCE_INLINE static auto multi_exec(Range && range) noexcept {
151-
return multi_subject_range<decltype(range.begin()), decltype(range.end()), regular_expression>{range.begin(), range.end()};
151+
return multi_subject_range<Range, regular_expression>{std::forward<Range>(range)};
152152
}
153153
constexpr CTRE_FORCE_INLINE static auto exec() noexcept {
154154
return Method::template exec();

single-header/ctre-unicode.hpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4667,23 +4667,26 @@ template <typename BeginIterator, typename EndIterator, typename RE, typename Re
46674667

46684668
template <typename... Ts> constexpr bool is_range<regex_split_range<Ts...>> = true;
46694669

4670-
template <typename First, typename Last, typename RE> struct multi_subject_range {
4670+
template <typename Range, typename RE> struct multi_subject_range {
46714671
static constexpr bool is_input = std::is_same_v<std::iterator_traits<First>::iterator_category, std::input_iterator_tag>;
46724672

46734673
struct end_iterator { };
46744674

4675+
using first_type = decltype(std::declval<Range>().begin());
4676+
using last_type = decltype(std::declval<Range>().end());
4677+
46754678
struct iterator {
46764679
using value_type = decltype(RE::exec(std::declval<typename std::iterator_traits<First>::value_type>()));
46774680
using iterator_category = std::forward_iterator_tag;
46784681
using pointer = void;
46794682
using reference = const value_type &;
46804683
using difference_type = ssize_t;
46814684

4682-
First first{};
4683-
Last last{};
4685+
first_type first{};
4686+
last_type last{};
46844687
value_type current_result{};
46854688

4686-
constexpr CTRE_FORCE_INLINE iterator(First f, Last l) noexcept: first{f}, last{l}, current_result{find_first()} { }
4689+
constexpr CTRE_FORCE_INLINE iterator(first_type f, last_type l) noexcept: first{f}, last{l}, current_result{find_first()} { }
46874690

46884691
constexpr CTRE_FORCE_INLINE value_type find_first() noexcept {
46894692
while (first != last) {
@@ -4740,12 +4743,12 @@ template <typename First, typename Last, typename RE> struct multi_subject_range
47404743
}
47414744
};
47424745

4743-
iterator everything;
4746+
Range range;
47444747

4745-
constexpr CTRE_FORCE_INLINE multi_subject_range(First f, Last l) noexcept: everything{f,l} { }
4748+
constexpr CTRE_FORCE_INLINE multi_subject_range(Range r) noexcept: range{r} { }
47464749

47474750
constexpr CTRE_FORCE_INLINE auto begin() const noexcept {
4748-
return everything;
4751+
return iterator{range.begin(), range.end()};
47494752
}
47504753
constexpr CTRE_FORCE_INLINE auto end() const noexcept {
47514754
return end_iterator{};
@@ -4762,6 +4765,7 @@ namespace std::ranges {
47624765

47634766
template <typename... Ts> inline constexpr bool enable_borrowed_range<::ctre::regex_range<Ts...>> = true;
47644767
template <typename... Ts> inline constexpr bool enable_borrowed_range<::ctre::regex_split_range<Ts...>> = true;
4768+
template <typename Range, typename... Ts> inline constexpr bool enable_borrowed_range<::ctre::multi_subject_range<Range, Ts...>> = enable_borrowed_range<Range>;
47654769

47664770
}
47674771
#endif

single-header/ctre.hpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4664,23 +4664,24 @@ template <typename BeginIterator, typename EndIterator, typename RE, typename Re
46644664

46654665
template <typename... Ts> constexpr bool is_range<regex_split_range<Ts...>> = true;
46664666

4667-
template <typename First, typename Last, typename RE> struct multi_subject_range {
4668-
static constexpr bool is_input = std::is_same_v<std::iterator_traits<First>::iterator_category, std::input_iterator_tag>;
4669-
4667+
template <typename Range, typename RE> struct multi_subject_range {
46704668
struct end_iterator { };
46714669

4670+
using first_type = decltype(std::declval<Range>().begin());
4671+
using last_type = decltype(std::declval<Range>().end());
4672+
46724673
struct iterator {
4673-
using value_type = decltype(RE::exec(std::declval<typename std::iterator_traits<First>::value_type>()));
4674+
using value_type = decltype(RE::exec(std::declval<typename std::iterator_traits<first_type>::value_type>()));
46744675
using iterator_category = std::forward_iterator_tag;
46754676
using pointer = void;
46764677
using reference = const value_type &;
46774678
using difference_type = ssize_t;
46784679

4679-
First first{};
4680-
Last last{};
4680+
first_type first{};
4681+
last_type last{};
46814682
value_type current_result{};
46824683

4683-
constexpr CTRE_FORCE_INLINE iterator(First f, Last l) noexcept: first{f}, last{l}, current_result{find_first()} { }
4684+
constexpr CTRE_FORCE_INLINE iterator(first_type f, last_type l) noexcept: first{f}, last{l}, current_result{find_first()} { }
46844685

46854686
constexpr CTRE_FORCE_INLINE value_type find_first() noexcept {
46864687
while (first != last) {
@@ -4737,12 +4738,12 @@ template <typename First, typename Last, typename RE> struct multi_subject_range
47374738
}
47384739
};
47394740

4740-
iterator everything;
4741+
Range range;
47414742

4742-
constexpr CTRE_FORCE_INLINE multi_subject_range(First f, Last l) noexcept: everything{f,l} { }
4743+
constexpr CTRE_FORCE_INLINE multi_subject_range(Range r) noexcept: range{r} { }
47434744

47444745
constexpr CTRE_FORCE_INLINE auto begin() const noexcept {
4745-
return everything;
4746+
return iterator{range.begin(), range.end()};
47464747
}
47474748
constexpr CTRE_FORCE_INLINE auto end() const noexcept {
47484749
return end_iterator{};
@@ -4759,6 +4760,7 @@ namespace std::ranges {
47594760

47604761
template <typename... Ts> inline constexpr bool enable_borrowed_range<::ctre::regex_range<Ts...>> = true;
47614762
template <typename... Ts> inline constexpr bool enable_borrowed_range<::ctre::regex_split_range<Ts...>> = true;
4763+
template <typename Range, typename... Ts> inline constexpr bool enable_borrowed_range<::ctre::multi_subject_range<Range, Ts...>> = enable_borrowed_range<Range>;
47624764

47634765
}
47644766
#endif
@@ -4907,7 +4909,7 @@ template <typename RE, typename Method, typename Modifier> struct regular_expres
49074909
return Method::template exec<Modifier, ResultIterator>(begin, end, RE{});
49084910
}
49094911
template <typename Range> constexpr CTRE_FORCE_INLINE static auto multi_exec(Range && range) noexcept {
4910-
return multi_subject_range<decltype(range.begin()), decltype(range.end()), regular_expression>{range.begin(), range.end()};
4912+
return multi_subject_range<Range, regular_expression>{std::forward<Range>(range)};
49114913
}
49124914
constexpr CTRE_FORCE_INLINE static auto exec() noexcept {
49134915
return Method::template exec();

0 commit comments

Comments
 (0)