scan-แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ, C++-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒ แƒแƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒฅแƒแƒœแƒ˜แƒก แƒ™แƒแƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ˜แƒ—.

แƒ’แƒแƒ›แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ“แƒ แƒกแƒ™แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ (0.1.0). แƒ˜แƒก แƒขแƒ”แƒฅแƒกแƒขแƒก แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒ แƒแƒ˜แƒก แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ— แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒแƒ“. แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜ แƒแƒœ แƒคแƒแƒ แƒ›แƒแƒขแƒ˜ แƒ˜แƒฌแƒ”แƒ แƒ”แƒ‘แƒ C++ แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜แƒก แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒแƒ“ แƒ“แƒ แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒขแƒ”แƒ’แƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒ“แƒ”แƒขแƒ”แƒ แƒ›แƒ˜แƒœแƒ˜แƒกแƒขแƒฃแƒš แƒกแƒแƒกแƒ แƒฃแƒšแƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒแƒ“ (TDFA), แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ’แƒแƒ•แƒšแƒแƒช C++ แƒจแƒแƒ‘แƒšแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒ— แƒ•แƒ˜แƒ—แƒแƒ แƒ“แƒ”แƒ‘แƒ แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒ แƒแƒ˜แƒก แƒ™แƒแƒ“แƒจแƒ˜. แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒšแƒ˜ แƒขแƒ˜แƒžแƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ. แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ™แƒแƒ“แƒ˜ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ C++23-แƒจแƒ˜ แƒ“แƒ แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ GPLv3 แƒšแƒ˜แƒชแƒ”แƒœแƒ–แƒ˜แƒ˜แƒ—. import scan; // แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒ—แƒฃ แƒแƒ แƒ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒจแƒ”แƒกแƒ•แƒšแƒ˜แƒก แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒ“แƒ˜แƒแƒžแƒแƒ–แƒแƒœแƒ˜แƒก แƒแƒ“แƒแƒžแƒขแƒ”แƒ แƒ˜แƒ. scan::match<ยซ[az]+@[az.]+ยป>(address); address | scan::match<ยซ[az]+@[az.]+ยป>; // แƒฏแƒ’แƒฃแƒคแƒ”แƒ‘แƒ˜แƒ—. const auto found = scan::match<ยซ([0-9]+)-([az]+)ยป>(ยซ42-abcยป); found.get<1>().to_view(); // "42" // แƒœแƒ˜แƒ›แƒฃแƒจแƒ˜แƒ— แƒ“แƒแƒ™แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ แƒ“แƒ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ‘แƒ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒแƒ“แƒ’แƒ˜แƒšแƒแƒก. scan::starts_with<ยซ[a-z]+ยป>(ยซabc123ยป).whole().to_view(); // "abc" scan::search<ยซ[0-9]+ยป>(ยซid=4210xยป).to_view(); // "4210" // แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ‘แƒ แƒ“แƒ แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ˜ แƒ–แƒแƒ แƒ›แƒแƒชแƒ˜ แƒฎแƒ”แƒ“แƒ”แƒ‘แƒ˜แƒ. for (const auto& one : text | scan::search_all<ยซ[a-z]+ยป>) { โ€ฆ } const auto fields = "a,bb,,ccc" | scan::split<ยซ,ยป> | std::ranges::to (); // แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜, แƒแƒ แƒ แƒขแƒ”แƒฅแƒกแƒขแƒ˜. struct row { int id; std::string_view name; }; const row one = scan::scan<ยซ{},{[a-z]+}ยป>(line); // แƒกแƒ˜แƒ, แƒขแƒ˜แƒžแƒ”แƒ‘แƒ˜แƒก แƒฏแƒแƒ›แƒ˜, แƒฉแƒแƒ“แƒ’แƒ›แƒฃแƒšแƒ˜ แƒคแƒแƒ แƒ›แƒ. struct all { std::vector แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜; std::แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ tail; }; const all got = scan::scan<ยซ{{}{*,?}} {{[0-9]+}|{[a-z]+}}ยป>(ยซ1,2,3 abcยป); // แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ แƒ“แƒ แƒ›แƒ˜แƒกแƒ’แƒแƒœ แƒ“แƒแƒ แƒฉแƒ”แƒœแƒ˜แƒšแƒ˜ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ. const auto [แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ, แƒ“แƒแƒกแƒ•แƒ”แƒœแƒ”แƒ‘แƒ] = scan::scan_prefix<ยซ{},{}ยป>(แƒฎแƒแƒ–แƒ˜).take (); // แƒ”แƒ แƒ—แƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“, แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ แƒแƒ›แƒ˜แƒ“แƒแƒœ. for (const row& one : scan::each<ยซ{},{[az]+}\\nยป>(text).of ()) { โ€ฆ }

