Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
wildcards.hpp
Go to the documentation of this file.
1// THIS FILE HAS BEEN GENERATED AUTOMATICALLY. DO NOT EDIT DIRECTLY.
2// Generated: 2019-03-08 09:59:35.958950200
3// Copyright Tomas Zeman 2018.
4// Distributed under the Boost Software License, Version 1.0.
5// (See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt)
7#ifndef WILDCARDS_HPP
8#define WILDCARDS_HPP
9#define WILDCARDS_VERSION_MAJOR 1
10#define WILDCARDS_VERSION_MINOR 5
11#define WILDCARDS_VERSION_PATCH 0
12#ifndef WILDCARDS_CARDS_HPP
13#define WILDCARDS_CARDS_HPP
14#include <cstddef>
15#include <initializer_list>
16#include <ostream>
17#include <stdexcept>
18#include <type_traits>
19#include <utility>
20namespace wildcards {
21template <typename T>
22struct cards {
23 constexpr cards(T a, T s, T e)
24 : anything{std::move(a)}, single{std::move(s)}, escape{std::move(e)}, set_enabled{false}, alt_enabled{false}
25 {
26 }
27 constexpr cards(T a, T s, T e, T so, T sc, T sn, T ao, T ac, T ar)
28 : anything{std::move(a)},
29 single{std::move(s)},
30 escape{std::move(e)},
31 set_enabled{true},
32 set_open{std::move(so)},
33 set_close{std::move(sc)},
34 set_not{std::move(sn)},
35 alt_enabled{true},
36 alt_open{std::move(ao)},
37 alt_close{std::move(ac)},
38 alt_or{std::move(ar)}
39 {
40 }
52};
57template <>
58struct cards<char> {
61 {
62 }
63 constexpr cards(char a, char s, char e)
64 : anything{std::move(a)}, single{std::move(s)}, escape{std::move(e)}, set_enabled{false}, alt_enabled{false}
65 {
66 }
67 constexpr cards(char a, char s, char e, char so, char sc, char sn, char ao, char ac, char ar)
68 : anything{std::move(a)},
69 single{std::move(s)},
70 escape{std::move(e)},
71 set_enabled{true},
72 set_open{std::move(so)},
73 set_close{std::move(sc)},
74 set_not{std::move(sn)},
75 alt_enabled{true},
76 alt_open{std::move(ao)},
77 alt_close{std::move(ac)},
78 alt_or{std::move(ar)}
79 {
80 }
81 char anything{'*'};
82 char single{'?'};
83 char escape{'\\'};
84 bool set_enabled{true};
85 char set_open{'['};
86 char set_close{']'};
87 char set_not{'!'};
88 bool alt_enabled{true};
89 char alt_open{'('};
90 char alt_close{')'};
91 char alt_or{'|'};
92};
93template <>
94struct cards<char16_t> {
97 {
98 }
99 constexpr cards(char16_t a, char16_t s, char16_t e)
100 : anything{std::move(a)}, single{std::move(s)}, escape{std::move(e)}, set_enabled{false}, alt_enabled{false}
101 {
102 }
103 constexpr cards(char16_t a, char16_t s, char16_t e, char16_t so, char16_t sc, char16_t sn, char16_t ao, char16_t ac,
104 char16_t ar)
105 : anything{std::move(a)},
106 single{std::move(s)},
107 escape{std::move(e)},
108 set_enabled{true},
109 set_open{std::move(so)},
110 set_close{std::move(sc)},
111 set_not{std::move(sn)},
112 alt_enabled{true},
113 alt_open{std::move(ao)},
114 alt_close{std::move(ac)},
115 alt_or{std::move(ar)}
116 {
117 }
118 char16_t anything{u'*'};
119 char16_t single{u'?'};
120 char16_t escape{u'\\'};
121 bool set_enabled{true};
122 char16_t set_open{u'['};
123 char16_t set_close{u']'};
124 char16_t set_not{u'!'};
125 bool alt_enabled{true};
126 char16_t alt_open{u'('};
127 char16_t alt_close{u')'};
128 char16_t alt_or{u'|'};
129};
130template <>
131struct cards<char32_t> {
134 {
135 }
136 constexpr cards(char32_t a, char32_t s, char32_t e)
137 : anything{std::move(a)}, single{std::move(s)}, escape{std::move(e)}, set_enabled{false}, alt_enabled{false}
138 {
139 }
140 constexpr cards(char32_t a, char32_t s, char32_t e, char32_t so, char32_t sc, char32_t sn, char32_t ao, char32_t ac,
141 char32_t ar)
142 : anything{std::move(a)},
143 single{std::move(s)},
144 escape{std::move(e)},
145 set_enabled{true},
146 set_open{std::move(so)},
147 set_close{std::move(sc)},
148 set_not{std::move(sn)},
149 alt_enabled{true},
150 alt_open{std::move(ao)},
151 alt_close{std::move(ac)},
152 alt_or{std::move(ar)}
153 {
154 }
155 char32_t anything{U'*'};
156 char32_t single{U'?'};
157 char32_t escape{U'\\'};
158 bool set_enabled{true};
159 char32_t set_open{U'['};
160 char32_t set_close{U']'};
161 char32_t set_not{U'!'};
162 bool alt_enabled{true};
163 char32_t alt_open{U'('};
164 char32_t alt_close{U')'};
165 char32_t alt_or{U'|'};
166};
167template <>
168struct cards<wchar_t> {
171 {
172 }
173 constexpr cards(wchar_t a, wchar_t s, wchar_t e)
174 : anything{std::move(a)}, single{std::move(s)}, escape{std::move(e)}, set_enabled{false}, alt_enabled{false}
175 {
176 }
177 constexpr cards(wchar_t a, wchar_t s, wchar_t e, wchar_t so, wchar_t sc, wchar_t sn, wchar_t ao, wchar_t ac,
178 wchar_t ar)
179 : anything{std::move(a)},
180 single{std::move(s)},
181 escape{std::move(e)},
182 set_enabled{true},
183 set_open{std::move(so)},
184 set_close{std::move(sc)},
185 set_not{std::move(sn)},
186 alt_enabled{true},
187 alt_open{std::move(ao)},
188 alt_close{std::move(ac)},
189 alt_or{std::move(ar)}
190 {
191 }
192 wchar_t anything{L'*'};
193 wchar_t single{L'?'};
194 wchar_t escape{L'\\'};
195 bool set_enabled{true};
196 wchar_t set_open{L'['};
197 wchar_t set_close{L']'};
198 wchar_t set_not{L'!'};
199 bool alt_enabled{true};
200 wchar_t alt_open{L'('};
201 wchar_t alt_close{L')'};
202 wchar_t alt_or{L'|'};
203};
204template <typename T>
205constexpr cards<T> make_cards(T &&a, T &&s, T &&e)
206{
207 return {std::forward<T>(a), std::forward<T>(s), std::forward<T>(e)};
208}
209template <typename T>
210constexpr cards<T> make_cards(T &&a, T &&s, T &&e, T &&so, T &&sc, T &&sn, T &&ao, T &&ac, T &&ar)
211{
212 return {std::forward<T>(a), std::forward<T>(s), std::forward<T>(e), std::forward<T>(so), std::forward<T>(sc),
213 std::forward<T>(sn), std::forward<T>(ao), std::forward<T>(ac), std::forward<T>(ar)};
214}
215} // namespace wildcards
216#endif
217namespace cx {
218template <typename T>
219struct less {
220 constexpr auto operator()(const T &lhs, const T &rhs) const -> decltype(lhs < rhs) { return lhs < rhs; }
221};
222template <>
223struct less<void> {
224 template <typename T, typename U>
225 constexpr auto operator()(T &&lhs, U &&rhs) const -> decltype(std::forward<T>(lhs) < std::forward<U>(rhs))
226 {
227 return std::forward<T>(lhs) < std::forward<U>(rhs);
228 }
229};
230template <typename T>
231struct equal_to {
232 constexpr auto operator()(const T &lhs, const T &rhs) const -> decltype(lhs == rhs) { return lhs == rhs; }
233};
234template <>
235struct equal_to<void> {
236 template <typename T, typename U>
237 constexpr auto operator()(T &&lhs, U &&rhs) const -> decltype(std::forward<T>(lhs) == std::forward<U>(rhs))
238 {
239 return std::forward<T>(lhs) == std::forward<U>(rhs);
240 }
241};
242} // namespace cx
243namespace cx {
244template <typename It>
245constexpr It next(It it)
246{
247 return it + 1;
248}
249template <typename It>
250constexpr It prev(It it)
251{
252 return it - 1;
253}
254template <typename C>
255constexpr auto size(const C &c) -> decltype(c.size())
256{
257 return c.size();
258}
259template <typename T, std::size_t N>
260constexpr std::size_t size(const T (&)[N])
261{
262 return N;
263}
264template <typename C>
265constexpr auto empty(const C &c) -> decltype(c.empty())
266{
267 return c.empty();
268}
269template <typename T, std::size_t N>
270constexpr bool empty(const T (&)[N])
271{
272 return false;
273}
274template <typename E>
275constexpr bool empty(std::initializer_list<E> il)
276{
277 return il.size() == 0;
278}
279template <typename C>
280constexpr auto begin(const C &c) -> decltype(c.begin())
281{
282 return c.begin();
283}
284template <typename C>
285constexpr auto begin(C &c) -> decltype(c.begin())
286{
287 return c.begin();
288}
289template <typename T, std::size_t N>
290constexpr T *begin(T (&array)[N])
291{
292 return &array[0];
293}
294template <typename E>
295constexpr const E *begin(std::initializer_list<E> il)
296{
297 return il.begin();
298}
299template <typename C>
300constexpr auto cbegin(const C &c) -> decltype(cx::begin(c))
301{
302 return cx::begin(c);
303}
304template <typename C>
305constexpr auto end(const C &c) -> decltype(c.end())
306{
307 return c.end();
308}
309template <typename C>
310constexpr auto end(C &c) -> decltype(c.end())
311{
312 return c.end();
313}
314template <typename T, std::size_t N>
315constexpr T *end(T (&array)[N])
316{
317 return &array[N];
318}
319template <typename E>
320constexpr const E *end(std::initializer_list<E> il)
321{
322 return il.end();
323}
324template <typename C>
325constexpr auto cend(const C &c) -> decltype(cx::end(c))
326{
327 return cx::end(c);
328}
329} // namespace cx
330namespace wildcards {
331template <typename C>
333 using type =
334 typename std::remove_cv<typename std::remove_reference<decltype(cx::cbegin(std::declval<C>()))>::type>::type;
335};
336template <typename C>
338template <typename C>
339struct iterator {
340 using type =
341 typename std::remove_cv<typename std::remove_reference<decltype(cx::begin(std::declval<C>()))>::type>::type;
342};
343template <typename C>
345template <typename It>
347 using type = typename std::remove_cv<typename std::remove_reference<decltype(*std::declval<It>())>::type>::type;
348};
349template <typename It>
351template <typename C>
353 using type =
354 typename std::remove_cv<typename std::remove_reference<decltype(*cx::begin(std::declval<C>()))>::type>::type;
355};
356template <typename C>
358} // namespace wildcards
359namespace wildcards {
360template <typename SequenceIterator, typename PatternIterator>
362 bool res;
363 SequenceIterator s, send, s1;
364 PatternIterator p, pend, p1;
365 constexpr operator bool() const { return res; }
366};
367namespace detail {
368template <typename SequenceIterator, typename PatternIterator>
370 bool res;
371 SequenceIterator s;
372 PatternIterator p;
373 constexpr operator bool() const { return res; }
374};
375template <typename SequenceIterator, typename PatternIterator>
376constexpr match_result<SequenceIterator, PatternIterator>
377make_match_result(bool res, SequenceIterator s, PatternIterator p)
378{
379 return {std::move(res), std::move(s), std::move(p)};
380}
381template <typename SequenceIterator, typename PatternIterator>
383make_full_match_result(SequenceIterator s, SequenceIterator send, PatternIterator p, PatternIterator pend,
385{
386 return {std::move(mr.res), std::move(s), std::move(send), std::move(mr.s),
387 std::move(p), std::move(pend), std::move(mr.p)};
388}
395template <typename PatternIterator>
396constexpr bool is_set(PatternIterator p, PatternIterator pend,
399{
400 if (!c.set_enabled) {
401 return false;
402 }
403 while (p != pend) {
404 switch (state) {
406 if (*p != c.set_open) {
407 return false;
408 }
410 break;
412 if (*p == c.set_not) {
413 state = is_set_state::first;
414 } else {
415 state = is_set_state::next;
416 }
417 break;
418 case is_set_state::first: state = is_set_state::next; break;
420 if (*p == c.set_close) {
421 return true;
422 }
423 break;
424 default:
425 throw std::logic_error("The program execution should never end up here throwing this exception");
426 }
427 p = cx::next(p);
428 }
429 return false;
430}
437template <typename PatternIterator>
438constexpr PatternIterator
439set_end(PatternIterator p, PatternIterator pend,
442{
443 if (!c.set_enabled) {
444 throw std::invalid_argument("The use of sets is disabled");
445 }
446 while (p != pend) {
447 switch (state) {
449 if (*p != c.set_open) {
450 throw std::invalid_argument("The given pattern is not a valid set");
451 }
453 break;
455 if (*p == c.set_not) {
456 state = set_end_state::first;
457 } else {
458 state = set_end_state::next;
459 }
460 break;
461 case set_end_state::first: state = set_end_state::next; break;
463 if (*p == c.set_close) {
464 return cx::next(p);
465 }
466 break;
467 default:
468 throw std::logic_error("The program execution should never end up here throwing this exception");
469 }
470 p = cx::next(p);
471 }
472 throw std::invalid_argument("The given pattern is not a valid set");
473}
481template <typename SequenceIterator, typename PatternIterator, typename EqualTo = cx::equal_to<void>>
482constexpr match_result<SequenceIterator, PatternIterator>
483match_set(SequenceIterator s, SequenceIterator send, PatternIterator p, PatternIterator pend,
485 const EqualTo &equal_to = EqualTo(), match_set_state state = match_set_state::open)
486{
487 if (!c.set_enabled) {
488 throw std::invalid_argument("The use of sets is disabled");
489 }
490 while (p != pend) {
491 switch (state) {
493 if (*p != c.set_open) {
494 throw std::invalid_argument("The given pattern is not a valid set");
495 }
497 break;
499 if (*p == c.set_not) {
501 } else {
502 if (s == send) {
503 return make_match_result(false, s, p);
504 }
505 if (equal_to(*s, *p)) {
506 return make_match_result(true, s, p);
507 }
509 }
510 break;
512 if (s == send || equal_to(*s, *p)) {
513 return make_match_result(false, s, p);
514 }
516 break;
518 if (*p == c.set_close || s == send) {
519 return make_match_result(false, s, p);
520 }
521 if (equal_to(*s, *p)) {
522 return make_match_result(true, s, p);
523 }
524 break;
526 if (*p == c.set_close) {
527 return make_match_result(true, s, p);
528 }
529 if (s == send || equal_to(*s, *p)) {
530 return make_match_result(false, s, p);
531 }
532 break;
533 default:
534 throw std::logic_error("The program execution should never end up here throwing this exception");
535 }
536 p = cx::next(p);
537 }
538 throw std::invalid_argument("The given pattern is not a valid set");
539}
545template <typename PatternIterator>
546constexpr bool is_alt(PatternIterator p, PatternIterator pend,
548 is_alt_state state = is_alt_state::open, int depth = 0)
549{
550 if (!c.alt_enabled) {
551 return false;
552 }
553 while (p != pend) {
554 switch (state) {
556 if (*p != c.alt_open) {
557 return false;
558 }
559 state = is_alt_state::next;
560 ++depth;
561 break;
563 if (*p == c.escape) {
564 state = is_alt_state::escape;
565 } else if (c.set_enabled && *p == c.set_open && is_set(cx::next(p), pend, c, is_set_state::not_or_first)) {
567 } else if (*p == c.alt_open) {
568 ++depth;
569 } else if (*p == c.alt_close) {
570 --depth;
571 if (depth == 0) {
572 return true;
573 }
574 }
575 break;
576 case is_alt_state::escape: state = is_alt_state::next; break;
577 default:
578 throw std::logic_error("The program execution should never end up here throwing this exception");
579 }
580 p = cx::next(p);
581 }
582 return false;
583}
589template <typename PatternIterator>
590constexpr PatternIterator
591alt_end(PatternIterator p, PatternIterator pend,
593 alt_end_state state = alt_end_state::open, int depth = 0)
594{
595 if (!c.alt_enabled) {
596 throw std::invalid_argument("The use of alternatives is disabled");
597 }
598 while (p != pend) {
599 switch (state) {
601 if (*p != c.alt_open) {
602 throw std::invalid_argument("The given pattern is not a valid alternative");
603 }
604 state = alt_end_state::next;
605 ++depth;
606 break;
608 if (*p == c.escape) {
609 state = alt_end_state::escape;
610 } else if (c.set_enabled && *p == c.set_open && is_set(cx::next(p), pend, c, is_set_state::not_or_first)) {
612 } else if (*p == c.alt_open) {
613 ++depth;
614 } else if (*p == c.alt_close) {
615 --depth;
616 if (depth == 0) {
617 return cx::next(p);
618 }
619 }
620 break;
621 case alt_end_state::escape: state = alt_end_state::next; break;
622 default:
623 throw std::logic_error("The program execution should never end up here throwing this exception");
624 }
625 p = cx::next(p);
626 }
627 throw std::invalid_argument("The given pattern is not a valid alternative");
628}
633template <typename PatternIterator>
634constexpr PatternIterator
635alt_sub_end(PatternIterator p, PatternIterator pend,
637 alt_sub_end_state state = alt_sub_end_state::next, int depth = 1)
638{
639 if (!c.alt_enabled) {
640 throw std::invalid_argument("The use of alternatives is disabled");
641 }
642 while (p != pend) {
643 switch (state) {
645 if (*p == c.escape) {
647 } else if (c.set_enabled && *p == c.set_open && is_set(cx::next(p), pend, c, is_set_state::not_or_first)) {
649 } else if (*p == c.alt_open) {
650 ++depth;
651 } else if (*p == c.alt_close) {
652 --depth;
653 if (depth == 0) {
654 return p;
655 }
656 } else if (*p == c.alt_or) {
657 if (depth == 1) {
658 return p;
659 }
660 }
661 break;
663 default:
664 throw std::logic_error("The program execution should never end up here throwing this exception");
665 }
666 p = cx::next(p);
667 }
668 throw std::invalid_argument("The given pattern is not a valid alternative");
669}
670template <typename SequenceIterator, typename PatternIterator, typename EqualTo = cx::equal_to<void>>
671constexpr match_result<SequenceIterator, PatternIterator>
672match(SequenceIterator s, SequenceIterator send, PatternIterator p, PatternIterator pend,
674 const EqualTo &equal_to = EqualTo(), bool partial = false, bool escape = false);
675template <typename SequenceIterator, typename PatternIterator, typename EqualTo = cx::equal_to<void>>
676constexpr match_result<SequenceIterator, PatternIterator>
677match_alt(SequenceIterator s, SequenceIterator send, PatternIterator p1, PatternIterator p1end, PatternIterator p2,
678 PatternIterator p2end,
680 const EqualTo &equal_to = EqualTo(), bool partial = false)
681{
682 auto result1 = match(s, send, p1, p1end, c, equal_to, true);
683 if (result1) {
684 auto result2 = match(result1.s, send, p2, p2end, c, equal_to, partial);
685 if (result2) {
686 return result2;
687 }
688 }
689 p1 = cx::next(p1end);
690 if (p1 == p2) {
691 return make_match_result(false, s, p1end);
692 }
693 return match_alt(s, send, p1, alt_sub_end(p1, p2, c), p2, p2end, c, equal_to, partial);
694}
695template <typename SequenceIterator, typename PatternIterator, typename EqualTo>
696constexpr match_result<SequenceIterator, PatternIterator>
697match(SequenceIterator s, SequenceIterator send, PatternIterator p, PatternIterator pend,
698 const cards<iterated_item_t<PatternIterator>> &c, const EqualTo &equal_to, bool partial, bool escape)
699{
700 if (p == pend) {
701 return make_match_result(partial || s == send, s, p);
702 }
703 if (escape) {
704 if (s == send || !equal_to(*s, *p)) {
705 return make_match_result(false, s, p);
706 }
707 return match(cx::next(s), send, cx::next(p), pend, c, equal_to, partial);
708 }
709 if (*p == c.anything) {
710 auto result = match(s, send, cx::next(p), pend, c, equal_to, partial);
711 if (result) {
712 return result;
713 }
714 if (s == send) {
715 return make_match_result(false, s, p);
716 }
717 return match(cx::next(s), send, p, pend, c, equal_to, partial);
718 }
719 if (*p == c.single) {
720 if (s == send) {
721 return make_match_result(false, s, p);
722 }
723 return match(cx::next(s), send, cx::next(p), pend, c, equal_to, partial);
724 }
725 if (*p == c.escape) {
726 return match(s, send, cx::next(p), pend, c, equal_to, partial, true);
727 }
728 if (c.set_enabled && *p == c.set_open && is_set(cx::next(p), pend, c, is_set_state::not_or_first)) {
729 auto result = match_set(s, send, cx::next(p), pend, c, equal_to, match_set_state::not_or_first_in);
730 if (!result) {
731 return result;
732 }
733 return match(cx::next(s), send, set_end(cx::next(p), pend, c, set_end_state::not_or_first), pend, c, equal_to,
734 partial);
735 }
736 if (c.alt_enabled && *p == c.alt_open && is_alt(cx::next(p), pend, c, is_alt_state::next, 1)) {
737 auto p_alt_end = alt_end(cx::next(p), pend, c, alt_end_state::next, 1);
738 return match_alt(s, send, cx::next(p), alt_sub_end(cx::next(p), p_alt_end, c), p_alt_end, pend, c, equal_to,
739 partial);
740 }
741 if (s == send || !equal_to(*s, *p)) {
742 return make_match_result(false, s, p);
743 }
744 return match(cx::next(s), send, cx::next(p), pend, c, equal_to, partial);
745}
746} // namespace detail
747template <typename Sequence, typename Pattern, typename EqualTo = cx::equal_to<void>>
748constexpr full_match_result<const_iterator_t<Sequence>, const_iterator_t<Pattern>>
749match(Sequence &&sequence, Pattern &&pattern,
751 const EqualTo &equal_to = EqualTo())
752{
754 cx::cbegin(sequence), cx::cend(sequence), cx::cbegin(pattern), cx::cend(pattern),
755 detail::match(cx::cbegin(sequence), cx::cend(std::forward<Sequence>(sequence)), cx::cbegin(pattern),
756 cx::cend(std::forward<Pattern>(pattern)), c, equal_to));
757}
758template <typename Sequence, typename Pattern, typename EqualTo = cx::equal_to<void>,
759 typename = typename std::enable_if<!std::is_same<EqualTo, cards_type>::value>::type>
760constexpr full_match_result<const_iterator_t<Sequence>, const_iterator_t<Pattern>>
761match(Sequence &&sequence, Pattern &&pattern, const EqualTo &equal_to)
762{
763 return match(std::forward<Sequence>(sequence), std::forward<Pattern>(pattern), cards<container_item_t<Pattern>>(),
764 equal_to);
765}
766} // namespace wildcards
767namespace cx {
768template <typename Iterator1, typename Iterator2>
769constexpr bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2)
770{
771 while (first1 != last1 && first2 != last2 && *first1 == *first2) {
772 ++first1, ++first2;
773 }
774 return first1 == last1 && first2 == last2;
775}
776} // namespace cx
777namespace cx {
778template <typename T>
780public:
781 using value_type = T;
782 constexpr basic_string_view() = default;
783 template <std::size_t N>
784 constexpr basic_string_view(const T (&str)[N]) : data_{&str[0]}, size_{N - 1}
785 {
786 }
787 constexpr basic_string_view(const T *str, std::size_t s) : data_{str}, size_{s} {}
788 constexpr const T *data() const { return data_; }
789 constexpr std::size_t size() const { return size_; }
790 constexpr bool empty() const { return size() == 0; }
791 constexpr const T *begin() const { return data_; }
792 constexpr const T *cbegin() const { return begin(); }
793 constexpr const T *end() const { return data_ + size_; }
794 constexpr const T *cend() const { return end(); }
795
796private:
797 const T *data_{nullptr};
798 std::size_t size_{0};
799};
800template <typename T>
801constexpr bool operator==(const basic_string_view<T> &lhs, const basic_string_view<T> &rhs)
802{
803 return equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
804}
805template <typename T>
806constexpr bool operator!=(const basic_string_view<T> &lhs, const basic_string_view<T> &rhs)
807{
808 return !(lhs == rhs);
809}
810template <typename T>
811std::basic_ostream<T> &operator<<(std::basic_ostream<T> &o, const basic_string_view<T> &s)
812{
813 o << s.data();
814 return o;
815}
816template <typename T, std::size_t N>
817constexpr basic_string_view<T> make_string_view(const T (&str)[N])
818{
819 return {str, N - 1};
820}
821template <typename T>
822constexpr basic_string_view<T> make_string_view(const T *str, std::size_t s)
823{
824 return {str, s};
825}
830namespace literals {
831constexpr string_view operator""_sv(const char *str, std::size_t s)
832{
833 return {str, s};
834}
835constexpr u16string_view operator""_sv(const char16_t *str, std::size_t s)
836{
837 return {str, s};
838}
839constexpr u32string_view operator""_sv(const char32_t *str, std::size_t s)
840{
841 return {str, s};
842}
843constexpr wstring_view operator""_sv(const wchar_t *str, std::size_t s)
844{
845 return {str, s};
846}
847} // namespace literals
848} // namespace cx
849namespace wildcards {
850template <typename Pattern, typename EqualTo = cx::equal_to<void>>
851class matcher {
852public:
853 constexpr explicit matcher(Pattern &&pattern,
855 const EqualTo &equal_to = EqualTo())
856 : p_{cx::cbegin(pattern)}, pend_{cx::cend(std::forward<Pattern>(pattern))}, c_{c}, equal_to_{equal_to}
857 {
858 }
859 constexpr matcher(Pattern &&pattern, const EqualTo &equal_to)
860 : p_{cx::cbegin(pattern)},
861 pend_{cx::cend(std::forward<Pattern>(pattern))},
863 equal_to_{equal_to}
864 {
865 }
866 template <typename Sequence>
868 {
870 cx::cbegin(sequence), cx::cend(sequence), p_, pend_,
871 detail::match(cx::cbegin(sequence), cx::cend(std::forward<Sequence>(sequence)), p_, pend_, c_, equal_to_));
872 }
873
874private:
878 EqualTo equal_to_;
879};
880template <typename Pattern, typename EqualTo = cx::equal_to<void>>
883 const EqualTo &equal_to = EqualTo())
884{
885 return matcher<Pattern, EqualTo>{std::forward<Pattern>(pattern), c, equal_to};
886}
887template <typename Pattern, typename EqualTo = cx::equal_to<void>,
888 typename = typename std::enable_if<!std::is_same<EqualTo, cards_type>::value>::type>
889constexpr matcher<Pattern, EqualTo> make_matcher(Pattern &&pattern, const EqualTo &equal_to)
890{
891 return make_matcher(std::forward<Pattern>(pattern), cards<container_item_t<Pattern>>(), equal_to);
892}
893namespace literals {
894constexpr auto operator""_wc(const char *str, std::size_t s) -> decltype(make_matcher(cx::make_string_view(str, s + 1)))
895{
896 return make_matcher(cx::make_string_view(str, s + 1));
897}
898constexpr auto operator""_wc(const char16_t *str, std::size_t s)
899 -> decltype(make_matcher(cx::make_string_view(str, s + 1)))
900{
901 return make_matcher(cx::make_string_view(str, s + 1));
902}
903constexpr auto operator""_wc(const char32_t *str, std::size_t s)
904 -> decltype(make_matcher(cx::make_string_view(str, s + 1)))
905{
906 return make_matcher(cx::make_string_view(str, s + 1));
907}
908constexpr auto operator""_wc(const wchar_t *str, std::size_t s)
909 -> decltype(make_matcher(cx::make_string_view(str, s + 1)))
910{
911 return make_matcher(cx::make_string_view(str, s + 1));
912}
913} // namespace literals
914} // namespace wildcards
915#endif
#define c(i)
Definition RSha256.hxx:101
#define a(i)
Definition RSha256.hxx:99
#define e(i)
Definition RSha256.hxx:103
#define N
#define void
Definition Tailor.h:179
constexpr basic_string_view(const T(&str)[N])
constexpr const T * begin() const
constexpr const T * data() const
constexpr std::size_t size() const
constexpr const T * end() const
constexpr basic_string_view(const T *str, std::size_t s)
constexpr basic_string_view()=default
constexpr bool empty() const
constexpr const T * cend() const
constexpr const T * cbegin() const
const_iterator_t< Pattern > p_
cards< container_item_t< Pattern > > c_
constexpr matcher(Pattern &&pattern, const cards< container_item_t< Pattern > > &c=cards< container_item_t< Pattern > >(), const EqualTo &equal_to=EqualTo())
constexpr matcher(Pattern &&pattern, const EqualTo &equal_to)
const_iterator_t< Pattern > pend_
constexpr full_match_result< const_iterator_t< Sequence >, const_iterator_t< Pattern > > matches(Sequence &&sequence) const
Double_t result(Double_t *x, Double_t *par)
Definition gr201_waves.C:37
bool first
Definition line3Dfit.C:46
constexpr auto end(const C &c) -> decltype(c.end())
basic_string_view< wchar_t > wstring_view
constexpr auto empty(const C &c) -> decltype(c.empty())
constexpr auto begin(const C &c) -> decltype(c.begin())
constexpr It prev(It it)
constexpr auto size(const C &c) -> decltype(c.size())
constexpr auto cend(const C &c) -> decltype(cx::end(c))
basic_string_view< char32_t > u32string_view
constexpr bool operator==(const basic_string_view< T > &lhs, const basic_string_view< T > &rhs)
basic_string_view< char > string_view
constexpr It next(It it)
constexpr basic_string_view< T > make_string_view(const T(&str)[N])
basic_string_view< char16_t > u16string_view
std::basic_ostream< T > & operator<<(std::basic_ostream< T > &o, const basic_string_view< T > &s)
constexpr auto cbegin(const C &c) -> decltype(cx::begin(c))
constexpr bool operator!=(const basic_string_view< T > &lhs, const basic_string_view< T > &rhs)
constexpr bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2)
constexpr bool is_set(PatternIterator p, PatternIterator pend, const cards< iterated_item_t< PatternIterator > > &c=cards< iterated_item_t< PatternIterator > >(), is_set_state state=is_set_state::open)
constexpr full_match_result< SequenceIterator, PatternIterator > make_full_match_result(SequenceIterator s, SequenceIterator send, PatternIterator p, PatternIterator pend, match_result< SequenceIterator, PatternIterator > mr)
constexpr match_result< SequenceIterator, PatternIterator > make_match_result(bool res, SequenceIterator s, PatternIterator p)
constexpr PatternIterator set_end(PatternIterator p, PatternIterator pend, const cards< iterated_item_t< PatternIterator > > &c=cards< iterated_item_t< PatternIterator > >(), set_end_state state=set_end_state::open)
constexpr bool is_alt(PatternIterator p, PatternIterator pend, const cards< iterated_item_t< PatternIterator > > &c=cards< iterated_item_t< PatternIterator > >(), is_alt_state state=is_alt_state::open, int depth=0)
constexpr match_result< SequenceIterator, PatternIterator > match(SequenceIterator s, SequenceIterator send, PatternIterator p, PatternIterator pend, const cards< iterated_item_t< PatternIterator > > &c=cards< iterated_item_t< PatternIterator > >(), const EqualTo &equal_to=EqualTo(), bool partial=false, bool escape=false)
constexpr PatternIterator alt_sub_end(PatternIterator p, PatternIterator pend, const cards< iterated_item_t< PatternIterator > > &c=cards< iterated_item_t< PatternIterator > >(), alt_sub_end_state state=alt_sub_end_state::next, int depth=1)
constexpr match_result< SequenceIterator, PatternIterator > match_alt(SequenceIterator s, SequenceIterator send, PatternIterator p1, PatternIterator p1end, PatternIterator p2, PatternIterator p2end, const cards< iterated_item_t< PatternIterator > > &c=cards< iterated_item_t< PatternIterator > >(), const EqualTo &equal_to=EqualTo(), bool partial=false)
constexpr match_result< SequenceIterator, PatternIterator > match_set(SequenceIterator s, SequenceIterator send, PatternIterator p, PatternIterator pend, const cards< iterated_item_t< PatternIterator > > &c=cards< iterated_item_t< PatternIterator > >(), const EqualTo &equal_to=EqualTo(), match_set_state state=match_set_state::open)
constexpr PatternIterator alt_end(PatternIterator p, PatternIterator pend, const cards< iterated_item_t< PatternIterator > > &c=cards< iterated_item_t< PatternIterator > >(), alt_end_state state=alt_end_state::open, int depth=0)
constexpr cards< T > make_cards(T &&a, T &&s, T &&e)
typename iterated_item< It >::type iterated_item_t
constexpr matcher< Pattern, EqualTo > make_matcher(Pattern &&pattern, const cards< container_item_t< Pattern > > &c=cards< container_item_t< Pattern > >(), const EqualTo &equal_to=EqualTo())
constexpr full_match_result< const_iterator_t< Sequence >, const_iterator_t< Pattern > > match(Sequence &&sequence, Pattern &&pattern, const cards< container_item_t< Pattern > > &c=cards< container_item_t< Pattern > >(), const EqualTo &equal_to=EqualTo())
typename iterator< C >::type iterator_t
typename container_item< C >::type container_item_t
typename const_iterator< C >::type const_iterator_t
TSpectrum2 * s
Definition peaks2.C:33
TArrow ar(9, 23, 9, 21.6, 0.015,"|>")
constexpr auto operator()(T &&lhs, U &&rhs) const -> decltype(std::forward< T >(lhs)==std::forward< U >(rhs))
constexpr auto operator()(const T &lhs, const T &rhs) const -> decltype(lhs==rhs)
constexpr auto operator()(T &&lhs, U &&rhs) const -> decltype(std::forward< T >(lhs)< std::forward< U >(rhs))
constexpr auto operator()(const T &lhs, const T &rhs) const -> decltype(lhs< rhs)
constexpr cards(char16_t a, char16_t s, char16_t e)
Definition wildcards.hpp:99
constexpr cards(char16_t a, char16_t s, char16_t e, char16_t so, char16_t sc, char16_t sn, char16_t ao, char16_t ac, char16_t ar)
constexpr cards(cards_type type=cards_type::extended)
Definition wildcards.hpp:95
constexpr cards(char32_t a, char32_t s, char32_t e)
constexpr cards(cards_type type=cards_type::extended)
constexpr cards(char32_t a, char32_t s, char32_t e, char32_t so, char32_t sc, char32_t sn, char32_t ao, char32_t ac, char32_t ar)
constexpr cards(char a, char s, char e, char so, char sc, char sn, char ao, char ac, char ar)
Definition wildcards.hpp:67
constexpr cards(cards_type type=cards_type::extended)
Definition wildcards.hpp:59
constexpr cards(char a, char s, char e)
Definition wildcards.hpp:63
constexpr cards(cards_type type=cards_type::extended)
constexpr cards(wchar_t a, wchar_t s, wchar_t e)
constexpr cards(wchar_t a, wchar_t s, wchar_t e, wchar_t so, wchar_t sc, wchar_t sn, wchar_t ao, wchar_t ac, wchar_t ar)
constexpr cards(T a, T s, T e, T so, T sc, T sn, T ao, T ac, T ar)
Definition wildcards.hpp:27
constexpr cards(T a, T s, T e)
Definition wildcards.hpp:23
typename std::remove_cv< typename std::remove_reference< decltype(cx::cbegin(std::declval< C >()))>::type >::type type
typename std::remove_cv< typename std::remove_reference< decltype(*cx::begin(std::declval< C >()))>::type >::type type
typename std::remove_cv< typename std::remove_reference< decltype(*std::declval< It >())>::type >::type type
typename std::remove_cv< typename std::remove_reference< decltype(cx::begin(std::declval< C >()))>::type >::type type