Coverage Report

Created: 2026-01-12 07:02

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
36
class ExprFactory {
37
 protected:
38
  // `IsExprLike` determines whether `T` is some `Expr`. Currently that means
39
  // either `Expr` or `std::unique_ptr<Expr>`. This allows us to make the
40
  // factory functions generic and avoid redefining them for every argument
41
  // combination.
42
  template <typename T>
43
  struct IsExprLike
44
      : std::bool_constant<std::disjunction_v<
45
            std::is_same<T, Expr>, std::is_same<T, std::unique_ptr<Expr>>>> {};
46
47
  // `IsStringLike` determines whether `T` is something that looks like a
48
  // string. Currently that means `const char*`, `std::string`, or
49
  // `absl::string_view`. This allows us to make the factory functions generic
50
  // and avoid redefining them for every argument combination. This is necessary
51
  // to avoid copies if possible.
52
  template <typename T>
53
  struct IsStringLike
54
      : std::bool_constant<std::disjunction_v<
55
            std::is_same<T, char*>, std::is_same<T, const char*>,
56
            std::is_same<T, std::string>, std::is_same<T, absl::string_view>>> {
57
  };
58
59
  template <size_t N>
60
  struct IsStringLike<const char[N]> : std::true_type {};
61
62
  // `IsArrayLike` determines whether `T` is something that looks like an array
63
  // or span of some element.
64
  template <typename Element, typename Array>
65
  struct IsArrayLike : std::false_type {};
66
67
  template <typename Element>
68
  struct IsArrayLike<Element, absl::Span<Element>> : std::true_type {};
69
70
  template <typename Element>
71
  struct IsArrayLike<Element, std::vector<Element>> : std::true_type {};
72
73
 public:
74
  ExprFactory(const ExprFactory&) = delete;
75
  ExprFactory(ExprFactory&&) = delete;
76
  ExprFactory& operator=(const ExprFactory&) = delete;
77
  ExprFactory& operator=(ExprFactory&&) = delete;
78
79
6.47k
  virtual ~ExprFactory() = default;
80
81
4.03M
  Expr NewUnspecified(ExprId id) {
82
4.03M
    Expr expr;
83
4.03M
    expr.set_id(id);
84
4.03M
    return expr;
85
4.03M
  }
86
87
1.18M
  Expr NewConst(ExprId id, Constant value) {
88
1.18M
    Expr expr;
89
1.18M
    expr.set_id(id);
90
1.18M
    expr.mutable_const_expr() = std::move(value);
91
1.18M
    return expr;
92
1.18M
  }
93
94
2.63k
  Expr NewNullConst(ExprId id) {
95
2.63k
    Constant constant;
96
2.63k
    constant.set_null_value();
97
2.63k
    return NewConst(id, std::move(constant));
98
2.63k
  }
99
100
33.3k
  Expr NewBoolConst(ExprId id, bool value) {
101
33.3k
    Constant constant;
102
33.3k
    constant.set_bool_value(value);
103
33.3k
    return NewConst(id, std::move(constant));
104
33.3k
  }
105
106
772k
  Expr NewIntConst(ExprId id, int64_t value) {
107
772k
    Constant constant;
108
772k
    constant.set_int_value(value);
109
772k
    return NewConst(id, std::move(constant));
110
772k
  }
111
112
2.56k
  Expr NewUintConst(ExprId id, uint64_t value) {
113
2.56k
    Constant constant;
114
2.56k
    constant.set_uint_value(value);
115
2.56k
    return NewConst(id, std::move(constant));
116
2.56k
  }
117
118
64.0k
  Expr NewDoubleConst(ExprId id, double value) {
119
64.0k
    Constant constant;
120
64.0k
    constant.set_double_value(value);
121
64.0k
    return NewConst(id, std::move(constant));
122
64.0k
  }
123
124
0
  Expr NewBytesConst(ExprId id, BytesConstant value) {
125
0
    Constant constant;
126
0
    constant.set_bytes_value(std::move(value));
127
0
    return NewConst(id, std::move(constant));
128
0
  }
129
130
2.63k
  Expr NewBytesConst(ExprId id, std::string value) {
131
2.63k
    Constant constant;
132
2.63k
    constant.set_bytes_value(std::move(value));
133
2.63k
    return NewConst(id, std::move(constant));
134
2.63k
  }
135
136
0
  Expr NewBytesConst(ExprId id, absl::string_view value) {
137
0
    Constant constant;
138
0
    constant.set_bytes_value(value);
139
0
    return NewConst(id, std::move(constant));
140
0
  }
141
142
0
  Expr NewBytesConst(ExprId id, const char* value) {
143
0
    Constant constant;
144
0
    constant.set_bytes_value(value);
145
0
    return NewConst(id, std::move(constant));
146
0
  }
147
148
0
  Expr NewStringConst(ExprId id, StringConstant value) {
149
0
    Constant constant;
150
0
    constant.set_string_value(std::move(value));
151
0
    return NewConst(id, std::move(constant));
152
0
  }
153
154
303k
  Expr NewStringConst(ExprId id, std::string value) {
155
303k
    Constant constant;
156
303k
    constant.set_string_value(std::move(value));
157
303k
    return NewConst(id, std::move(constant));
158
303k
  }
159
160
0
  Expr NewStringConst(ExprId id, absl::string_view value) {
161
0
    Constant constant;
162
0
    constant.set_string_value(value);
163
0
    return NewConst(id, std::move(constant));
164
0
  }
165
166
2.79k
  Expr NewStringConst(ExprId id, const char* value) {
167
2.79k
    Constant constant;
168
2.79k
    constant.set_string_value(value);
169
2.79k
    return NewConst(id, std::move(constant));
170
2.79k
  }
171
172
  template <typename Name,
173
            typename = std::enable_if_t<IsStringLike<Name>::value>>
174
2.71M
  Expr NewIdent(ExprId id, Name name) {
175
2.71M
    Expr expr;
176
2.71M
    expr.set_id(id);
177
2.71M
    auto& ident_expr = expr.mutable_ident_expr();
178
2.71M
    ident_expr.set_name(std::move(name));
179
2.71M
    return expr;
180
2.71M
  }
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
174
94.3k
  Expr NewIdent(ExprId id, Name name) {
175
94.3k
    Expr expr;
176
94.3k
    expr.set_id(id);
177
94.3k
    auto& ident_expr = expr.mutable_ident_expr();
178
94.3k
    ident_expr.set_name(std::move(name));
179
94.3k
    return expr;
180
94.3k
  }
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
174
2.61M
  Expr NewIdent(ExprId id, Name name) {
175
2.61M
    Expr expr;
176
2.61M
    expr.set_id(id);
177
2.61M
    auto& ident_expr = expr.mutable_ident_expr();
178
2.61M
    ident_expr.set_name(std::move(name));
179
2.61M
    return expr;
180
2.61M
  }
181
182
126k
  absl::string_view AccuVarName() { return accu_var_; }
183
184
94.3k
  Expr NewAccuIdent(ExprId id) { return NewIdent(id, AccuVarName()); }
185
186
  template <typename Operand, typename Field,
187
            typename = std::enable_if_t<IsExprLike<Operand>::value>,
188
            typename = std::enable_if_t<IsStringLike<Field>::value>>
189
21.6k
  Expr NewSelect(ExprId id, Operand operand, Field field) {
190
21.6k
    Expr expr;
191
21.6k
    expr.set_id(id);
192
21.6k
    auto& select_expr = expr.mutable_select_expr();
193
21.6k
    select_expr.set_operand(std::move(operand));
194
21.6k
    select_expr.set_field(std::move(field));
195
21.6k
    select_expr.set_test_only(false);
196
21.6k
    return expr;
197
21.6k
  }
198
199
  template <typename Operand, typename Field,
200
            typename = std::enable_if_t<IsExprLike<Operand>::value>,
201
            typename = std::enable_if_t<IsStringLike<Field>::value>>
202
40
  Expr NewPresenceTest(ExprId id, Operand operand, Field field) {
203
40
    Expr expr;
204
40
    expr.set_id(id);
205
40
    auto& select_expr = expr.mutable_select_expr();
206
40
    select_expr.set_operand(std::move(operand));
207
40
    select_expr.set_field(std::move(field));
208
40
    select_expr.set_test_only(true);
209
40
    return expr;
210
40
  }
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
202
40
  Expr NewPresenceTest(ExprId id, Operand operand, Field field) {
203
40
    Expr expr;
204
40
    expr.set_id(id);
205
40
    auto& select_expr = expr.mutable_select_expr();
206
40
    select_expr.set_operand(std::move(operand));
207
40
    select_expr.set_field(std::move(field));
208
40
    select_expr.set_test_only(true);
209
40
    return expr;
210
40
  }
211
212
  template <typename Function, typename Args,
213
            typename = std::enable_if_t<IsStringLike<Function>::value>,
214
            typename = std::enable_if_t<IsArrayLike<Expr, Args>::value>>
215
2.97M
  Expr NewCall(ExprId id, Function function, Args args) {
216
2.97M
    Expr expr;
217
2.97M
    expr.set_id(id);
218
2.97M
    auto& call_expr = expr.mutable_call_expr();
219
2.97M
    call_expr.set_function(std::move(function));
220
2.97M
    call_expr.set_args(std::move(args));
221
2.97M
    return expr;
222
2.97M
  }
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
215
85.3k
  Expr NewCall(ExprId id, Function function, Args args) {
216
85.3k
    Expr expr;
217
85.3k
    expr.set_id(id);
218
85.3k
    auto& call_expr = expr.mutable_call_expr();
219
85.3k
    call_expr.set_function(std::move(function));
220
85.3k
    call_expr.set_args(std::move(args));
221
85.3k
    return expr;
222
85.3k
  }
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
215
293k
  Expr NewCall(ExprId id, Function function, Args args) {
216
293k
    Expr expr;
217
293k
    expr.set_id(id);
218
293k
    auto& call_expr = expr.mutable_call_expr();
219
293k
    call_expr.set_function(std::move(function));
220
293k
    call_expr.set_args(std::move(args));
221
293k
    return expr;
222
293k
  }
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
215
2.59M
  Expr NewCall(ExprId id, Function function, Args args) {
216
2.59M
    Expr expr;
217
2.59M
    expr.set_id(id);
218
2.59M
    auto& call_expr = expr.mutable_call_expr();
219
2.59M
    call_expr.set_function(std::move(function));
220
2.59M
    call_expr.set_args(std::move(args));
221
2.59M
    return expr;
222
2.59M
  }
223
224
  template <typename Function, typename Target, typename Args,
225
            typename = std::enable_if_t<IsStringLike<Function>::value>,
226
            typename = std::enable_if_t<IsExprLike<Target>::value>,
227
            typename = std::enable_if_t<IsArrayLike<Expr, Args>::value>>
228
23.3k
  Expr NewMemberCall(ExprId id, Function function, Target target, Args args) {
229
23.3k
    Expr expr;
230
23.3k
    expr.set_id(id);
231
23.3k
    auto& call_expr = expr.mutable_call_expr();
232
23.3k
    call_expr.set_function(std::move(function));
233
23.3k
    call_expr.set_target(std::move(target));
234
23.3k
    call_expr.set_args(std::move(args));
235
23.3k
    return expr;
236
23.3k
  }
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
228
23.3k
  Expr NewMemberCall(ExprId id, Function function, Target target, Args args) {
229
23.3k
    Expr expr;
230
23.3k
    expr.set_id(id);
231
23.3k
    auto& call_expr = expr.mutable_call_expr();
232
23.3k
    call_expr.set_function(std::move(function));
233
23.3k
    call_expr.set_target(std::move(target));
234
23.3k
    call_expr.set_args(std::move(args));
235
23.3k
    return expr;
236
23.3k
  }
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> >)
237
238
  template <typename Expr, typename = std::enable_if_t<IsExprLike<Expr>::value>>
