Coverage Report

Created: 2026-09-03 06:30

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
28.8k
  virtual ~ExprFactory() = default;
90
91
1.65M
  Expr NewUnspecified(ExprId id) {
92
1.65M
    Expr expr;
93
1.65M
    expr.set_id(id);
94
1.65M
    return expr;
95
1.65M
  }
96
97
999k
  Expr NewConst(ExprId id, Constant value) {
98
999k
    Expr expr;
99
999k
    expr.set_id(id);
100
999k
    expr.mutable_const_expr() = std::move(value);
101
999k
    return expr;
102
999k
  }
103
104
2.02k
  Expr NewNullConst(ExprId id) {
105
2.02k
    Constant constant;
106
2.02k
    constant.set_null_value();
107
2.02k
    return NewConst(id, std::move(constant));
108
2.02k
  }
109
110
41.0k
  Expr NewBoolConst(ExprId id, bool value) {
111
41.0k
    Constant constant;
112
41.0k
    constant.set_bool_value(value);
113
41.0k
    return NewConst(id, std::move(constant));
114
41.0k
  }
115
116
698k
  Expr NewIntConst(ExprId id, int64_t value) {
117
698k
    Constant constant;
118
698k
    constant.set_int_value(value);
119
698k
    return NewConst(id, std::move(constant));
120
698k
  }
121
122
12.2k
  Expr NewUintConst(ExprId id, uint64_t value) {
123
12.2k
    Constant constant;
124
12.2k
    constant.set_uint_value(value);
125
12.2k
    return NewConst(id, std::move(constant));
126
12.2k
  }
127
128
55.3k
  Expr NewDoubleConst(ExprId id, double value) {
129
55.3k
    Constant constant;
130
55.3k
    constant.set_double_value(value);
131
55.3k
    return NewConst(id, std::move(constant));
132
55.3k
  }
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
6.40k
  Expr NewBytesConst(ExprId id, std::string value) {
141
6.40k
    Constant constant;
142
6.40k
    constant.set_bytes_value(std::move(value));
143
6.40k
    return NewConst(id, std::move(constant));
144
6.40k
  }
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
177k
  Expr NewStringConst(ExprId id, std::string value) {
165
177k
    Constant constant;
166
177k
    constant.set_string_value(std::move(value));
167
177k
    return NewConst(id, std::move(constant));
168
177k
  }
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
5.94k
  Expr NewStringConst(ExprId id, const char* value) {
177
5.94k
    Constant constant;
178
5.94k
    constant.set_string_value(value);
179
5.94k
    return NewConst(id, std::move(constant));
180
5.94k
  }
181
182
  template <typename Name,
183
            typename = std::enable_if_t<IsStringLike<Name>::value>>
184
1.78M
  Expr NewIdent(ExprId id, Name name) {
185
1.78M
    Expr expr;
186
1.78M
    expr.set_id(id);
187
1.78M
    auto& ident_expr = expr.mutable_ident_expr();
188
1.78M
    ident_expr.set_name(std::move(name));
189
1.78M
    return expr;
190
1.78M
  }
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
97.6k
  Expr NewIdent(ExprId id, Name name) {
185
97.6k
    Expr expr;
186
97.6k
    expr.set_id(id);
187
97.6k
    auto& ident_expr = expr.mutable_ident_expr();
188
97.6k
    ident_expr.set_name(std::move(name));
189
97.6k
    return expr;
190
97.6k
  }
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
1.68M
  Expr NewIdent(ExprId id, Name name) {
185
1.68M
    Expr expr;
186
1.68M
    expr.set_id(id);
187
1.68M
    auto& ident_expr = expr.mutable_ident_expr();
188
1.68M
    ident_expr.set_name(std::move(name));
189
1.68M
    return expr;
190
1.68M
  }
191
192
135k
  absl::string_view AccuVarName() { return accu_var_; }
193
194
97.6k
  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
