@@ -13,11 +13,41 @@ 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 (), set<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
+
24
+ // make_alternate (As..)|B => (As..|B)
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 (), set<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,Bs...>(), ctll::list<Ts...>()), subject.parameters };
31
+ }
32
+ }
33
+
34
+ template <auto V, typename A, typename B, typename ... Options, typename ... Bs, typename ... Ts, typename Parameters> static constexpr auto apply (pcre::make_alternate, ctll::term<V>, pcre_context<ctll::list<ctre::select<set<Options...>, Bs...>, A, Ts...>, Parameters> subject) {
35
+ if constexpr (MatchesCharacter<A>::template value<char32_t > && MatchesCharacter<B>::template value<char32_t >) {
36
+ auto new_set = push_back_into_set (A (), set<Options...>());
37
+ return pcre_context{ctll::push_front (select <decltype (new_set), Bs...>(), ctll::list<Ts...>()), subject.parameters };
38
+ } else {
39
+ return pcre_context{ctll::push_front (select <A, set<Options...>, Bs...>(), ctll::list<Ts...>()), subject.parameters };
40
+ }
41
+ }
42
+
18
43
// 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 };
44
+ 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::set<Bs...>, A, Ts...>, Parameters> subject) {
45
+ if constexpr (MatchesCharacter<A>::template value<char32_t >) {
46
+ auto new_set = push_back_into_set (A (), set<Bs...>());
47
+ return pcre_context{ctll::push_front (new_set, ctll::list<Ts...>()), subject.parameters };
48
+ } else {
49
+ return pcre_context{ctll::push_front (select <A, set<Bs...>>(), ctll::list<Ts...>()), subject.parameters };
50
+ }
21
51
}
22
52
23
53
0 commit comments