239
364k
  ListExprElement NewListElement(Expr expr, bool optional = false) {
240
364k
    ListExprElement element;
241
364k
    element.set_expr(std::move(expr));
242
364k
    element.set_optional(optional);
243
364k
    return element;
244
364k
  }
245
246
  template <typename Elements,
247
            typename =
248
                std::enable_if_t<IsArrayLike<ListExprElement, Elements>::value>>
249
25.7k
  Expr NewList(ExprId id, Elements elements) {
250
25.7k
    Expr expr;
251
25.7k
    expr.set_id(id);
252
25.7k
    auto& list_expr = expr.mutable_list_expr();
253
25.7k
    list_expr.set_elements(std::move(elements));
254
25.7k
    return expr;
255
25.7k
  }
256
257
  template <typename Name, typename Value,
258
            typename = std::enable_if_t<IsStringLike<Name>::value>,
259
            typename = std::enable_if_t<IsExprLike<Value>::value>>
260
  StructExprField NewStructField(ExprId id, Name name, Value value,
261
18.1k
                                 bool optional = false) {
262
18.1k
    StructExprField field;
263
18.1k
    field.set_id(id);
264
18.1k
    field.set_name(std::move(name));
265
18.1k
    field.set_value(std::move(value));
266
18.1k
    field.set_optional(optional);
267
18.1k
    return field;
268
18.1k
  }
