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
15#include <initializer_list>
27 constexpr cards(T
a, T
s, T
e, T so, T sc, T sn, T ao, T ac, T
ar)
67 constexpr cards(
char a,
char s,
char e,
char so,
char sc,
char sn,
char ao,
char ac,
char ar)
99 constexpr cards(
char16_t a,
char16_t s,
char16_t e)
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,
136 constexpr cards(
char32_t a,
char32_t s,
char32_t e)
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,
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,
207 return {std::forward<T>(
a), std::forward<T>(
s), std::forward<T>(
e)};
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)};
220 constexpr auto operator()(
const T &lhs,
const T &rhs)
const ->
decltype(lhs < rhs) {
return lhs < rhs; }
224 template <
typename T,
typename U>
225 constexpr auto operator()(T &&lhs, U &&rhs)
const ->
decltype(std::forward<T>(lhs) < std::forward<U>(rhs))
227 return std::forward<T>(lhs) < std::forward<U>(rhs);
232 constexpr auto operator()(
const T &lhs,
const T &rhs)
const ->
decltype(lhs == rhs) {
return lhs == rhs; }
236 template <
typename T,
typename U>
237 constexpr auto operator()(T &&lhs, U &&rhs)
const ->
decltype(std::forward<T>(lhs) == std::forward<U>(rhs))
239 return std::forward<T>(lhs) == std::forward<U>(rhs);
244template <
typename It>
249template <
typename It>
255constexpr auto size(
const C &
c) ->
decltype(
c.size())
259template <
typename T, std::
size_t N>
260constexpr std::size_t
size(
const T (&)[
N])
265constexpr auto empty(
const C &
c) ->
decltype(
c.empty())
269template <
typename T, std::
size_t N>
275constexpr bool empty(std::initializer_list<E> il)
277 return il.size() == 0;
280constexpr auto begin(
const C &
c) ->
decltype(
c.begin())
285constexpr auto begin(C &
c) ->
decltype(
c.begin())
289template <
typename T, std::
size_t N>
295constexpr const E *
begin(std::initializer_list<E> il)
305constexpr auto end(
const C &
c) ->
decltype(
c.end())
310constexpr auto end(C &
c) ->
decltype(
c.end())
314template <
typename T, std::
size_t N>
320constexpr const E *
end(std::initializer_list<E> il)
334 typename std::remove_cv<typename std::remove_reference<decltype(cx::cbegin(std::declval<C>()))>
::type>
::type;
341 typename std::remove_cv<typename std::remove_reference<decltype(cx::begin(std::declval<C>()))>
::type>
::type;
345template <
typename It>
347 using type =
typename std::remove_cv<typename std::remove_reference<decltype(*std::declval<It>())>
::type>
::type;
349template <
typename It>
354 typename std::remove_cv<typename std::remove_reference<decltype(*cx::begin(std::declval<C>()))>
::type>
::type;
360template <
typename SequenceIterator,
typename PatternIterator>
365 constexpr operator bool()
const {
return res; }
368template <
typename SequenceIterator,
typename PatternIterator>
373 constexpr operator bool()
const {
return res; }
375template <
typename SequenceIterator,
typename PatternIterator>
376constexpr match_result<SequenceIterator, PatternIterator>
379 return {std::move(res), std::move(
s), std::move(p)};
381template <
typename SequenceIterator,
typename PatternIterator>
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)};
395template <
typename PatternIterator>
396constexpr bool is_set(PatternIterator p, PatternIterator pend,
400 if (!
c.set_enabled) {
406 if (*p !=
c.set_open) {
412 if (*p ==
c.set_not) {
420 if (*p ==
c.set_close) {
425 throw std::logic_error(
"The program execution should never end up here throwing this exception");
437template <
typename PatternIterator>
438constexpr PatternIterator
439set_end(PatternIterator p, PatternIterator pend,
443 if (!
c.set_enabled) {
444 throw std::invalid_argument(
"The use of sets is disabled");
449 if (*p !=
c.set_open) {
450 throw std::invalid_argument(
"The given pattern is not a valid set");
455 if (*p ==
c.set_not) {
463 if (*p ==
c.set_close) {
468 throw std::logic_error(
"The program execution should never end up here throwing this exception");
472 throw std::invalid_argument(
"The given pattern is not a valid set");
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,
487 if (!
c.set_enabled) {
488 throw std::invalid_argument(
"The use of sets is disabled");
493 if (*p !=
c.set_open) {
494 throw std::invalid_argument(
"The given pattern is not a valid set");
499 if (*p ==
c.set_not) {
505 if (equal_to(*
s, *p)) {
512 if (
s == send || equal_to(*
s, *p)) {
518 if (*p ==
c.set_close ||
s == send) {
521 if (equal_to(*
s, *p)) {
526 if (*p ==
c.set_close) {
529 if (
s == send || equal_to(*
s, *p)) {
534 throw std::logic_error(
"The program execution should never end up here throwing this exception");
538 throw std::invalid_argument(
"The given pattern is not a valid set");
545template <
typename PatternIterator>
546constexpr bool is_alt(PatternIterator p, PatternIterator pend,
550 if (!
c.alt_enabled) {
556 if (*p !=
c.alt_open) {
563 if (*p ==
c.escape) {
567 }
else if (*p ==
c.alt_open) {
569 }
else if (*p ==
c.alt_close) {
578 throw std::logic_error(
"The program execution should never end up here throwing this exception");
589template <
typename PatternIterator>
590constexpr PatternIterator
591alt_end(PatternIterator p, PatternIterator pend,
595 if (!
c.alt_enabled) {
596 throw std::invalid_argument(
"The use of alternatives is disabled");
601 if (*p !=
c.alt_open) {
602 throw std::invalid_argument(
"The given pattern is not a valid alternative");
608 if (*p ==
c.escape) {
612 }
else if (*p ==
c.alt_open) {
614 }
else if (*p ==
c.alt_close) {
623 throw std::logic_error(
"The program execution should never end up here throwing this exception");
627 throw std::invalid_argument(
"The given pattern is not a valid alternative");
633template <
typename PatternIterator>
634constexpr PatternIterator
639 if (!
c.alt_enabled) {
640 throw std::invalid_argument(
"The use of alternatives is disabled");
645 if (*p ==
c.escape) {
649 }
else if (*p ==
c.alt_open) {
651 }
else if (*p ==
c.alt_close) {
656 }
else if (*p ==
c.alt_or) {
664 throw std::logic_error(
"The program execution should never end up here throwing this exception");
668 throw std::invalid_argument(
"The given pattern is not a valid alternative");
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)
682 auto result1 =
match(
s, send, p1, p1end,
c, equal_to,
true);
684 auto result2 =
match(result1.s, send, p2, p2end,
c, equal_to, partial);
693 return match_alt(
s, send, p1,
alt_sub_end(p1, p2,
c), p2, p2end,
c, equal_to, partial);
695template <
typename SequenceIterator,
typename PatternIterator,
typename EqualTo>
696constexpr match_result<SequenceIterator, PatternIterator>
697match(SequenceIterator
s, SequenceIterator send, PatternIterator p, PatternIterator pend,
704 if (
s == send || !equal_to(*
s, *p)) {
709 if (*p ==
c.anything) {
719 if (*p ==
c.single) {
725 if (*p ==
c.escape) {
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,
741 if (
s == send || !equal_to(*
s, *p)) {
747template <
typename Sequence,
typename Pattern,
typename EqualTo = cx::equal_to<
void>>
748constexpr full_match_result<const_iterator_t<Sequence>, const_iterator_t<Pattern>>
751 const EqualTo &equal_to = EqualTo())
756 cx::cend(std::forward<Pattern>(pattern)),
c, equal_to));
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>>
768template <
typename Iterator1,
typename Iterator2>
769constexpr bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2)
771 while (first1 != last1 && first2 != last2 && *first1 == *first2) {
774 return first1 == last1 && first2 == last2;
783 template <std::
size_t N>
794 constexpr const T *
cend()
const {
return end(); }
808 return !(lhs == rhs);
811std::basic_ostream<T> &
operator<<(std::basic_ostream<T> &o,
const basic_string_view<T> &
s)
816template <
typename T, std::
size_t N>
850template <
typename Pattern,
typename EqualTo = cx::equal_to<
void>>
855 const EqualTo &equal_to = EqualTo())
860 :
p_{
cx::cbegin(pattern)},
866 template <
typename Sequence>
880template <
typename Pattern,
typename EqualTo = cx::equal_to<
void>>
883 const EqualTo &equal_to = EqualTo())
887template <
typename Pattern,
typename EqualTo = cx::equal_to<
void>,
888 typename =
typename std::enable_if<!std::is_same<EqualTo, cards_type>::value>::type>
898constexpr auto operator""_wc(
const char16_t *str, std::size_t
s)
903constexpr auto operator""_wc(
const char32_t *str, std::size_t
s)
908constexpr auto operator""_wc(
const wchar_t *str, std::size_t
s)
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)
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 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 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
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)
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)
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)
constexpr cards(cards_type type=cards_type::extended)
constexpr cards(char a, char s, char e)
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)
constexpr cards(T a, T s, T e)
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