GCC Code Coverage Report


Directory: ./
File: lib/geogram/basic/boolean_expression.h
Date: 2026-09-07 02:28:19
Exec Total Coverage
Lines: 6 7 85.7%
Functions: 1 1 100.0%
Branches: 44 78 56.4%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2000-2022 Inria
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * * Neither the name of the ALICE Project-Team nor the names of its
14 * contributors may be used to endorse or promote products derived from this
15 * software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Contact: Bruno Levy
30 *
31 * https://www.inria.fr/fr/bruno-levy
32 *
33 * Inria,
34 * Domaine de Voluceau,
35 * 78150 Le Chesnay - Rocquencourt
36 * FRANCE
37 *
38 */
39
40 #ifndef GEOGRAM_BASIC_BOOLEAN_EXPRESSION
41 #define GEOGRAM_BASIC_BOOLEAN_EXPRESSION
42
43 #include <geogram/basic/common.h>
44 #include <geogram/basic/numeric.h>
45 #include <string>
46
47 /**
48 * \file geogram/basic/boolean_expression.h
49 * \brief Class for parsing and evaluating boolean expressions
50 */
51
52 namespace GEO {
53
54 /**
55 * \brief A simple parser for boolean expressions.
56 */
57 118 class GEOGRAM_API BooleanExpression {
58 public:
59
60 /**
61 * \brief Constructs a boolean expression
62 * \param[in] expr the expression, with
63 * the following syntax:
64 * - Variables: A..Z or x0..x31
65 * - and: '&' or '*'
66 * - or: '|' or '+'
67 * - xor: '^'
68 * - difference: '-'
69 * - special: '*' for union
70 * - one can use '(' and ')' to group subexpression
71 */
72 BooleanExpression(const std::string& expr);
73
74 /**
75 * \brief Evaluates the boolean expression
76 * \param[in] x the different bits of x correspond to
77 * the variables A..Z or x0..x31.
78 */
79 bool operator()(index_t x) const;
80
81 protected:
82
83 /**
84 * \brief Stores the state of a current parsing operation
85 */
86 struct Context {
87 Context(
88 const std::string& E, index_t x
89
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 124246 times.
124246 ) : ptr_(E.begin()), end_(E.end()), x_(x) {
90 }
91 char cur_char() const {
92
41/70
✓ Branch 0 taken 270996 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 270996 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 270996 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 270996 times.
✓ Branch 8 taken 422706 times.
✓ Branch 9 taken 119286 times.
✓ Branch 10 taken 270996 times.
✓ Branch 11 taken 151710 times.
✓ Branch 12 taken 275956 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 275956 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 275956 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 275956 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 275956 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 275956 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 275956 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 275956 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✓ Branch 34 taken 275956 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 4960 times.
✓ Branch 37 taken 270996 times.
✓ Branch 38 taken 270996 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 270996 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 270996 times.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 270996 times.
✓ Branch 46 taken 151710 times.
✓ Branch 47 taken 124246 times.
✓ Branch 48 taken 151710 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 151710 times.
✓ Branch 51 taken 124246 times.
✓ Branch 52 taken 151710 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 151710 times.
✓ Branch 55 taken 124246 times.
✓ Branch 56 taken 151710 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 151710 times.
✓ Branch 59 taken 124246 times.
✓ Branch 60 taken 151710 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 151710 times.
✓ Branch 63 taken 124246 times.
✓ Branch 64 taken 151710 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 151710 times.
✓ Branch 67 taken 124246 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 151710 times.
2334558 return (ptr_ == end_) ? '\0' : *ptr_;
93 }
94
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 698662 times.
698662 void next_char() {
95
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 698662 times.
698662 if(ptr_ == end_) {
96 throw std::logic_error("Unexpected end of string");
97 }
98 ptr_++;
99 698662 }
100 std::string::const_iterator ptr_;
101 std::string::const_iterator end_;
102 index_t x_;
103 };
104
105 bool parse_or(Context& C) const;
106 bool parse_and(Context& C) const;
107 bool parse_factor(Context& C) const;
108 bool parse_variable(Context& C) const;
109
110 private:
111 std::string expr_;
112 };
113
114
115 }
116
117 #endif
118