269
270
  template <
271
      typename Name, typename Fields,
272
      typename = std::enable_if_t<IsStringLike<Name>::value>,
273
      typename = std::enable_if_t<IsArrayLike<StructExprField, Fields>::value>>
274
3.49k
  Expr NewStruct(ExprId id, Name name, Fields fields) {
275
3.49k
    Expr expr;
276
3.49k
    expr.set_id(id);
277
3.49k
    auto& struct_expr = expr.mutable_struct_expr();
278
3.49k
    struct_expr.set_name(std::move(name));
279
3.49k
    struct_expr.set_fields(std::move(fields));
280
3.49k
    return expr;
281
3.49k
  }
282
283
  template <typename Key, typename Value,
284
            typename = std::enable_if_t<IsExprLike<Key>::value>,
285
            typename = std::enable_if_t<IsExprLike<Value>::value>>
286
  MapExprEntry NewMapEntry(ExprId id, Key key, Value value,
287
303k
                           bool optional = false) {
288
303k
    MapExprEntry entry;
289
303k
    entry.set_id(id);
290
303k
    entry.set_key(std::move(key));
291
303k
    entry.set_value(std::move(value));
292
303k
    entry.set_optional(optional);
293
303k
    return entry;
294
303k
  }
295
296
  template <typename Entries, typename = std::enable_if_t<
