Coverage Report

Created: 2026-02-11 06:43

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.96k
  virtual ~ExprFactory() = default;
80
81
10.1M
  Expr NewUnspecified(ExprId id) {
82
10.1M
    Expr expr;
83
10.1M
    expr.set_id(id);
84
10.1M
    return expr;
85
10.1M
  }
86
87
886k
  Expr NewConst(ExprId id, Constant value) {
88
886k
    Expr expr;
89
886k
    expr.set_id(id);
90
886k
    expr.mutable_const_expr() = std::move(value);
91
886k
    return expr;
92
886k
  }
93
94
1.53k
  Expr NewNullConst(ExprId id) {
95
1.53k
    Constant constant;
96
1.53k
    constant.set_null_value();
97
1.53k
    return NewConst(id, std::move(constant));
98
1.53k
  }
99
100
24.9k
  Expr NewBoolConst(ExprId id, bool value) {
101
24.9k
    Constant constant;
102
24.9k
    constant.set_bool_value(value);
103
24.9k
    return NewConst(id, std::move(constant));
104
24.9k
  }
105
106
545k
  Expr NewIntConst(ExprId id, int64_t value) {
107
545k
    Constant constant;
108
545k
    constant.set_int_value(value);
109
545k
    return NewConst(id, std::move(constant));
110
545k
  }
111
112
2.63k
  Expr NewUintConst(ExprId id, uint64_t value) {
113
2.63k
    Constant constant;
114
2.63k
    constant.set_uint_value(value);
115
2.63k
    return NewConst(id, std::move(constant));
116
2.63k
  }
117
118
57.7k
  Expr NewDoubleConst(ExprId id, double value) {
119
57.7k
    Constant constant;
120
57.7k
    constant.set_double_value(value);
121
57.7k
    return NewConst(id, std::move(constant));
122
57.7k
  }
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
3.52k
  Expr NewBytesConst(ExprId id, std::string value) {
131
3.52k
    Constant constant;
132
3.52k
    constant.set_bytes_value(std::move(value));
133
3.52k
    return NewConst(id, std::move(constant));
134
3.52k
  }
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
246k
  Expr NewStringConst(ExprId id, std::string value) {
155
246k
    Constant constant;
156
246k
    constant.set_string_value(std::move(value));
157
246k
    return NewConst(id, std::move(constant));
158
246k
  }
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.97k
  Expr NewStringConst(ExprId id, const char* value) {
167
2.97k
    Constant constant;
168
2.97k
    constant.set_string_value(value);
169
2.97k
    return NewConst(id, std::move(constant));
170
2.97k
  }
171
172
  template <typename Name,
173
            typename = std::enable_if_t<IsStringLike<Name>::value>>
174
1.88M
  Expr NewIdent(ExprId id, Name name) {
175
1.88M
    Expr expr;
176
1.88M
    expr.set_id(id);
177
1.88M
    auto& ident_expr = expr.mutable_ident_expr();
178
1.88M
    ident_expr.set_name(std::move(name));
179
1.88M
    return expr;
180
1.88M
  }
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
69.8k
  Expr NewIdent(ExprId id, Name name) {
175
69.8k
    Expr expr;
176
69.8k
    expr.set_id(id);
177
69.8k
    auto& ident_expr = expr.mutable_ident_expr();
178
69.8k
    ident_expr.set_name(std::move(name));
179
69.8k
    return expr;
180
69.8k
  }
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
1.81M
  Expr NewIdent(ExprId id, Name name) {
175
1.81M
    Expr expr;
176
1.81M
    expr.set_id(id);
177
1.81M
    auto& ident_expr = expr.mutable_ident_expr();
178
1.81M
    ident_expr.set_name(std::move(name));
179
1.81M
    return expr;
180
1.81M
  }
181
182
93.4k
  absl::string_view AccuVarName() { return accu_var_; }
183
184
69.8k
  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
