File: parser_lazy_params.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (85 lines) | stat: -rw-r--r-- 2,117 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/**
 *   Copyright (C) 2018 T. Zachary Laine
 *
 *   Distributed under the Boost Software License, Version 1.0. (See
 *   accompanying file LICENSE_1_0.txt or copy at
 *   http://www.boost.org/LICENSE_1_0.txt)
 */

#include <boost/parser/parser.hpp>

#include <boost/core/lightweight_test.hpp>


using namespace boost::parser;


struct char_globals
{
    char c_ = 'd';
};
auto global_char = [](auto & context) { return _globals(context).c_; };

struct int_globals
{
    int i_ = 3;
};
auto global_int = [](auto & context) { return _globals(context).i_; };

auto always_3 = [](auto & context) { return 3; };
auto always_3u = [](auto & context) { return 3u; };


int main()
{
    {
        std::string str = "a";
        BOOST_TEST(parse(str, char_));
        BOOST_TEST(!parse(str, char_('b')));
        char_globals globals;
        auto parser = with_globals(char_(global_char), globals);
        BOOST_TEST(!parse(str, parser));
    }
    {
        std::string str = "d";
        BOOST_TEST(parse(str, char_));
        BOOST_TEST(parse(str, char_('d')));
        char_globals globals;
        auto result = parse(str, with_globals(char_(global_char), globals));
        BOOST_TEST(result);
        BOOST_TEST(*result == 'd');
    }

    {
        std::string str = "b";
        char c = '\0';
        char_globals globals;
        auto parser = with_globals(char_('a', global_char), globals);
        BOOST_TEST(parse(str, parser, c));
        BOOST_TEST(c == 'b');
        BOOST_TEST(!
            parse(str, with_globals(char_(global_char, global_char), globals)));
    }

    {
        std::string str = "abc";
        int_globals globals;
        auto parser = with_globals(repeat(2, global_int)[char_], globals);
        std::string out_str;
        BOOST_TEST(parse(str, parser, out_str));
        BOOST_TEST(out_str == "abc");
        BOOST_TEST(!parse("a", parser, out_str));
    }

    {
        std::string str = "3";
        BOOST_TEST(parse(str, int_(always_3)));
    }

    {
        std::string str = "3";
        BOOST_TEST(parse(str, uint_(always_3u)));
    }

    return boost::report_errors();
}