297
                                  IsArrayLike<MapExprEntry, Entries>::value>>
298
2.31k
  Expr NewMap(ExprId id, Entries entries) {
299
2.31k
    Expr expr;
300
2.31k
    expr.set_id(id);
301
2.31k
    auto& map_expr = expr.mutable_map_expr();
302
2.31k
    map_expr.set_entries(std::move(entries));
303
2.31k
    return expr;
304
2.31k
  }
305
306
  template <typename IterVar, typename IterRange, typename AccuVar,
307
            typename AccuInit, typename LoopCondition, typename LoopStep,
308
            typename Result,
309
            typename = std::enable_if_t<IsStringLike<IterVar>::value>,
310
            typename = std::enable_if_t<IsExprLike<IterRange>::value>,
311
            typename = std::enable_if_t<IsStringLike<AccuVar>::value>,
312
            typename = std::enable_if_t<IsExprLike<AccuInit>::value>,
313
            typename = std::enable_if_t<IsExprLike<LoopStep>::value>,
314
            typename = std::enable_if_t<IsExprLike<LoopCondition>::value>,
315
            typename = std::enable_if_t<IsExprLike<Result>::value>>
316
  Expr NewComprehension(ExprId id, IterVar iter_var, IterRange iter_range,
317
                        AccuVar accu_var, AccuInit accu_init,
318
                        LoopCondition loop_condition, LoopStep loop_step,
319
32.0k
                        Result result) {
320
32.0k
    return NewComprehension(id, std::move(iter_var), "", std::move(iter_range),
321
32.0k
                            std::move(accu_var), std::move(accu_init),
322
32.0k
                            std::move(loop_condition), std::move(loop_step),
323
32.0k
                            std::move(result));
324
32.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
319
32.0k
                        Result result) {
320
32.0k
    return NewComprehension(id, std::move(iter_var), "", std::move(iter_range),
321
32.0k
                            std::move(accu_var), std::move(accu_init),
322
32.0k
                            std::move(loop_condition), std::move(loop_step),
323
32.0k
                            std::move(result));
324
32.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)
325
326
  template <typename IterVar, typename IterVar2, typename IterRange,