แƒ“แƒ˜แƒแƒžแƒแƒ–แƒแƒœแƒ˜, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒช แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒฎแƒ”แƒš แƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜, แƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ”แƒ‘แƒ แƒ‘แƒฃแƒคแƒ”แƒ แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜ แƒ’แƒ แƒแƒ•แƒ“แƒ”แƒ‘แƒ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒ•แƒšแƒ˜แƒกแƒ—แƒแƒœแƒแƒ•แƒ”. แƒจแƒ”แƒกแƒแƒœแƒแƒฎแƒ˜ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ’แƒแƒœแƒ˜แƒกแƒแƒ–แƒฆแƒ•แƒ แƒ”แƒ‘แƒ แƒœแƒ˜แƒ›แƒฃแƒจแƒ˜แƒ— แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒ แƒแƒก; แƒ—แƒฃ แƒ”แƒก แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜ แƒ›แƒ˜แƒฃแƒฌแƒ•แƒ“แƒแƒ›แƒ”แƒšแƒ˜แƒ, แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ แƒฃแƒแƒ แƒงแƒแƒคแƒ˜แƒšแƒ˜แƒ แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒ แƒแƒก. std::istringstream source(ยซset speed 42\\nset gain 7\\nยป); source > std::noskipws; struct command { scan::held<16> name; int value; }; for (const command& one : scan::each<ยซset {[a-z]+} {[0-9]+}\\nยป>(std::views::istream (แƒฌแƒงแƒแƒ แƒ)) .-แƒ˜แƒก ()) { โ€ฆ } แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ.

แƒ’แƒแƒ–แƒแƒ›แƒ•แƒ”แƒ‘แƒ˜ แƒฉแƒแƒขแƒแƒ แƒ“แƒ Ryzen 9 9950X แƒžแƒ แƒแƒชแƒ”แƒกแƒแƒ แƒ–แƒ”, clang 22.1.8 libc++-แƒ˜แƒ—, -O3 -march=native,LTO. 32 แƒฉแƒแƒฌแƒ”แƒ แƒ แƒ—แƒ˜แƒ—แƒ แƒ’แƒแƒ•แƒšแƒแƒ–แƒ”, แƒจแƒ•แƒ˜แƒ“แƒ˜ แƒ’แƒแƒ•แƒšแƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ. "([az]+),([az]+),([az]+),([az]+),([az]+)" "alpha,bravo,charlie,delta,echo" scan::scan .sentinel() 477 ns re2c 554 ns scan::scan 659 ns CTRE 717 ns RE2 15986 ns แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒฎแƒฃแƒ—แƒ˜ แƒ•แƒ”แƒšแƒ˜, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒจแƒ˜ แƒแƒ แƒแƒกแƒ˜ แƒแƒกแƒ scan::scan .sentinel() 57.8 ns re2c 637 ns CTRE 692 ns RE2 11751 ns "first.last@subdomain.example.com" แƒแƒ›แƒแƒชแƒœแƒแƒ‘แƒ, แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒแƒ˜แƒซแƒ”แƒ‘แƒœแƒ scan::match .sentinel().scalar() 436 ns scan::match .scalar() 545 ns re2c 1186 ns RE2 2616 ns CTRE 14339 ns แƒฏแƒ’แƒฃแƒคแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒจแƒšแƒ แƒ›แƒแƒ—แƒ˜ แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒกแƒแƒก

