@@ -13,14 +13,24 @@ template <typename Parameters> static constexpr auto apply(pcre::push_empty, ctl
13
13
14
14
// make_alternate (A|B)
15
15
template <auto V, typename A, typename B, typename ... Ts, typename Parameters> static constexpr auto apply (pcre::make_alternate, ctll::term<V>, pcre_context<ctll::list<B, A, Ts...>, Parameters> subject) {
16
- return pcre_context{ctll::push_front (select <A,B>(), ctll::list<Ts...>()), subject.parameters };
16
+ if constexpr (MatchesCharacter<A>::template value<char32_t > && MatchesCharacter<B>::template value<char32_t >) {
17
+ auto new_set = push_back_into_set (A{}, B{});
18
+ return pcre_context{ ctll::push_front (new_set, ctll::list<Ts...>()), subject.parameters };
19
+ } else {
20
+ return pcre_context{ ctll::push_front (select <A,B>(), ctll::list<Ts...>()), subject.parameters };
21
+ }
17
22
}
23
+
18
24
// make_alternate (As..)|B => (As..|B)
19
- template <auto V, typename A, typename ... Bs, typename ... Ts, typename Parameters> static constexpr auto apply (pcre::make_alternate, ctll::term<V>, pcre_context<ctll::list<ctre::select<Bs...>, A, Ts...>, Parameters> subject) {
20
- return pcre_context{ctll::push_front (select <A,Bs...>(), ctll::list<Ts...>()), subject.parameters };
25
+ template <auto V, typename A, typename B, typename ... Bs, typename ... Ts, typename Parameters> static constexpr auto apply (pcre::make_alternate, ctll::term<V>, pcre_context<ctll::list<ctre::select<B, Bs...>, A, Ts...>, Parameters> subject) {
26
+ if constexpr (MatchesCharacter<A>::template value<char32_t > && MatchesCharacter<B>::template value<char32_t >) {
27
+ auto new_set = push_back_into_set (A{}, B{});
28
+ return pcre_context{ ctll::push_front (select <decltype (new_set),Bs...>(), ctll::list<Ts...>()), subject.parameters };
29
+ } else {
30
+ return pcre_context{ ctll::push_front (select <A,B,Bs...>(), ctll::list<Ts...>()), subject.parameters };
31
+ }
21
32
}
22
33
23
-
24
34
// make_optional
25
35
template <auto V, typename A, typename ... Ts, typename Parameters> static constexpr auto apply (pcre::make_optional, ctll::term<V>, pcre_context<ctll::list<A, Ts...>, Parameters> subject) {
26
36
return pcre_context{ctll::push_front (optional<A>(), ctll::list<Ts...>()), subject.parameters };
0 commit comments