327
            typename AccuVar, typename AccuInit, typename LoopCondition,
328
            typename LoopStep, typename Result,
329
            typename = std::enable_if_t<IsStringLike<IterVar>::value>,
330
            typename = std::enable_if_t<IsStringLike<IterVar2>::value>,
331
            typename = std::enable_if_t<IsExprLike<IterRange>::value>,
332
            typename = std::enable_if_t<IsStringLike<AccuVar>::value>,
333
            typename = std::enable_if_t<IsExprLike<AccuInit>::value>,
334
            typename = std::enable_if_t<IsExprLike<LoopStep>::value>,
335
            typename = std::enable_if_t<IsExprLike<LoopCondition>::value>,
336
            typename = std::enable_if_t<IsExprLike<Result>::value>>
337
  Expr NewComprehension(ExprId id, IterVar iter_var, IterVar2 iter_var2,
338
                        IterRange iter_range, AccuVar accu_var,
339
                        AccuInit accu_init, LoopCondition loop_condition,
340
32.0k
                        LoopStep loop_step, Result result) {
341
32.0k
    Expr expr;
342
32.0k
    expr.set_id(id);
343
32.0k
    auto& comprehension_expr = expr.mutable_comprehension_expr();
344
32.0k
    comprehension_expr.set_iter_var(std::move(iter_var));
345
32.0k
    comprehension_expr.set_iter_var2(std::move(iter_var2));
346
32.0k
    comprehension_expr.set_iter_range(std::move(iter_range));
347
32.0k
    comprehension_expr.set_accu_var(std::move(accu_var));
348
32.0k
    comprehension_expr.set_accu_init(std::move(accu_init));
349
32.0k
    comprehension_expr.set_loop_condition(std::move(loop_condition));
350
32.0k
    comprehension_expr.set_loop_step(std::move(loop_step));
351
32.0k
    comprehension_expr.set_result(std::move(result));
352
32.0k
    return expr;
353
32.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
340
32.0k
                        LoopStep loop_step, Result result) {
341
32.0k
    Expr expr;
342
32.0k
    expr.set_id(id);
343
32.0k
    auto& comprehension_expr = expr.mutable_comprehension_expr();
344
32.0k
    comprehension_expr.set_iter_var(std::move(iter_var));
345
32.0k
    comprehension_expr.set_iter_var2(std::move(iter_var2));
346
32.0k
    comprehension_expr.set_iter_range(std::move(iter_range));
347
32.0k
    comprehension_expr.set_accu_var(std::move(accu_var));
348
32.0k
    comprehension_expr.set_accu_init(std::move(accu_init));
349
32.0k
    comprehension_expr.set_loop_condition(std::move(loop_condition));
350
32.0k
    comprehension_expr.set_loop_step(std::move(loop_step));
351
32.0k
    comprehension_expr.set_result(std::move(result));
352
32.0k
    return expr;
353
32.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)
354
355
 private:
356
  friend class MacroExprFactory;
357
  friend class ParserMacroExprFactory;
358
359
0
  ExprFactory() : accu_var_(kAccumulatorVariableName) {}
360
6.47k
  explicit ExprFactory(absl::string_view accu_var) : accu_var_(accu_var) {}
361
362
  std::string accu_var_;
363
};
364
365
}  // namespace cel
366
367
#endif  // THIRD_PARTY_CEL_CPP_COMMON_EXPR_FACTORY_H_