แƒขแƒ˜แƒžแƒก แƒ”แƒฃแƒ‘แƒœแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒš แƒฏแƒ’แƒฃแƒคแƒก แƒ›แƒ˜แƒ”แƒ™แƒฃแƒ—แƒ•แƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ แƒ“แƒ แƒจแƒ”แƒคแƒแƒกแƒ”แƒ‘แƒ แƒแƒ“แƒ’แƒ˜แƒšแƒ–แƒ” แƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ”แƒ‘แƒ: แƒชแƒ˜แƒ™แƒšแƒ˜แƒก แƒ˜แƒขแƒ”แƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒแƒ  แƒ˜แƒœแƒแƒฎแƒ”แƒ‘แƒ, แƒฅแƒ•แƒ”แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ”แƒ‘แƒ˜ แƒแƒ  แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ. struct tally { unsigned long value = 0; }; struct reading { tally number; std::string_view tail; }; template <> struct scan::scanner { static constexpr std::string_view pattern() { return R"(\\(((_+)(X|Y)*)*\\))"; } struct state_type { unsigned long total = 0; unsigned place = 0, marks = 0; }; static constexpr state_type begin_groups() { return {}; } static constexpr void opened_group(state_type& one, scan::group_at<0>) { one.place = 0; one.marks = 0; } static constexpr void closed_group(state_type& one, scan::group_at<0>) { unsigned long weight = 1; for (unsigned step = 1; step < one.place; ++step) weight *= 10; one.total += weight * one.marks; } static constexpr void push_group(state_type& one, scan::group_at<1>, char) { ++one.place; } static constexpr void push_group(state_type& one, scan::group_at<2>, char แƒแƒกแƒ) { one.marks += แƒแƒกแƒ == 'Y' ? 2u: 1u; } static constexpr tally finish_groups(state_type one) { return {one.total}; } }; const reading got = scan::scan<โ€œแƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ={}{[az]*}โ€>(โ€œแƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ=(__X_XX)abcdefghโ€).of (); // got.number.value == 12, got.tail == "abcdefgh"

แƒ’แƒ แƒแƒ•แƒ˜แƒก แƒกแƒ™แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ ::แƒกแƒ™แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ .scalar() แƒฎแƒ”แƒšแƒ˜แƒ— แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒกแƒ™แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ::แƒกแƒ™แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ 10 141 ns 41.4 ns 42.5 ns 170 ns 100 439 ns 341 ns 392 ns 1176 ns 1000 3314 ns 3170 ns 3797 ns 11887 ns
แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒฅแƒขแƒแƒ แƒ”แƒ‘แƒ˜

แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ›แƒซแƒแƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜ - แƒแƒšแƒแƒ™แƒแƒขแƒแƒ แƒ˜, แƒแƒฃแƒ–แƒ˜, แƒแƒ แƒ”แƒœแƒ, แƒ แƒแƒช แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก - แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ“แƒแƒ”แƒชแƒ”แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒฅแƒ›แƒœแƒ”แƒš แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒแƒก. แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒขแƒ˜แƒžแƒ˜ แƒแƒ  แƒ˜แƒ™แƒแƒ แƒ’แƒ”แƒ‘แƒ: แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒ“แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒฐแƒฃแƒ™แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒแƒก แƒ›แƒแƒกแƒ–แƒ”, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒกแƒ™แƒแƒœแƒ”แƒ แƒจแƒ˜ แƒแƒ แƒชแƒ”แƒ แƒ—แƒ˜ แƒ’แƒแƒ›แƒแƒ›แƒซแƒแƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒขแƒ˜แƒžแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒœแƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ˜. struct arena { std::pmr::memory_resource* where = nullptr; std::pmr::memory_resource* resource() const { return where; } }; struct numbers { std::pmr::vector แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜; }; struct both { แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒ‘แƒ˜ แƒ›แƒแƒ แƒชแƒฎแƒœแƒ˜แƒ•; แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒ‘แƒ˜ แƒ›แƒแƒ แƒฏแƒ•แƒœแƒ˜แƒ•; }; template <> struct scan::scanner { แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ constexpr std::string_view pattern() { return "([0-9]+)(?:,([0-9]+))*"; } แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ { std::pmr::vector แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜; int running = 0; }; แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ begin_groups() { return {}; } แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก(const Told& แƒ”แƒ แƒ—แƒ˜) { one.resource(); } แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ begin_groups(const Told& told) { return {std::pmr::vector}}} (told.resource()), 0}; } แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ void push_group(state & แƒ”แƒ แƒ—แƒ˜, แƒกแƒ™แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ::group_at , char แƒชแƒ˜แƒคแƒ แƒ˜) { one.running = one.running * 10 + (แƒชแƒ˜แƒคแƒ แƒ˜ - '0'); } แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ void closed_group(state) & แƒ”แƒ แƒ—แƒ˜, แƒกแƒ™แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ::group_at ) { one.values.push_back(one.running); one.running = 0; } แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒ‘แƒ˜ finish_groups(state แƒ”แƒ แƒ—แƒ˜) { return {std::move(one.values)}; } }; std::pmr::monotonic_buffer_resource bytes; const arena mine{&bytes}; scan::scan<โ€œ{} {}โ€>(แƒขแƒ”แƒฅแƒกแƒขแƒ˜).of (แƒฉแƒ”แƒ›แƒ˜); // แƒ”แƒ แƒ—แƒ˜ แƒแƒ แƒ˜แƒ•แƒ” แƒแƒ“แƒ’แƒ˜แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก scan::scan<ยซ{} {}ยป>(แƒขแƒ”แƒฅแƒกแƒขแƒ˜).of (แƒฉแƒ”แƒ›แƒ˜, scan::default_context); // แƒ”แƒ แƒ—แƒ˜ แƒ—แƒ˜แƒ—แƒ แƒแƒ“แƒ’แƒ˜แƒšแƒ–แƒ” scan::scan<โ€œ{} {}โ€>(แƒขแƒ”แƒฅแƒกแƒขแƒ˜).of ({mine, scan::default_context}); // แƒคแƒ แƒฉแƒฎแƒ˜แƒšแƒ”แƒ‘แƒจแƒ˜ แƒ˜แƒ’แƒ˜แƒ•แƒ” const both got = scan::scan<ยซ{} {}ยป>(text).with(mine); // แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜ แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ›แƒ˜แƒกแƒ˜ แƒขแƒ˜แƒžแƒ˜: แƒแƒšแƒแƒ™แƒแƒขแƒแƒ แƒ˜ แƒแƒฆแƒฌแƒ”แƒ•แƒก // read.struct two { std::pmr::string name; std::pmr::string tail; }; const two keeped = scan::scan<ยซ{[az]+} {[az]+}ยป>(text).of<( std::pmr::polymorphic_allocator<>(&bytes));