41.6k
  Expr NewSelect(ExprId id, Operand operand, Field field) {
200
41.6k
    Expr expr;
201
41.6k
    expr.set_id(id);
202
41.6k
    auto& select_expr = expr.mutable_select_expr();
203
41.6k
    select_expr.set_operand(std::move(operand));
204
41.6k
    select_expr.set_field(std::move(field));
205
41.6k
    select_expr.set_test_only(false);
206
41.6k
    return expr;
207
41.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
3.22k
  Expr NewPresenceTest(ExprId id, Operand operand, Field field) {
213
3.22k
    Expr expr;
214
3.22k
    expr.set_id(id);
215
3.22k
    auto& select_expr = expr.mutable_select_expr();
216
3.22k
    select_expr.set_operand(std::move(operand));
217
3.22k
    select_expr.set_field(std::move(field));
218
3.22k
    select_expr.set_test_only(true);
219
3.22k
    return expr;
220
3.22k
  }
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
3.22k
  Expr NewPresenceTest(ExprId id, Operand operand, Field field) {
213
3.22k
    Expr expr;
214
3.22k
    expr.set_id(id);
215
3.22k
    auto& select_expr = expr.mutable_select_expr();
216
3.22k
    select_expr.set_operand(std::move(operand));
217
3.22k
    select_expr.set_field(std::move(field));
218
3.22k
    select_expr.set_test_only(true);
219
3.22k
    return expr;
220
3.22k
  }
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.05M
  Expr NewCall(ExprId id, Function function, Args args) {
226
2.05M
    Expr expr;
227
2.05M
    expr.set_id(id);
228
2.05M
    auto& call_expr = expr.mutable_call_expr();
229
2.05M
    call_expr.set_function(std::move(function));
230
2.05M
    call_expr.set_args(std::move(args));
231
2.05M
    return expr;
232
2.05M
  }
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
71.2k
  Expr NewCall(ExprId id, Function function, Args args) {
226
71.2k
    Expr expr;
227
71.2k
    expr.set_id(id);
228
71.2k
    auto& call_expr = expr.mutable_call_expr();
229
71.2k
    call_expr.set_function(std::move(function));
230
71.2k
    call_expr.set_args(std::move(args));
231
71.2k
    return expr;
232
71.2k
  }
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
154k
  Expr NewCall(ExprId id, Function function, Args args) {
226
154k
    Expr expr;
227
154k
    expr.set_id(id);
228
154k
    auto& call_expr = expr.mutable_call_expr();
229
154k
    call_expr.set_function(std::move(function));
230
154k
    call_expr.set_args(std::move(args));
231
154k
    return expr;
232
154k
  }
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
1.82M
  Expr NewCall(ExprId id, Function function, Args args) {
226
1.82M
    Expr expr;
227
1.82M
    expr.set_id(id);
228
1.82M
    auto& call_expr = expr.mutable_call_expr();
229
1.82M
    call_expr.set_function(std::move(function));
230
1.82M
    call_expr.set_args(std::move(args));
231
1.82M
    return expr;
232
1.82M
  }
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.7k
  Expr NewMemberCall(ExprId id, Function function, Target target, Args args) {
239
13.7k
    Expr expr;
240
13.7k
    expr.set_id(id);
241
13.7k
    auto& call_expr = expr.mutable_call_expr();
242
13.7k
    call_expr.set_function(std::move(function));
243
13.7k
    call_expr.set_target(std::move(target));
244
13.7k
    call_expr.set_args(std::move(args));
245
13.7k
    return expr;
246
13.7k
  }
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.7k
  Expr NewMemberCall(ExprId id, Function function, Target target, Args args) {
239
13.7k
    Expr expr;
240
13.7k
    expr.set_id(id);
241
13.7k
    auto& call_expr = expr.mutable_call_expr();
242
13.7k
    call_expr.set_function(std::move(function));
243
13.7k
    call_expr.set_target(std::move(target));
244
13.7k
    call_expr.set_args(std::move(args));
245
13.7k
    return expr;
246
13.7k
  }
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
374k
  ListExprElement NewListElement(Expr expr, bool optional = false) {
250
374k
    ListExprElement element;
251
374k
    element.set_expr(std::move(expr));
252
374k
    element.set_optional(optional);
253
374k
    return element;
254
374k
  }
255
256
  template <typename Elements,
257
            typename =
258
                std::enable_if_t<IsArrayLike<ListExprElement, Elements>::value>>
259
91.9k
  Expr NewList(ExprId id, Elements elements) {
260
91.9k
    Expr expr;
261
91.9k
    expr.set_id(id);
262
91.9k
    auto& list_expr = expr.mutable_list_expr();
263
91.9k
    list_expr.set_elements(std::move(elements));
264
91.9k
    return expr;
265
91.9k
  }
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
10.0k
                                 bool optional = false) {
272
10.0k
    StructExprField field;
273
10.0k
    field.set_id(id);
274
10.0k
    field.set_name(std::move(name));
275
10.0k
    field.set_value(std::move(value));
276
10.0k
    field.set_optional(optional);
277
10.0k
    return field;
278
10.0k
  }
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
7.29k
  Expr NewStruct(ExprId id, Name name, Fields fields) {
285
7.29k
    Expr expr;
286
7.29k
    expr.set_id(id);
287
7.29k
    auto& struct_expr = expr.mutable_struct_expr();
288
7.29k
    struct_expr.set_name(std::move(name));
289
7.29k
    struct_expr.set_fields(std::move(fields));
290
7.29k
    return expr;
291
7.29k
  }
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
170k
                           bool optional = false) {
298
170k
    MapExprEntry entry;
299
170k
    entry.set_id(id);
300
170k
    entry.set_key(std::move(key));
301
170k
    entry.set_value(std::move(value));
302
170k
    entry.set_optional(optional);
303
170k
    return entry;
304
170k
  }
