#include #include void empty_symbol() { } template constexpr bool match(Subject input, Pattern) { return ctre::regular_expression::match(input); } template constexpr bool search(Subject input, Pattern) { return ctre::regular_expression::search(input); } template constexpr bool starts_with(Subject input, Pattern) { return ctre::regular_expression::starts_with(input); } template constexpr auto multiline_match(Subject input, Pattern) { return ctre::regular_expression::multiline_match(input); } template constexpr auto multiline_search(Subject input, Pattern) { return ctre::regular_expression::multiline_search(input); } template constexpr auto multiline_starts_with(Subject input, Pattern) { return ctre::regular_expression::multiline_starts_with(input); } using namespace std::string_view_literals; static_assert(match("a"sv, ctre::character<'a'>())); static_assert(search("abc"sv, ctre::character<'a'>())); static_assert(search("abc"sv, ctre::character<'b'>())); static_assert(search("abc"sv, ctre::character<'c'>())); static_assert(starts_with("abc"sv, ctre::character<'a'>())); static_assert(!starts_with("abc"sv, ctre::character<'b'>())); static_assert(!match("abc"sv, ctre::character<'b'>())); static_assert(!match("a"sv, ctre::character<'b'>())); static_assert(match("a"sv, ctre::any())); static_assert(match("a"sv, ctre::set>())); static_assert(match("f"sv, ctre::set>())); static_assert(match("z"sv, ctre::set>())); static_assert(!match("Z"sv, ctre::set>())); static_assert(match("0"sv, ctre::set, ctre::char_range<'0','9'>>())); static_assert(!match("A"sv, ctre::set, ctre::char_range<'0','9'>>())); static_assert(match("0"sv, ctre::set())); static_assert(match("9"sv, ctre::set())); static_assert(match("a"sv, ctre::set())); static_assert(match("f"sv, ctre::set())); static_assert(!match("g"sv, ctre::set())); static_assert(match("abcdef"sv, ctre::string<'a','b','c','d','e','f'>())); static_assert(!match("abcgef"sv, ctre::string<'a','b','c','d','e','f'>())); static_assert(match(""sv, ctre::string<>())); static_assert(match("a"sv, ctre::select, ctre::character<'b'>, ctre::character<'c'>>())); static_assert(match("b"sv, ctre::select, ctre::character<'b'>, ctre::character<'c'>>())); static_assert(match("c"sv, ctre::select, ctre::character<'b'>, ctre::character<'c'>>())); static_assert(!match("d"sv, ctre::select, ctre::character<'b'>, ctre::character<'c'>>())); static_assert(match("xy"sv, ctre::optional>())); static_assert(match(""sv, ctre::optional>())); static_assert(match("abc"sv, ctre::sequence>())); static_assert(match("def"sv, ctre::sequence, ctre::assert_subject_end>())); static_assert(!match("a"sv, ctre::sequence, ctre::assert_subject_begin>())); static_assert(!match("a"sv, ctre::sequence>())); static_assert(match("aaax"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(match("ax"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(!match("x"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(match("aaax"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(match("ax"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(!match("x"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(match("aaax"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(match("ax"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(match("x"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(!match("y"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(match("aaax"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(match("ax"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(match("x"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(!match("y"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(!match("aaab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(!match("aaab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(!match("ab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(!match("aab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(match("aaba"sv, ctre::sequence>, ctre::string<'b','a'>>())); static_assert(match("aaba"sv, ctre::sequence>, ctre::string<'b','a'>>())); static_assert(match("ba"sv, ctre::sequence>, ctre::string<'b','a'>>())); static_assert(match("aba"sv, ctre::sequence>, ctre::string<'b','a'>>())); static_assert(match("aaax"sv, ctre::sequence>, ctre::character<'x'>>())); static_assert(search("aaaaaa"sv, ctre::repeat<0,5,ctre::character<'a'>>())); static_assert(!match("aaaaaa"sv, ctre::sequence>, ctre::assert_subject_end>())); static_assert(match("aaaaa"sv, ctre::sequence>, ctre::assert_subject_end>())); static_assert(match("aaa"sv, ctre::star>())); static_assert(match("aaa"sv, ctre::plus>())); static_assert(match(""sv, ctre::star>())); static_assert(match("a"sv, ctre::plus>())); static_assert(match("aaxb"sv, ctre::sequence>, ctre::string<'x','b'>>())); static_assert(match("aaxb"sv, ctre::sequence>, ctre::string<'x','b'>>())); static_assert(match("xb"sv, ctre::sequence>, ctre::string<'x','b'>>())); static_assert(match("axb"sv, ctre::sequence>, ctre::string<'x','b'>>())); static_assert(match("aaab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(match("aaab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(match("ab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(match("aab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(!match("aab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(match("aaab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(match("aaaab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(match("aaaaab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(match("aaaaaab"sv, ctre::sequence>, ctre::string<'a','b'>>())); static_assert(!match("aaaaaaab"sv, ctre::sequence>, ctre::string<'a','b'>>())); // issue #131 static_assert(match("x"sv, ctre::sequence>>, ctre::character<'x'>>())); static_assert(match("1x"sv, ctre::sequence>>, ctre::character<'x'>>())); static_assert(match("1x"sv, ctre::sequence>>, ctre::character<'x'>>())); static_assert(match("1x"sv, ctre::sequence > >, ctre::character<'x'>>())); static_assert(match("aaab"sv, ctre::sequence>>, ctre::character<'b'>>())); static_assert(match("1yx"sv, ctre::sequence >, ctre::character<'y'> >, ctre::character<'x'>>())); static_assert(match("aaa"sv, ctre::possessive_plus>>())); static_assert(match("x"sv, ctre::repeat<1,0,ctre::repeat<0,0,ctre::character<'x'>>>())); static_assert(match("x"sv, ctre::repeat<1,0,ctre::lazy_repeat<0,0,ctre::character<'x'>>>())); static_assert(match("x"sv, ctre::repeat<1,0,ctre::possessive_repeat<0,0,ctre::character<'x'>>>())); static_assert(match("x"sv, ctre::lazy_repeat<1,0,ctre::repeat<0,0,ctre::character<'x'>>>())); static_assert(match("x"sv, ctre::lazy_repeat<1,0,ctre::lazy_repeat<0,0,ctre::character<'x'>>>())); static_assert(match("x"sv, ctre::lazy_repeat<1,0,ctre::possessive_repeat<0,0,ctre::character<'x'>>>())); static_assert(match("x"sv, ctre::possessive_repeat<1,0,ctre::repeat<0,0,ctre::character<'x'>>>())); static_assert(match("x"sv, ctre::possessive_repeat<1,0,ctre::lazy_repeat<0,0,ctre::character<'x'>>>())); static_assert(match("x"sv, ctre::possessive_repeat<1,0,ctre::possessive_repeat<0,0,ctre::character<'x'>>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); static_assert(match("xy"sv, ctre::sequence>>, ctre::character<'y'>>())); // word boundary static_assert(starts_with("a "sv, ctre::sequence, ctre::boundary>())); static_assert(starts_with(u8"a "sv, ctre::sequence, ctre::boundary>())); static_assert(starts_with("aaaa "sv, ctre::sequence>, ctre::boundary, ctre::any>())); static_assert(starts_with(" aaaa"sv, ctre::sequence, ctre::boundary>())); static_assert(starts_with(u8"aaaa "sv, ctre::sequence>, ctre::boundary, ctre::any>())); static_assert(starts_with(u8" aaaa"sv, ctre::sequence, ctre::boundary>())); static_assert(match("a ", ctre::sequence, ctre::word_boundary, ctre::character<' '>>() )); static_assert(match("ab", ctre::sequence, ctre::not_word_boundary, ctre::character<'b'>>() )); // multiline static_assert(multiline_match("", ctre::assert_subject_begin())); static_assert(multiline_match("", ctre::assert_subject_end())); static_assert(multiline_match("", ctre::assert_line_begin())); static_assert(multiline_match("", ctre::assert_line_end())); static_assert(multiline_match("", ctre::assert_subject_end_line())); static_assert(!multiline_match("\n", ctre::any())); static_assert(multiline_starts_with("aaa\nbbb", ctre::plus())); static_assert(multiline_starts_with("aaa\nbbb", ctre::plus()).size() == 3); static_assert(multiline_starts_with("aaa\nbbb", ctre::sequence,ctre::assert_line_end,ctre::character<'\n'>>())); static_assert(multiline_starts_with("aaa\nbbb", ctre::sequence,ctre::assert_line_end,ctre::character<'\n'>>()).size() == 4);