แƒ™แƒแƒฃแƒญแƒ˜ แƒ—แƒแƒ•แƒแƒ“ แƒ˜แƒฆแƒ”แƒ‘แƒก แƒ’แƒแƒ›แƒแƒ›แƒซแƒแƒฎแƒ”แƒ‘แƒšแƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒก แƒ“แƒ แƒแƒ แƒ แƒแƒกแƒšแƒก, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ: แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒก แƒ–แƒแƒ แƒ˜แƒก แƒฎแƒแƒœแƒ’แƒ แƒซแƒšแƒ˜แƒ•แƒแƒ‘แƒแƒ›แƒ“แƒ” แƒ“แƒ แƒงแƒ•แƒ”แƒšแƒ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ แƒฎแƒ“แƒ”แƒ‘แƒ แƒแƒ› แƒ–แƒแƒ แƒ˜แƒก แƒคแƒแƒ แƒ’แƒšแƒ”แƒ‘แƒจแƒ˜. แƒกแƒฎแƒ•แƒ แƒ›แƒแƒฎแƒแƒกแƒ˜แƒแƒ—แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜

  • แƒแƒ แƒ˜ แƒคแƒ”แƒœแƒ: แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜แƒก แƒคแƒ”แƒœแƒ (match, starts_with, search, search_all, split) แƒ“แƒ แƒคแƒแƒ แƒ›แƒแƒขแƒ˜แƒก แƒคแƒ”แƒœแƒ, แƒกแƒแƒ“แƒแƒช "{}" แƒแƒ แƒ˜แƒก แƒ•แƒ”แƒšแƒ˜, แƒฎแƒแƒšแƒ แƒแƒ“แƒ’แƒ˜แƒšแƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒ’แƒแƒœแƒ˜แƒกแƒแƒ–แƒฆแƒ•แƒ แƒ”แƒ‘แƒ แƒ—แƒแƒ•แƒแƒ“ แƒขแƒ˜แƒžแƒ˜แƒก แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜แƒ—.
  • แƒ“แƒ”แƒ–แƒ˜แƒ›แƒ’แƒฃแƒแƒชแƒ˜แƒ˜แƒก แƒฌแƒ”แƒกแƒ˜ แƒ›แƒแƒ แƒชแƒฎแƒœแƒ˜แƒ•-แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“แƒแƒ, แƒ แƒแƒ’แƒแƒ แƒช Perl-แƒจแƒ˜, RE2-แƒกแƒ แƒ“แƒ CTRE-แƒจแƒ˜.
  • แƒงแƒ•แƒ”แƒšแƒ แƒ–แƒ”แƒ›แƒแƒ— แƒฉแƒแƒ›แƒแƒ—แƒ•แƒšแƒ˜แƒšแƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ• แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ”แƒ‘แƒจแƒ˜.
  • แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ’แƒแƒ“แƒแƒฎแƒ”แƒ“แƒ•แƒ˜แƒก แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ”แƒ‘แƒ˜, แƒฃแƒ™แƒฃ แƒ›แƒ˜แƒ›แƒแƒ แƒ—แƒ•แƒ”แƒ‘แƒ˜ แƒแƒœ แƒฃแƒœแƒ˜แƒ™แƒแƒ“แƒ˜แƒก แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜; แƒจแƒแƒ‘แƒšแƒแƒœแƒ”แƒ‘แƒ˜ แƒ‘แƒแƒ˜แƒขแƒ”แƒ‘แƒ–แƒ” แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ”แƒœ.
  • แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜ แƒœแƒ˜แƒ›แƒฃแƒจแƒ”แƒ‘แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒšแƒ˜.

แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ

แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒแƒชแƒ˜แƒ แƒฎแƒ“แƒ”แƒ‘แƒ clang-แƒ˜แƒกแƒ แƒ“แƒ GCC-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. C++ แƒ›แƒแƒ“แƒฃแƒšแƒ”แƒ‘แƒ˜ แƒแƒ แƒแƒกแƒแƒ•แƒแƒšแƒ“แƒ”แƒ‘แƒฃแƒšแƒแƒ: แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒ“แƒ”แƒ›แƒแƒ“แƒฃแƒšแƒ˜แƒ–แƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ˜แƒ›แƒแƒ•แƒ” แƒ›แƒแƒ“แƒฃแƒšแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜ (include/) - แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒ—แƒ’แƒแƒœแƒ˜ แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒก, แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒก แƒ“แƒ แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒก แƒ›แƒแƒ—. แƒ”แƒ แƒ—แƒแƒ“แƒ”แƒ แƒ—แƒ˜ แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ, Boost.PFR, แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช C++26 binding packs แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜แƒ. FetchContent_Declare(scan GIT_REPOSITORY https://github.com/j4niwzis/scan.git GIT_TAG v0.1.0) FetchContent_MakeAvailable(scan) target_link_libraries(mine PRIVATE scan::scan)

แƒฌแƒงแƒแƒ แƒ: opennet.ru

แƒจแƒ”แƒ˜แƒซแƒ˜แƒœแƒ”แƒ— แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒ˜ DDoS แƒ“แƒแƒชแƒ•แƒ˜แƒก แƒ›แƒฅแƒแƒœแƒ” แƒกแƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, VPS VDS แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก ๐Ÿ”ฅ แƒจแƒ”แƒ˜แƒซแƒ˜แƒœแƒ”แƒ— แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒ˜ DDoS แƒ“แƒแƒชแƒ•แƒ˜แƒ—, VPS VDS แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜ | ProHoster