@@ -13,11 +13,41 @@ template <typename Parameters> static constexpr auto apply(pcre::push_empty, ctl
1313
1414// make_alternate (A|B)
1515template <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+ }
1722}
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+
1843// 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+ }
2151}
2252
2353
0 commit comments