@@ -15,6 +15,12 @@ constexpr inline auto match_re(const Iterator begin, const EndIterator end, Patt
1515 return evaluate (begin, begin, end, return_type{}, ctll::list<start_mark, Pattern, assert_end, end_mark, accept>());
1616}
1717
18+ template <typename Iterator, typename EndIterator, typename Pattern>
19+ constexpr inline auto ordered_match_re (const Iterator begin, const EndIterator end, Pattern pattern) noexcept {
20+ using return_type = decltype (regex_results (std::declval<Iterator>(), find_captures (pattern)));
21+ return ordered_evaluate (begin, begin, end, return_type{}, ctll::list<start_mark, Pattern, assert_end, end_mark, accept>());
22+ }
23+
1824template <typename Iterator, typename EndIterator, typename Pattern>
1925constexpr inline auto search_re (const Iterator begin, const EndIterator end, Pattern pattern) noexcept {
2026 using return_type = decltype (regex_results (std::declval<Iterator>(), find_captures (pattern)));
@@ -39,18 +45,33 @@ constexpr CTRE_FORCE_INLINE R evaluate(const Iterator, Iterator, const EndIterat
3945 return captures.matched ();
4046}
4147
48+ template <typename R, typename Iterator, typename EndIterator>
49+ constexpr CTRE_FORCE_INLINE R ordered_evaluate (const Iterator, Iterator, const EndIterator, R captures, ctll::list<accept>) noexcept {
50+ return captures.matched ();
51+ }
52+
4253// mark start of outer capture
4354template <typename R, typename Iterator, typename EndIterator, typename ... Tail>
4455constexpr CTRE_FORCE_INLINE R evaluate (const Iterator begin, Iterator current, const EndIterator end, R captures, ctll::list<start_mark, Tail...>) noexcept {
4556 return evaluate (begin, current, end, captures.set_start_mark (current), ctll::list<Tail...>());
4657}
4758
59+ template <typename R, typename Iterator, typename EndIterator, typename ... Tail>
60+ constexpr CTRE_FORCE_INLINE R ordered_evaluate (const Iterator begin, Iterator current, const EndIterator end, R captures, ctll::list<start_mark, Tail...>) noexcept {
61+ return ordered_evaluate (begin, current, end, captures.set_start_mark (current), ctll::list<Tail...>());
62+ }
63+
4864// mark end of outer capture
4965template <typename R, typename Iterator, typename EndIterator, typename ... Tail>
5066constexpr CTRE_FORCE_INLINE R evaluate (const Iterator begin, Iterator current, const EndIterator end, R captures, ctll::list<end_mark, Tail...>) noexcept {
5167 return evaluate (begin, current, end, captures.set_end_mark (current), ctll::list<Tail...>());
5268}
5369
70+ template <typename R, typename Iterator, typename EndIterator, typename ... Tail>
71+ constexpr CTRE_FORCE_INLINE R ordered_evaluate (const Iterator begin, Iterator current, const EndIterator end, R captures, ctll::list<end_mark, Tail...>) noexcept {
72+ return ordered_evaluate (begin, current, end, captures.set_end_mark (current), ctll::list<Tail...>());
73+ }
74+
5475// mark end of cycle
5576template <typename R, typename Iterator, typename EndIterator, typename ... Tail>
5677constexpr CTRE_FORCE_INLINE R evaluate (const Iterator, Iterator current, const EndIterator, R captures, ctll::list<end_cycle_mark>) noexcept {
@@ -67,13 +88,33 @@ constexpr CTRE_FORCE_INLINE R evaluate(const Iterator begin, Iterator current, c
6788 return evaluate (begin, current+1 , end, captures, ctll::list<Tail...>());
6889}
6990
91+ template <typename R, typename Iterator, typename EndIterator, typename CharacterLike, typename ... Tail, typename = std::enable_if_t <(MatchesCharacter<CharacterLike>::template value<decltype (*std::declval<Iterator>())>)>>
92+ constexpr CTRE_FORCE_INLINE R ordered_evaluate (const Iterator begin, Iterator current, const EndIterator end, R captures, ctll::list<CharacterLike, Tail...>) noexcept {
93+ if (end == current) { // target is shorter than pattern
94+ captures.mask_elg ({0 ,1 ,0 });
95+ return captures;
96+ }
97+ captures.mask_elg (CharacterLike::compare_char (*current));
98+ if (captures) {
99+ if (!captures.is_less () && !captures.is_greater ())
100+ return evaluate (begin, current+1 , end, captures.unmatch (), ctll::list<Tail...>());
101+ return ordered_evaluate (begin, current+1 , end, captures, ctll::list<Tail...>());
102+ }
103+ return captures;
104+ }
105+
70106// matching strings in patterns
71107
72108template <typename Iterator> struct string_match_result {
73109 Iterator current;
74110 bool match;
75111};
76112
113+ template <typename Iterator> struct string_compare_result {
114+ Iterator current;
115+ equal_less_greater elg;
116+ };
117+
77118template <auto Head, auto ... String, typename Iterator, typename EndIterator> constexpr CTRE_FORCE_INLINE string_match_result<Iterator> evaluate_match_string (Iterator current, const EndIterator end) noexcept {
78119 if ((end != current) && (Head == *current)) {
79120 if constexpr (sizeof ...(String) > 0 ) {
@@ -145,6 +186,15 @@ constexpr CTRE_FORCE_INLINE R evaluate(const Iterator begin, Iterator current, c
145186 } else {
146187 return evaluate (begin, current, end, captures, ctll::list<HeadContent, Tail...>());
147188 }
189+ }
190+
191+ template <typename R, typename Iterator, typename EndIterator, typename HeadContent, typename ... TailContent, typename ... Tail>
192+ constexpr CTRE_FORCE_INLINE R ordered_evaluate (const Iterator begin, Iterator current, const EndIterator end, R captures, ctll::list<sequence<HeadContent, TailContent...>, Tail...>) noexcept {
193+ if constexpr (sizeof ...(TailContent) > 0 ) {
194+ return ordered_evaluate (begin, current, end, captures, ctll::list<HeadContent, sequence<TailContent...>, Tail...>());
195+ } else {
196+ return ordered_evaluate (begin, current, end, captures, ctll::list<HeadContent, Tail...>());
197+ }
148198
149199}
150200
@@ -171,6 +221,15 @@ constexpr CTRE_FORCE_INLINE R evaluate(const Iterator begin, Iterator current, c
171221 return evaluate (begin, current, end, captures, ctll::list<Tail...>());
172222}
173223
224+ template <typename R, typename Iterator, typename EndIterator, typename ... Tail>
225+ constexpr CTRE_FORCE_INLINE R ordered_evaluate (const Iterator begin, Iterator current, const EndIterator end, R captures, ctll::list<assert_end, Tail...>) noexcept {
226+ if (end != current) { // target is longer than pattern
227+ captures.mask_elg ({0 ,0 ,1 });
228+ return captures;
229+ }
230+ return ordered_evaluate (begin, current, end, captures, ctll::list<Tail...>());
231+ }
232+
174233// lazy repeat
175234template <typename R, typename Iterator, typename EndIterator, size_t A, size_t B, typename ... Content, typename ... Tail>
176235constexpr CTRE_FORCE_INLINE R evaluate (const Iterator begin, Iterator current, const EndIterator end, R captures, ctll::list<lazy_repeat<A,B,Content...>, Tail...>) noexcept {
0 commit comments