305
306
  template <typename Entries, typename = std::enable_if_t<
307
                                  IsArrayLike<MapExprEntry, Entries>::value>>
308
12.8k
  Expr NewMap(ExprId id, Entries entries) {
309
12.8k
    Expr expr;
310
12.8k
    expr.set_id(id);
311
12.8k
    auto& map_expr = expr.mutable_map_expr();
312
12.8k
    map_expr.set_entries(std::move(entries));
313
12.8k
    return expr;
314
12.8k
  }
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
38.0k
                        Result result) {
330
38.0k
    return NewComprehension(id, std::move(iter_var), "", std::move(iter_range),
331
38.0k
                            std::move(accu_var), std::move(accu_init),
332
38.0k
                            std::move(loop_condition), std::move(loop_step),
333
38.0k
                            std::move(result));
334
38.0k
  }
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
38.0k
                        Result result) {
330
38.0k
    return NewComprehension(id, std::move(iter_var), "", std::move(iter_range),
331
38.0k
                            std::move(accu_var), std::move(accu_init),
332
38.0k
                            std::move(loop_condition), std::move(loop_step),
333
38.0k
                            std::move(result));
334
38.0k
  }
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
38.0k
                        LoopStep loop_step, Result result) {
351
38.0k
    Expr expr;
352
38.0k
    expr.set_id(id);
353
38.0k
    auto& comprehension_expr = expr.mutable_comprehension_expr();
354
38.0k
    comprehension_expr.set_iter_var(std::move(iter_var));
355
38.0k
    comprehension_expr.set_iter_var2(std::move(iter_var2));
356
38.0k
    comprehension_expr.set_iter_range(std::move(iter_range));
357
38.0k
    comprehension_expr.set_accu_var(std::move(accu_var));
358
38.0k
    comprehension_expr.set_accu_init(std::move(accu_init));
359
38.0k
    comprehension_expr.set_loop_condition(std::move(loop_condition));
360
38.0k
    comprehension_expr.set_loop_step(std::move(loop_step));
361
38.0k
    comprehension_expr.set_result(std::move(result));
362
38.0k
    return expr;
363
38.0k
  }
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
38.0k
                        LoopStep loop_step, Result result) {
351
38.0k
    Expr expr;
352
38.0k
    expr.set_id(id);
353
38.0k
    auto& comprehension_expr = expr.mutable_comprehension_expr();
354
38.0k
    comprehension_expr.set_iter_var(std::move(iter_var));
355
38.0k
    comprehension_expr.set_iter_var2(std::move(iter_var2));
356
38.0k
    comprehension_expr.set_iter_range(std::move(iter_range));
357
38.0k
    comprehension_expr.set_accu_var(std::move(accu_var));
358
38.0k
    comprehension_expr.set_accu_init(std::move(accu_init));
359
38.0k
    comprehension_expr.set_loop_condition(std::move(loop_condition));
360
38.0k
    comprehension_expr.set_loop_step(std::move(loop_step));
361
38.0k
    comprehension_expr.set_result(std::move(result));
362
38.0k
    return expr;
363
38.0k
  }
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
28.8k
  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_