Coverage Report

Created: 2026-10-09 06:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/proc/self/cwd/common/expr_factory.h
Line
Count
Source
1
// Copyright 2024 Google LLC
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     https://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#ifndef THIRD_PARTY_CEL_CPP_COMMON_EXPR_FACTORY_H_
16
#define THIRD_PARTY_CEL_CPP_COMMON_EXPR_FACTORY_H_
17
18
#include <cstddef>
19
#include <cstdint>
20
#include <memory>
21
#include <string>
22
#include <type_traits>
23
#include <utility>
24
#include <vector>
25
26
#include "absl/strings/string_view.h"
27
#include "absl/types/span.h"
28
#include "common/constant.h"
29
#include "common/expr.h"
30
31
namespace cel {
32
33
class MacroExprFactory;
34
class ParserMacroExprFactory;
35
class OptimizerExprFactory;
36
37
namespace tools {
38
class ProtoToPredicateBuilder;
39
}
40
41
namespace parser_internal {
42
template <typename ExprNode>
43
class AstFactoryInterface;
44
}
45
46
class ExprFactory {
47
 protected:
48
  // `IsExprLike` determines whether `T` is some `Expr`. Currently that means
49
  // either `Expr` or `std::unique_ptr<Expr>`. This allows us to make the
50
  // factory functions generic and avoid redefining them for every argument
51
  // combination.
52
  template <typename T>
53
  struct IsExprLike
54
      : std::bool_constant<std::disjunction_v<
55
            std::is_same<T, Expr>, std::is_same<T, std::unique_ptr<Expr>>>> {};
56
57
  // `IsStringLike` determines whether `T` is something that looks like a
58
  // string. Currently that means `const char*`, `std::string`, or
59
  // `absl::string_view`. This allows us to make the factory functions generic
60
  // and avoid redefining them for every argument combination. This is necessary
61
  // to avoid copies if possible.
62
  template <typename T>
63
  struct IsStringLike
64
      : std::bool_constant<std::disjunction_v<
65
            std::is_same<T, char*>, std::is_same<T, const char*>,
66
            std::is_same<T, std::string>, std::is_same<T, absl::string_view>>> {
67
  };
68
69
  template <size_t N>
70
  struct IsStringLike<const char[N]> : std::true_type {};
71
72
  // `IsArrayLike` determines whether `T` is something that looks like an array
73
  // or span of some element.
74
  template <typename Element, typename Array>
75
  struct IsArrayLike : std::false_type {};
76
77
  template <typename Element>
78
  struct IsArrayLike<Element, absl::Span<Element>> : std::true_type {};
79
80
  template <typename Element>
81
  struct IsArrayLike<Element, std::vector<Element>> : std::true_type {};
82
83
 public:
84
  ExprFactory(const ExprFactory&) = delete;
85
  ExprFactory(ExprFactory&&) = delete;
86
  ExprFactory& operator=(const ExprFactory&) = delete;
87
  ExprFactory& operator=(ExprFactory&&) = delete;
88
89
33.3k
  virtual ~ExprFactory() = default;
90
91
2.13M
  Expr NewUnspecified(ExprId id) {
92
2.13M
    Expr expr;
93
2.13M
    expr.set_id(id);
94
2.13M
    return expr;
95
2.13M
  }
96
97
1.33M
  Expr NewConst(ExprId id, Constant value) {
98
1.33M
    Expr expr;
99
1.33M
    expr.set_id(id);
100
1.33M
    expr.mutable_const_expr() = std::move(value);
101
1.33M
    return expr;
102
1.33M
  }
103
104
2.11k
  Expr NewNullConst(ExprId id) {
105
2.11k
    Constant constant;
106
2.11k
    constant.set_null_value();
107
2.11k
    return NewConst(id, std::move(constant));
108
2.11k
  }
109
110
93.5k
  Expr NewBoolConst(ExprId id, bool value) {
111
93.5k
    Constant constant;
112
93.5k
    constant.set_bool_value(value);
113
93.5k
    return NewConst(id, std::move(constant));
114
93.5k
  }
115
116
926k
  Expr NewIntConst(ExprId id, int64_t value) {
117
926k
    Constant constant;
118
926k
    constant.set_int_value(value);
119
926k
    return NewConst(id, std::move(constant));
120
926k
  }
121
122
14.2k
  Expr NewUintConst(ExprId id, uint64_t value) {
123
14.2k
    Constant constant;
124
14.2k
    constant.set_uint_value(value);
125
14.2k
    return NewConst(id, std::move(constant));
126
14.2k
  }
127
128
54.6k
  Expr NewDoubleConst(ExprId id, double value) {
129
54.6k
    Constant constant;
130
54.6k
    constant.set_double_value(value);
131
54.6k
    return NewConst(id, std::move(constant));
132
54.6k
  }
133
134
0
  Expr NewBytesConst(ExprId id, BytesConstant value) {
135
0
    Constant constant;
136
0
    constant.set_bytes_value(std::move(value));
137
0
    return NewConst(id, std::move(constant));
138
0
  }
139
140
8.95k
  Expr NewBytesConst(ExprId id, std::string value) {
141
8.95k
    Constant constant;
142
8.95k
    constant.set_bytes_value(std::move(value));
143
8.95k
    return NewConst(id, std::move(constant));
144
8.95k
  }
145
146
0
  Expr NewBytesConst(ExprId id, absl::string_view value) {
147
0
    Constant constant;
148
0
    constant.set_bytes_value(value);
149
0
    return NewConst(id, std::move(constant));
150
0
  }
151
152
0
  Expr NewBytesConst(ExprId id, const char* value) {
153
0
    Constant constant;
154
0
    constant.set_bytes_value(value);
155
0
    return NewConst(id, std::move(constant));
156
0
  }
157
158
0
  Expr NewStringConst(ExprId id, StringConstant value) {
159
0
    Constant constant;
160
0
    constant.set_string_value(std::move(value));
161
0
    return NewConst(id, std::move(constant));
162
0
  }
163
164
221k
  Expr NewStringConst(ExprId id, std::string value) {
165
221k
    Constant constant;
166
221k
    constant.set_string_value(std::move(value));
167
221k
    return NewConst(id, std::move(constant));
168
221k
  }
169
170
0
  Expr NewStringConst(ExprId id, absl::string_view value) {
171
0
    Constant constant;
172
0
    constant.set_string_value(value);
173
0
    return NewConst(id, std::move(constant));
174
0
  }
175
176
8.61k
  Expr NewStringConst(ExprId id, const char* value) {
177
8.61k
    Constant constant;
178
8.61k
    constant.set_string_value(value);
179
8.61k
    return NewConst(id, std::move(constant));
180
8.61k
  }
181
182
  template <typename Name,
183
            typename = std::enable_if_t<IsStringLike<Name>::value>>
184
2.69M
  Expr NewIdent(ExprId id, Name name) {
185
2.69M
    Expr expr;
186
2.69M
    expr.set_id(id);
187
2.69M
    auto& ident_expr = expr.mutable_ident_expr();
188
2.69M
    ident_expr.set_name(std::move(name));
189
2.69M
    return expr;
190
2.69M
  }
cel::Expr cel::ExprFactory::NewIdent<std::__1::basic_string_view<char, std::__1::char_traits<char> >, void>(long, std::__1::basic_string_view<char, std::__1::char_traits<char> >)
Line
Count
Source
184
125k
  Expr NewIdent(ExprId id, Name name) {
185
125k
    Expr expr;
186
125k
    expr.set_id(id);
187
125k
    auto& ident_expr = expr.mutable_ident_expr();
188
125k
    ident_expr.set_name(std::move(name));
189
125k
    return expr;
190
125k
  }
cel::Expr cel::ExprFactory::NewIdent<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void>(long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)
Line
Count
Source
184
2.56M
  Expr NewIdent(ExprId id, Name name) {
185
2.56M
    Expr expr;
186
2.56M
    expr.set_id(id);
187
2.56M
    auto& ident_expr = expr.mutable_ident_expr();
188
2.56M
    ident_expr.set_name(std::move(name));
189
2.56M
    return expr;
190
2.56M
  }
191
192
172k
  absl::string_view AccuVarName() { return accu_var_; }
193
194
125k
  Expr NewAccuIdent(ExprId id) { return NewIdent(id, AccuVarName()); }
195
196
  template <typename Operand, typename Field,
197
            typename = std::enable_if_t<IsExprLike<Operand>::value>,
198
            typename = std::enable_if_t<IsStringLike<Field>::value>>
199
38.6k
  Expr NewSelect(ExprId id, Operand operand, Field field) {
200
38.6k
    Expr expr;
201
38.6k
    expr.set_id(id);
202
38.6k
    auto& select_expr = expr.mutable_select_expr();
203
38.6k
    select_expr.set_operand(std::move(operand));
204
38.6k
    select_expr.set_field(std::move(field));
205
38.6k
    select_expr.set_test_only(false);
206
38.6k
    return expr;
207
38.6k
  }
208
209
  template <typename Operand, typename Field,
210
            typename = std::enable_if_t<IsExprLike<Operand>::value>,
211
            typename = std::enable_if_t<IsStringLike<Field>::value>>
212
2.03k
  Expr NewPresenceTest(ExprId id, Operand operand, Field field) {
213
2.03k
    Expr expr;
214
2.03k
    expr.set_id(id);
215
2.03k
    auto& select_expr = expr.mutable_select_expr();
216
2.03k
    select_expr.set_operand(std::move(operand));
217
2.03k
    select_expr.set_field(std::move(field));
218
2.03k
    select_expr.set_test_only(true);
219
2.03k
    return expr;
220
2.03k
  }
Unexecuted instantiation: cel::Expr cel::ExprFactory::NewPresenceTest<cel::Expr, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void, void>(long, cel::Expr, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)
cel::Expr cel::ExprFactory::NewPresenceTest<std::__1::unique_ptr<cel::Expr, std::__1::default_delete<cel::Expr> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void, void>(long, std::__1::unique_ptr<cel::Expr, std::__1::default_delete<cel::Expr> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)
Line
Count
Source
212
2.03k
  Expr NewPresenceTest(ExprId id, Operand operand, Field field) {
213
2.03k
    Expr expr;
214
2.03k
    expr.set_id(id);
215
2.03k
    auto& select_expr = expr.mutable_select_expr();
216
2.03k
    select_expr.set_operand(std::move(operand));
217
2.03k
    select_expr.set_field(std::move(field));
218
2.03k
    select_expr.set_test_only(true);
219
2.03k
    return expr;
220
2.03k
  }
221
222
  template <typename Function, typename Args,
223
            typename = std::enable_if_t<IsStringLike<Function>::value>,
224
            typename = std::enable_if_t<IsArrayLike<Expr, Args>::value>>
225
2.95M
  Expr NewCall(ExprId id, Function function, Args args) {
226
2.95M
    Expr expr;
227
2.95M
    expr.set_id(id);
228
2.95M
    auto& call_expr = expr.mutable_call_expr();
229
2.95M
    call_expr.set_function(std::move(function));
230
2.95M
    call_expr.set_args(std::move(args));
231
2.95M
    return expr;
232
2.95M
  }
cel::Expr cel::ExprFactory::NewCall<char const*, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >, void, void>(long, char const*, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >)
Line
Count
Source
225
87.8k
  Expr NewCall(ExprId id, Function function, Args args) {
226
87.8k
    Expr expr;
227
87.8k
    expr.set_id(id);
228
87.8k
    auto& call_expr = expr.mutable_call_expr();
229
87.8k
    call_expr.set_function(std::move(function));
230
87.8k
    call_expr.set_args(std::move(args));
231
87.8k
    return expr;
232
87.8k
  }
cel::Expr cel::ExprFactory::NewCall<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >, void, void>(long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >)
Line
Count
Source
225
274k
  Expr NewCall(ExprId id, Function function, Args args) {
226
274k
    Expr expr;
227
274k
    expr.set_id(id);
228
274k
    auto& call_expr = expr.mutable_call_expr();
229
274k
    call_expr.set_function(std::move(function));
230
274k
    call_expr.set_args(std::move(args));
231
274k
    return expr;
232
274k
  }
cel::Expr cel::ExprFactory::NewCall<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >, void, void>(long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >)
Line
Count
Source
225
2.58M
  Expr NewCall(ExprId id, Function function, Args args) {
226
2.58M
    Expr expr;
227
2.58M
    expr.set_id(id);
228
2.58M
    auto& call_expr = expr.mutable_call_expr();
229
2.58M
    call_expr.set_function(std::move(function));
230
2.58M
    call_expr.set_args(std::move(args));
231
2.58M
    return expr;
232
2.58M
  }
233
234
  template <typename Function, typename Target, typename Args,
235
            typename = std::enable_if_t<IsStringLike<Function>::value>,
236
            typename = std::enable_if_t<IsExprLike<Target>::value>,
237
            typename = std::enable_if_t<IsArrayLike<Expr, Args>::value>>
238
13.1k
  Expr NewMemberCall(ExprId id, Function function, Target target, Args args) {
239
13.1k
    Expr expr;
240
13.1k
    expr.set_id(id);
241
13.1k
    auto& call_expr = expr.mutable_call_expr();
242
13.1k
    call_expr.set_function(std::move(function));
243
13.1k
    call_expr.set_target(std::move(target));
244
13.1k
    call_expr.set_args(std::move(args));
245
13.1k
    return expr;
246
13.1k
  }
Unexecuted instantiation: cel::Expr cel::ExprFactory::NewMemberCall<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >, void, void, void>(long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >)
cel::Expr cel::ExprFactory::NewMemberCall<std::__1::basic_string_view<char, std::__1::char_traits<char> >, cel::Expr, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >, void, void, void>(long, std::__1::basic_string_view<char, std::__1::char_traits<char> >, cel::Expr, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >)
Line
Count
Source
238
13.1k
  Expr NewMemberCall(ExprId id, Function function, Target target, Args args) {
239
13.1k
    Expr expr;
240
13.1k
    expr.set_id(id);
241
13.1k
    auto& call_expr = expr.mutable_call_expr();
242
13.1k
    call_expr.set_function(std::move(function));
243
13.1k
    call_expr.set_target(std::move(target));
244
13.1k
    call_expr.set_args(std::move(args));
245
13.1k
    return expr;
246
13.1k
  }
Unexecuted instantiation: cel::Expr cel::ExprFactory::NewMemberCall<char const*, cel::Expr, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >, void, void, void>(long, char const*, cel::Expr, std::__1::vector<cel::Expr, std::__1::allocator<cel::Expr> >)
247
248
  template <typename Expr, typename = std::enable_if_t<IsExprLike<Expr>::value>>
249
595k
  ListExprElement NewListElement(Expr expr, bool optional = false) {
250
595k
    ListExprElement element;
251
595k
    element.set_expr(std::move(expr));
252
595k
    element.set_optional(optional);
253
595k
    return element;
254
595k
  }
255
256
  template <typename Elements,
257
            typename =
258
                std::enable_if_t<IsArrayLike<ListExprElement, Elements>::value>>
259
112k
  Expr NewList(ExprId id, Elements elements) {
260
112k
    Expr expr;
261
112k
    expr.set_id(id);
262
112k
    auto& list_expr = expr.mutable_list_expr();
263
112k
    list_expr.set_elements(std::move(elements));
264
112k
    return expr;
265
112k
  }
266
267
  template <typename Name, typename Value,
268
            typename = std::enable_if_t<IsStringLike<Name>::value>,
269
            typename = std::enable_if_t<IsExprLike<Value>::value>>
270
  StructExprField NewStructField(ExprId id, Name name, Value value,
271
19.8k
                                 bool optional = false) {
272
19.8k
    StructExprField field;
273
19.8k
    field.set_id(id);
274
19.8k
    field.set_name(std::move(name));
275
19.8k
    field.set_value(std::move(value));
276
19.8k
    field.set_optional(optional);
277
19.8k
    return field;
278
19.8k
  }
279
280
  template <
281
      typename Name, typename Fields,
282
      typename = std::enable_if_t<IsStringLike<Name>::value>,
283
      typename = std::enable_if_t<IsArrayLike<StructExprField, Fields>::value>>
284
11.5k
  Expr NewStruct(ExprId id, Name name, Fields fields) {
285
11.5k
    Expr expr;
286
11.5k
    expr.set_id(id);
287
11.5k
    auto& struct_expr = expr.mutable_struct_expr();
288
11.5k
    struct_expr.set_name(std::move(name));
289
11.5k
    struct_expr.set_fields(std::move(fields));
290
11.5k
    return expr;
291
11.5k
  }
292
293
  template <typename Key, typename Value,
294
            typename = std::enable_if_t<IsExprLike<Key>::value>,
295
            typename = std::enable_if_t<IsExprLike<Value>::value>>
296
  MapExprEntry NewMapEntry(ExprId id, Key key, Value value,
297
212k
                           bool optional = false) {
298
212k
    MapExprEntry entry;
299
212k
    entry.set_id(id);
300
212k
    entry.set_key(std::move(key));
301
212k
    entry.set_value(std::move(value));
302
212k
    entry.set_optional(optional);
303
212k
    return entry;
304
212k
  }
305
306
  template <typename Entries, typename = std::enable_if_t<
307
                                  IsArrayLike<MapExprEntry, Entries>::value>>
308
11.5k
  Expr NewMap(ExprId id, Entries entries) {
309
11.5k
    Expr expr;
310
11.5k
    expr.set_id(id);
311
11.5k
    auto& map_expr = expr.mutable_map_expr();
312
11.5k
    map_expr.set_entries(std::move(entries));
313
11.5k
    return expr;
314
11.5k
  }
315
316
  template <typename IterVar, typename IterRange, typename AccuVar,
317
            typename AccuInit, typename LoopCondition, typename LoopStep,
318
            typename Result,
319
            typename = std::enable_if_t<IsStringLike<IterVar>::value>,
320
            typename = std::enable_if_t<IsExprLike<IterRange>::value>,
321
            typename = std::enable_if_t<IsStringLike<AccuVar>::value>,
322
            typename = std::enable_if_t<IsExprLike<AccuInit>::value>,
323
            typename = std::enable_if_t<IsExprLike<LoopStep>::value>,
324
            typename = std::enable_if_t<IsExprLike<LoopCondition>::value>,
325
            typename = std::enable_if_t<IsExprLike<Result>::value>>
326
  Expr NewComprehension(ExprId id, IterVar iter_var, IterRange iter_range,
327
                        AccuVar accu_var, AccuInit accu_init,
328
                        LoopCondition loop_condition, LoopStep loop_step,
329
47.3k
                        Result result) {
330
47.3k
    return NewComprehension(id, std::move(iter_var), "", std::move(iter_range),
331
47.3k
                            std::move(accu_var), std::move(accu_init),
332
47.3k
                            std::move(loop_condition), std::move(loop_step),
333
47.3k
                            std::move(result));
334
47.3k
  }
Unexecuted instantiation: cel::Expr cel::ExprFactory::NewComprehension<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr, void, void, void, void, void, void, void>(long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr)
cel::Expr cel::ExprFactory::NewComprehension<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, std::__1::basic_string_view<char, std::__1::char_traits<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr, void, void, void, void, void, void, void>(long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, std::__1::basic_string_view<char, std::__1::char_traits<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr)
Line
Count
Source
329
47.3k
                        Result result) {
330
47.3k
    return NewComprehension(id, std::move(iter_var), "", std::move(iter_range),
331
47.3k
                            std::move(accu_var), std::move(accu_init),
332
47.3k
                            std::move(loop_condition), std::move(loop_step),
333
47.3k
                            std::move(result));
334
47.3k
  }
Unexecuted instantiation: cel::Expr cel::ExprFactory::NewComprehension<char const*, cel::Expr, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr, void, void, void, void, void, void, void>(long, char const*, cel::Expr, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr)
Unexecuted instantiation: cel::Expr cel::ExprFactory::NewComprehension<char const*, cel::Expr, std::__1::basic_string_view<char, std::__1::char_traits<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr, void, void, void, void, void, void, void>(long, char const*, cel::Expr, std::__1::basic_string_view<char, std::__1::char_traits<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr)
335
336
  template <typename IterVar, typename IterVar2, typename IterRange,
337
            typename AccuVar, typename AccuInit, typename LoopCondition,
338
            typename LoopStep, typename Result,
339
            typename = std::enable_if_t<IsStringLike<IterVar>::value>,
340
            typename = std::enable_if_t<IsStringLike<IterVar2>::value>,
341
            typename = std::enable_if_t<IsExprLike<IterRange>::value>,
342
            typename = std::enable_if_t<IsStringLike<AccuVar>::value>,
343
            typename = std::enable_if_t<IsExprLike<AccuInit>::value>,
344
            typename = std::enable_if_t<IsExprLike<LoopStep>::value>,
345
            typename = std::enable_if_t<IsExprLike<LoopCondition>::value>,
346
            typename = std::enable_if_t<IsExprLike<Result>::value>>
347
  Expr NewComprehension(ExprId id, IterVar iter_var, IterVar2 iter_var2,
348
                        IterRange iter_range, AccuVar accu_var,
349
                        AccuInit accu_init, LoopCondition loop_condition,
350
47.3k
                        LoopStep loop_step, Result result) {
351
47.3k
    Expr expr;
352
47.3k
    expr.set_id(id);
353
47.3k
    auto& comprehension_expr = expr.mutable_comprehension_expr();
354
47.3k
    comprehension_expr.set_iter_var(std::move(iter_var));
355
47.3k
    comprehension_expr.set_iter_var2(std::move(iter_var2));
356
47.3k
    comprehension_expr.set_iter_range(std::move(iter_range));
357
47.3k
    comprehension_expr.set_accu_var(std::move(accu_var));
358
47.3k
    comprehension_expr.set_accu_init(std::move(accu_init));
359
47.3k
    comprehension_expr.set_loop_condition(std::move(loop_condition));
360
47.3k
    comprehension_expr.set_loop_step(std::move(loop_step));
361
47.3k
    comprehension_expr.set_result(std::move(result));
362
47.3k
    return expr;
363
47.3k
  }
Unexecuted instantiation: cel::Expr cel::ExprFactory::NewComprehension<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*, cel::Expr, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr, void, void, void, void, void, void, void, void>(long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*, cel::Expr, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr)
cel::Expr cel::ExprFactory::NewComprehension<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*, cel::Expr, std::__1::basic_string_view<char, std::__1::char_traits<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr, void, void, void, void, void, void, void, void>(long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*, cel::Expr, std::__1::basic_string_view<char, std::__1::char_traits<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr)
Line
Count
Source
350
47.3k
                        LoopStep loop_step, Result result) {
351
47.3k
    Expr expr;
352
47.3k
    expr.set_id(id);
353
47.3k
    auto& comprehension_expr = expr.mutable_comprehension_expr();
354
47.3k
    comprehension_expr.set_iter_var(std::move(iter_var));
355
47.3k
    comprehension_expr.set_iter_var2(std::move(iter_var2));
356
47.3k
    comprehension_expr.set_iter_range(std::move(iter_range));
357
47.3k
    comprehension_expr.set_accu_var(std::move(accu_var));
358
47.3k
    comprehension_expr.set_accu_init(std::move(accu_init));
359
47.3k
    comprehension_expr.set_loop_condition(std::move(loop_condition));
360
47.3k
    comprehension_expr.set_loop_step(std::move(loop_step));
361
47.3k
    comprehension_expr.set_result(std::move(result));
362
47.3k
    return expr;
363
47.3k
  }