20.4k
  Expr NewSelect(ExprId id, Operand operand, Field field) {
190
20.4k
    Expr expr;
191
20.4k
    expr.set_id(id);
192
20.4k
    auto& select_expr = expr.mutable_select_expr();
193
20.4k
    select_expr.set_operand(std::move(operand));
194
20.4k
    select_expr.set_field(std::move(field));
195
20.4k
    select_expr.set_test_only(false);
196
20.4k
    return expr;
197
20.4k
  }
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
26
  Expr NewPresenceTest(ExprId id, Operand operand, Field field) {
203
26
    Expr expr;
204
26
    expr.set_id(id);
205
26
    auto& select_expr = expr.mutable_select_expr();
206
26
    select_expr.set_operand(std::move(operand));
207
26
    select_expr.set_field(std::move(field));
208
26
    select_expr.set_test_only(true);
209
26
    return expr;
210
26
  }
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
26
  Expr NewPresenceTest(ExprId id, Operand operand, Field field) {
203
26
    Expr expr;
204
26
    expr.set_id(id);
205
26
    auto& select_expr = expr.mutable_select_expr();
206
26
    select_expr.set_operand(std::move(operand));
207
26
    select_expr.set_field(std::move(field));
208
26
    select_expr.set_test_only(true);
209
26
    return expr;
210
26
  }
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.13M
  Expr NewCall(ExprId id, Function function, Args args) {
216
2.13M
    Expr expr;
217
2.13M
    expr.set_id(id);
218
2.13M
    auto& call_expr = expr.mutable_call_expr();
219
2.13M
    call_expr.set_function(std::move(function));
220
2.13M
    call_expr.set_args(std::move(args));
221
2.13M
    return expr;
222
2.13M
  }
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
64.9k
  Expr NewCall(ExprId id, Function function, Args args) {
216
64.9k
    Expr expr;
217
64.9k
    expr.set_id(id);
218
64.9k
    auto& call_expr = expr.mutable_call_expr();
219
64.9k
    call_expr.set_function(std::move(function));
220
64.9k
    call_expr.set_args(std::move(args));
221
64.9k
    return expr;
222
64.9k
  }
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
165k
  Expr NewCall(ExprId id, Function function, Args args) {
216
165k
    Expr expr;
217
165k
    expr.set_id(id);
218
165k
    auto& call_expr = expr.mutable_call_expr();
219
165k
    call_expr.set_function(std::move(function));
220
165k
    call_expr.set_args(std::move(args));
221
165k
    return expr;
222
165k
  }
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
1.90M
  Expr NewCall(ExprId id, Function function, Args args) {
216
1.90M
    Expr expr;
217
1.90M
    expr.set_id(id);
218
1.90M
    auto& call_expr = expr.mutable_call_expr();
219
1.90M
    call_expr.set_function(std::move(function));
220
1.90M
    call_expr.set_args(std::move(args));
221
1.90M
    return expr;
222
1.90M
  }
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
20.7k
  Expr NewMemberCall(ExprId id, Function function, Target target, Args args) {
229
20.7k
    Expr expr;
230
20.7k
    expr.set_id(id);
231
20.7k
    auto& call_expr = expr.mutable_call_expr();
232
20.7k
    call_expr.set_function(std::move(function));
233
20.7k
    call_expr.set_target(std::move(target));
234
20.7k
    call_expr.set_args(std::move(args));
235
20.7k
    return expr;
236
20.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
228
20.7k
  Expr NewMemberCall(ExprId id, Function function, Target target, Args args) {
229
20.7k
    Expr expr;
230
20.7k
    expr.set_id(id);
231
20.7k
    auto& call_expr = expr.mutable_call_expr();
232
20.7k
    call_expr.set_function(std::move(function));
233
20.7k
    call_expr.set_target(std::move(target));
234
20.7k
    call_expr.set_args(std::move(args));
235
20.7k
    return expr;
236
20.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> >)
237
238
  template <typename Expr, typename = std::enable_if_t<IsExprLike<Expr>::value>>
239
230k
  ListExprElement NewListElement(Expr expr, bool optional = false) {
240
230k
    ListExprElement element;
241
230k
    element.set_expr(std::move(expr));
242
230k
    element.set_optional(optional);
243
230k
    return element;
244
230k
  }
245
246
  template <typename Elements,
247
            typename =
248
                std::enable_if_t<IsArrayLike<ListExprElement, Elements>::value>>
249
20.1k
  Expr NewList(ExprId id, Elements elements) {
250
20.1k
    Expr expr;
251
20.1k
    expr.set_id(id);
252
20.1k
    auto& list_expr = expr.mutable_list_expr();
253
20.1k
    list_expr.set_elements(std::move(elements));
254
20.1k
    return expr;
255
20.1k
  }
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
5.79k
                                 bool optional = false) {
262
5.79k
    StructExprField field;
263
5.79k
    field.set_id(id);
264
5.79k
    field.set_name(std::move(name));
265
5.79k
    field.set_value(std::move(value));
266
5.79k
    field.set_optional(optional);
267
5.79k
    return field;
268
5.79k
  }
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.66k
  Expr NewStruct(ExprId id, Name name, Fields fields) {
275
3.66k
    Expr expr;
276
3.66k
    expr.set_id(id);
277
3.66k
    auto& struct_expr = expr.mutable_struct_expr();
278
3.66k
    struct_expr.set_name(std::move(name));
279
3.66k
    struct_expr.set_fields(std::move(fields));
280
3.66k
    return expr;
281
3.66k
  }
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
248k
                           bool optional = false) {
288
248k
    MapExprEntry entry;
289
248k
    entry.set_id(id);
290
248k
    entry.set_key(std::move(key));
291
248k
    entry.set_value(std::move(value));
292
248k
    entry.set_optional(optional);
293
248k
    return entry;
294
248k
  }