Unexecuted instantiation: cel::Expr cel::ExprFactory::NewComprehension<char const*, char const*, cel::Expr, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr, void, void, void, void, void, void, void, void>(long, char const*, char const*, cel::Expr, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr)
Unexecuted instantiation: cel::Expr cel::ExprFactory::NewComprehension<char const*, char const*, cel::Expr, std::__1::basic_string_view<char, std::__1::char_traits<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr, void, void, void, void, void, void, void, void>(long, char const*, char const*, cel::Expr, std::__1::basic_string_view<char, std::__1::char_traits<char> >, cel::Expr, cel::Expr, cel::Expr, cel::Expr)
364
365
  template <typename NextIdFunc, typename BindVar, typename BindExpr,
366
            typename RestExpr,
367
            typename = std::enable_if_t<
368
                std::is_invocable_r<ExprId, NextIdFunc>::value>,
369
            typename = std::enable_if_t<IsStringLike<BindVar>::value>,
370
            typename = std::enable_if_t<IsExprLike<BindExpr>::value>,
371
            typename = std::enable_if_t<IsExprLike<RestExpr>::value>>
372
  Expr NewBind(NextIdFunc next_id, BindVar bind_var, BindExpr bind_expr,
373
               RestExpr rest_expr) {
374
    Expr expr;
375
    expr.set_id(next_id());
376
    auto& comprehension_expr = expr.mutable_comprehension_expr();
377
    comprehension_expr.set_iter_var("#unused");
378
    comprehension_expr.set_iter_range(
379
        NewList(next_id(), std::vector<cel::ListExprElement>{}));
380
    comprehension_expr.set_accu_var(bind_var);
381
    comprehension_expr.set_accu_init(std::move(bind_expr));
382
    comprehension_expr.set_loop_condition(NewBoolConst(next_id(), false));
383
    comprehension_expr.set_loop_step(NewIdent(next_id(), bind_var));
384
    comprehension_expr.set_result(std::move(rest_expr));
385
    return expr;
386
  }
387
388
 private:
389
  friend class MacroExprFactory;
390
  friend class ParserMacroExprFactory;
391
  friend class OptimizerExprFactory;
392
  friend class tools::ProtoToPredicateBuilder;
393
  friend class parser_internal::AstFactoryInterface<Expr>;
394
395
33.3k
  ExprFactory() : accu_var_(kAccumulatorVariableName) {}
396
397
  std::string accu_var_;
398
};
399
400
}  // namespace cel
401
402
#endif  // THIRD_PARTY_CEL_CPP_COMMON_EXPR_FACTORY_H_