295
296
  template <typename Entries, typename = std::enable_if_t<
297
                                  IsArrayLike<MapExprEntry, Entries>::value>>
298
4.36k
  Expr NewMap(ExprId id, Entries entries) {
299
4.36k
    Expr expr;
300
4.36k
    expr.set_id(id);
301
4.36k
    auto& map_expr = expr.mutable_map_expr();
302
4.36k
    map_expr.set_entries(std::move(entries));
303
4.36k
    return expr;
304
4.36k
  }
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
23.6k
                        Result result) {
320
23.6k
    return NewComprehension(id, std::move(iter_var), "", std::move(iter_range),
321
23.6k
                            std::move(accu_var), std::move(accu_init),
322
23.6k
                            std::move(loop_condition), std::move(loop_step),
323
23.6k
                            std::move(result));
324
23.6k
  }
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
23.6k
                        Result result) {
320
23.6k
    return NewComprehension(id, std::move(iter_var), "", std::move(iter_range),
321
23.6k
                            std::move(accu_var), std::move(accu_init),
322
23.6k
                            std::move(loop_condition), std::move(loop_step),
323
23.6k
                            std::move(result));
324
23.6k
  }
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
23.6k
                        LoopStep loop_step, Result result) {
341
23.6k
    Expr expr;
342
23.6k
    expr.set_id(id);
343
23.6k
    auto& comprehension_expr = expr.mutable_comprehension_expr();
344
23.6k
    comprehension_expr.set_iter_var(std::move(iter_var));
345
23.6k
    comprehension_expr.set_iter_var2(std::move(iter_var2));
346
23.6k
    comprehension_expr.set_iter_range(std::move(iter_range));
347
23.6k
    comprehension_expr.set_accu_var(std::move(accu_var));
348
23.6k
    comprehension_expr.set_accu_init(std::move(accu_init));
349
23.6k
    comprehension_expr.set_loop_condition(std::move(loop_condition));
350
23.6k
    comprehension_expr.set_loop_step(std::move(loop_step));
351
23.6k
    comprehension_expr.set_result(std::move(result));
352
23.6k
    return expr;
353
23.6k
  }
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
23.6k
                        LoopStep loop_step, Result result) {
341
23.6k
    Expr expr;
342
23.6k
    expr.set_id(id);
343
23.6k
    auto& comprehension_expr = expr.mutable_comprehension_expr();
344
23.6k
    comprehension_expr.set_iter_var(std::move(iter_var));
345
23.6k
    comprehension_expr.set_iter_var2(std::move(iter_var2));
346
23.6k
    comprehension_expr.set_iter_range(std::move(iter_range));
347
23.6k
    comprehension_expr.set_accu_var(std::move(accu_var));
348
23.6k
    comprehension_expr.set_accu_init(std::move(accu_init));
349
23.6k
    comprehension_expr.set_loop_condition(std::move(loop_condition));
350
23.6k
    comprehension_expr.set_loop_step(std::move(loop_step));
351
23.6k
    comprehension_expr.set_result(std::move(result));
352
23.6k
    return expr;
353
23.6k
  }
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.96k
  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_