Coverage Report

Created: 2026-09-03 06:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/proc/self/cwd/runtime/standard/comparison_functions.cc
Line
Count
Source
1
// Copyright 2021 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
#include "runtime/standard/comparison_functions.h"
16
17
#include <cstdint>
18
19
#include "absl/status/status.h"
20
#include "absl/time/time.h"
21
#include "base/builtins.h"
22
#include "base/function_adapter.h"
23
#include "common/value.h"
24
#include "internal/number.h"
25
#include "internal/status_macros.h"
26
#include "runtime/function_registry.h"
27
#include "runtime/runtime_options.h"
28
29
namespace cel {
30
31
namespace {
32
33
using ::cel::internal::Number;
34
35
// Comparison template functions
36
template <class Type>
37
52.4k
bool LessThan(Type t1, Type t2) {
38
52.4k
  return (t1 < t2);
39
52.4k
}
comparison_functions.cc:bool cel::(anonymous namespace)::LessThan<bool>(bool, bool)
Line
Count
Source
37
991
bool LessThan(Type t1, Type t2) {
38
991
  return (t1 < t2);
39
991
}
comparison_functions.cc:bool cel::(anonymous namespace)::LessThan<long>(long, long)
Line
Count
Source
37
48.1k
bool LessThan(Type t1, Type t2) {
38
48.1k
  return (t1 < t2);
39
48.1k
}
comparison_functions.cc:bool cel::(anonymous namespace)::LessThan<unsigned long>(unsigned long, unsigned long)
Line
Count
Source
37
2.08k
bool LessThan(Type t1, Type t2) {
38
2.08k
  return (t1 < t2);
39
2.08k
}
comparison_functions.cc:bool cel::(anonymous namespace)::LessThan<double>(double, double)
Line
Count
Source
37
1.29k
bool LessThan(Type t1, Type t2) {
38
1.29k
  return (t1 < t2);
39
1.29k
}
40
41
template <class Type>
42
9.41k
bool LessThanOrEqual(Type t1, Type t2) {
43
9.41k
  return (t1 <= t2);
44
9.41k
}
comparison_functions.cc:bool cel::(anonymous namespace)::LessThanOrEqual<bool>(bool, bool)
Line
Count
Source
42
649
bool LessThanOrEqual(Type t1, Type t2) {
43
649
  return (t1 <= t2);
44
649
}
comparison_functions.cc:bool cel::(anonymous namespace)::LessThanOrEqual<long>(long, long)
Line
Count
Source
42
4.30k
bool LessThanOrEqual(Type t1, Type t2) {
43
4.30k
  return (t1 <= t2);
44
4.30k
}
comparison_functions.cc:bool cel::(anonymous namespace)::LessThanOrEqual<unsigned long>(unsigned long, unsigned long)
Line
Count
Source
42
1.40k
bool LessThanOrEqual(Type t1, Type t2) {
43
1.40k
  return (t1 <= t2);
44
1.40k
}
comparison_functions.cc:bool cel::(anonymous namespace)::LessThanOrEqual<double>(double, double)
Line
Count
Source
42
3.06k
bool LessThanOrEqual(Type t1, Type t2) {
43
3.06k
  return (t1 <= t2);
44
3.06k
}
45
46
template <class Type>
47
20.2k
bool GreaterThan(Type t1, Type t2) {
48
20.2k
  return LessThan(t2, t1);
49
20.2k
}
comparison_functions.cc:bool cel::(anonymous namespace)::GreaterThan<bool>(bool, bool)
Line
Count
Source
47
669
bool GreaterThan(Type t1, Type t2) {
48
669
  return LessThan(t2, t1);
49
669
}
comparison_functions.cc:bool cel::(anonymous namespace)::GreaterThan<long>(long, long)
Line
Count
Source
47
18.6k
bool GreaterThan(Type t1, Type t2) {
48
18.6k
  return LessThan(t2, t1);
49
18.6k
}
comparison_functions.cc:bool cel::(anonymous namespace)::GreaterThan<unsigned long>(unsigned long, unsigned long)
Line
Count
Source
47
533
bool GreaterThan(Type t1, Type t2) {
48
533
  return LessThan(t2, t1);
49
533
}
comparison_functions.cc:bool cel::(anonymous namespace)::GreaterThan<double>(double, double)
Line
Count
Source
47
323
bool GreaterThan(Type t1, Type t2) {
48
323
  return LessThan(t2, t1);
49
323
}
50
51
template <class Type>
52
8.11k
bool GreaterThanOrEqual(Type t1, Type t2) {
53
8.11k
  return LessThanOrEqual(t2, t1);
54
8.11k
}
comparison_functions.cc:bool cel::(anonymous namespace)::GreaterThanOrEqual<bool>(bool, bool)
Line
Count
Source
52
594
bool GreaterThanOrEqual(Type t1, Type t2) {
53
594
  return LessThanOrEqual(t2, t1);
54
594
}
comparison_functions.cc:bool cel::(anonymous namespace)::GreaterThanOrEqual<long>(long, long)
Line
Count
Source
52
3.59k
bool GreaterThanOrEqual(Type t1, Type t2) {
53
3.59k
  return LessThanOrEqual(t2, t1);
54
3.59k
}
comparison_functions.cc:bool cel::(anonymous namespace)::GreaterThanOrEqual<unsigned long>(unsigned long, unsigned long)
Line
Count
Source
52
1.12k
bool GreaterThanOrEqual(Type t1, Type t2) {
53
1.12k
  return LessThanOrEqual(t2, t1);
54
1.12k
}
comparison_functions.cc:bool cel::(anonymous namespace)::GreaterThanOrEqual<double>(double, double)
Line
Count
Source
52
2.80k
bool GreaterThanOrEqual(Type t1, Type t2) {
53
2.80k
  return LessThanOrEqual(t2, t1);
54
2.80k
}
55
56
// String value comparions specializations
57
template <>
58
1.00k
bool LessThan(const StringValue& t1, const StringValue& t2) {
59
1.00k
  return t1.Compare(t2) < 0;
60
1.00k
}
61
62
template <>
63
432
bool LessThanOrEqual(const StringValue& t1, const StringValue& t2) {
64
432
  return t1.Compare(t2) <= 0;
65
432
}
66
67
template <>
68
1.20k
bool GreaterThan(const StringValue& t1, const StringValue& t2) {
69
1.20k
  return t1.Compare(t2) > 0;
70
1.20k
}
71
72
template <>
73
351
bool GreaterThanOrEqual(const StringValue& t1, const StringValue& t2) {
74
351
  return t1.Compare(t2) >= 0;
75
351
}
76
77
// bytes value comparions specializations
78
template <>
79
135
bool LessThan(const BytesValue& t1, const BytesValue& t2) {
80
135
  return t1.Compare(t2) < 0;
81
135
}
82
83
template <>
84
396
bool LessThanOrEqual(const BytesValue& t1, const BytesValue& t2) {
85
396
  return t1.Compare(t2) <= 0;
86
396
}
87
88
template <>
89
3.52k
bool GreaterThan(const BytesValue& t1, const BytesValue& t2) {
90
3.52k
  return t1.Compare(t2) > 0;
91
3.52k
}
92
93
template <>
94
332
bool GreaterThanOrEqual(const BytesValue& t1, const BytesValue& t2) {
95
332
  return t1.Compare(t2) >= 0;
96
332
}
97
98
// Duration comparison specializations
99
template <>
100
572
bool LessThan(absl::Duration t1, absl::Duration t2) {
101
572
  return absl::operator<(t1, t2);
102
572
}
103
104
template <>
105
373
bool LessThanOrEqual(absl::Duration t1, absl::Duration t2) {
106
373
  return absl::operator<=(t1, t2);
107
373
}
108
109
template <>
110
261
bool GreaterThan(absl::Duration t1, absl::Duration t2) {
111
261
  return absl::operator>(t1, t2);
112
261
}
113
114
template <>
115
1.33k
bool GreaterThanOrEqual(absl::Duration t1, absl::Duration t2) {
116
1.33k
  return absl::operator>=(t1, t2);
117
1.33k
}
118
119
// Timestamp comparison specializations
120
template <>
121
123
bool LessThan(absl::Time t1, absl::Time t2) {
122
123
  return absl::operator<(t1, t2);
123
123
}
124
125
template <>
126
12
bool LessThanOrEqual(absl::Time t1, absl::Time t2) {
127
12
  return absl::operator<=(t1, t2);
128
12
}
129
130
template <>
131
0
bool GreaterThan(absl::Time t1, absl::Time t2) {
132
0
  return absl::operator>(t1, t2);
133
0
}
134
135
template <>
136
0
bool GreaterThanOrEqual(absl::Time t1, absl::Time t2) {
137
0
  return absl::operator>=(t1, t2);
138
0
}
139
140
template <typename T, typename U>
141
39.0k
bool CrossNumericLessThan(T t, U u) {
142
39.0k
  return Number(t) < Number(u);
143
39.0k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessThan<double, long>(double, long)
Line
Count
Source
141
3.45k
bool CrossNumericLessThan(T t, U u) {
142
3.45k
  return Number(t) < Number(u);
143
3.45k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessThan<double, unsigned long>(double, unsigned long)
Line
Count
Source
141
23.5k
bool CrossNumericLessThan(T t, U u) {
142
23.5k
  return Number(t) < Number(u);
143
23.5k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessThan<unsigned long, double>(unsigned long, double)
Line
Count
Source
141
3.46k
bool CrossNumericLessThan(T t, U u) {
142
3.46k
  return Number(t) < Number(u);
143
3.46k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessThan<unsigned long, long>(unsigned long, long)
Line
Count
Source
141
2.12k
bool CrossNumericLessThan(T t, U u) {
142
2.12k
  return Number(t) < Number(u);
143
2.12k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessThan<long, double>(long, double)
Line
Count
Source
141
4.52k
bool CrossNumericLessThan(T t, U u) {
142
4.52k
  return Number(t) < Number(u);
143
4.52k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessThan<long, unsigned long>(long, unsigned long)
Line
Count
Source
141
1.94k
bool CrossNumericLessThan(T t, U u) {
142
1.94k
  return Number(t) < Number(u);
143
1.94k
}
144
145
template <typename T, typename U>
146
17.1k
bool CrossNumericGreaterThan(T t, U u) {
147
17.1k
  return Number(t) > Number(u);
148
17.1k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterThan<double, long>(double, long)
Line
Count
Source
146
1.59k
bool CrossNumericGreaterThan(T t, U u) {
147
1.59k
  return Number(t) > Number(u);
148
1.59k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterThan<double, unsigned long>(double, unsigned long)
Line
Count
Source
146
1.18k
bool CrossNumericGreaterThan(T t, U u) {
147
1.18k
  return Number(t) > Number(u);
148
1.18k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterThan<unsigned long, double>(unsigned long, double)
Line
Count
Source
146
1.31k
bool CrossNumericGreaterThan(T t, U u) {
147
1.31k
  return Number(t) > Number(u);
148
1.31k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterThan<unsigned long, long>(unsigned long, long)
Line
Count
Source
146
1.62k
bool CrossNumericGreaterThan(T t, U u) {
147
1.62k
  return Number(t) > Number(u);
148
1.62k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterThan<long, double>(long, double)
Line
Count
Source
146
9.51k
bool CrossNumericGreaterThan(T t, U u) {
147
9.51k
  return Number(t) > Number(u);
148
9.51k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterThan<long, unsigned long>(long, unsigned long)
Line
Count
Source
146
1.87k
bool CrossNumericGreaterThan(T t, U u) {
147
1.87k
  return Number(t) > Number(u);
148
1.87k
}
149
150
template <typename T, typename U>
151
10.4k
bool CrossNumericLessOrEqualTo(T t, U u) {
152
10.4k
  return Number(t) <= Number(u);
153
10.4k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessOrEqualTo<double, long>(double, long)
Line
Count
Source
151
1.66k
bool CrossNumericLessOrEqualTo(T t, U u) {
152
1.66k
  return Number(t) <= Number(u);
153
1.66k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessOrEqualTo<double, unsigned long>(double, unsigned long)
Line
Count
Source
151
1.50k
bool CrossNumericLessOrEqualTo(T t, U u) {
152
1.50k
  return Number(t) <= Number(u);
153
1.50k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessOrEqualTo<unsigned long, double>(unsigned long, double)
Line
Count
Source
151
1.32k
bool CrossNumericLessOrEqualTo(T t, U u) {
152
1.32k
  return Number(t) <= Number(u);
153
1.32k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessOrEqualTo<unsigned long, long>(unsigned long, long)
Line
Count
Source
151
2.18k
bool CrossNumericLessOrEqualTo(T t, U u) {
152
2.18k
  return Number(t) <= Number(u);
153
2.18k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessOrEqualTo<long, double>(long, double)
Line
Count
Source
151
1.39k
bool CrossNumericLessOrEqualTo(T t, U u) {
152
1.39k
  return Number(t) <= Number(u);
153
1.39k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericLessOrEqualTo<long, unsigned long>(long, unsigned long)
Line
Count
Source
151
2.35k
bool CrossNumericLessOrEqualTo(T t, U u) {
152
2.35k
  return Number(t) <= Number(u);
153
2.35k
}
154
155
template <typename T, typename U>
156
23.8k
bool CrossNumericGreaterOrEqualTo(T t, U u) {
157
23.8k
  return Number(t) >= Number(u);
158
23.8k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterOrEqualTo<double, long>(double, long)
Line
Count
Source
156
11.2k
bool CrossNumericGreaterOrEqualTo(T t, U u) {
157
11.2k
  return Number(t) >= Number(u);
158
11.2k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterOrEqualTo<double, unsigned long>(double, unsigned long)
Line
Count
Source
156
1.91k
bool CrossNumericGreaterOrEqualTo(T t, U u) {
157
1.91k
  return Number(t) >= Number(u);
158
1.91k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterOrEqualTo<unsigned long, double>(unsigned long, double)
Line
Count
Source
156
2.22k
bool CrossNumericGreaterOrEqualTo(T t, U u) {
157
2.22k
  return Number(t) >= Number(u);
158
2.22k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterOrEqualTo<unsigned long, long>(unsigned long, long)
Line
Count
Source
156
1.22k
bool CrossNumericGreaterOrEqualTo(T t, U u) {
157
1.22k
  return Number(t) >= Number(u);
158
1.22k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterOrEqualTo<long, double>(long, double)
Line
Count
Source
156
1.96k
bool CrossNumericGreaterOrEqualTo(T t, U u) {
157
1.96k
  return Number(t) >= Number(u);
158
1.96k
}
comparison_functions.cc:bool cel::(anonymous namespace)::CrossNumericGreaterOrEqualTo<long, unsigned long>(long, unsigned long)
Line
Count
Source
156
5.23k
bool CrossNumericGreaterOrEqualTo(T t, U u) {
157
5.23k
  return Number(t) >= Number(u);
158
5.23k
}
159
160
template <class Type>
161
absl::Status RegisterComparisonFunctionsForType(
162
180k
    cel::FunctionRegistry& registry) {
163
180k
  using FunctionAdapter = BinaryFunctionAdapter<bool, Type, Type>;
164
180k
  CEL_RETURN_IF_ERROR(registry.Register(
165
180k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess, false),
166
180k
      FunctionAdapter::WrapFunction(LessThan<Type>)));
167
168
180k
  CEL_RETURN_IF_ERROR(registry.Register(
169
180k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual, false),
170
180k
      FunctionAdapter::WrapFunction(LessThanOrEqual<Type>)));
171
172
180k
  CEL_RETURN_IF_ERROR(registry.Register(
173
180k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater, false),
174
180k
      FunctionAdapter::WrapFunction(GreaterThan<Type>)));
175
176
180k
  CEL_RETURN_IF_ERROR(registry.Register(
177
180k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual, false),
178
180k
      FunctionAdapter::WrapFunction(GreaterThanOrEqual<Type>)));
179
180
180k
  return absl::OkStatus();
181
180k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterComparisonFunctionsForType<bool>(cel::FunctionRegistry&)
Line
Count
Source
162
22.5k
    cel::FunctionRegistry& registry) {
163
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, Type, Type>;
164
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
165
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess, false),
166
22.5k
      FunctionAdapter::WrapFunction(LessThan<Type>)));
167
168
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
169
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual, false),
170
22.5k
      FunctionAdapter::WrapFunction(LessThanOrEqual<Type>)));
171
172
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
173
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater, false),
174
22.5k
      FunctionAdapter::WrapFunction(GreaterThan<Type>)));
175
176
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
177
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual, false),
178
22.5k
      FunctionAdapter::WrapFunction(GreaterThanOrEqual<Type>)));
179
180
22.5k
  return absl::OkStatus();
181
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterComparisonFunctionsForType<long>(cel::FunctionRegistry&)
Line
Count
Source
162
22.5k
    cel::FunctionRegistry& registry) {
163
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, Type, Type>;
164
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
165
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess, false),
166
22.5k
      FunctionAdapter::WrapFunction(LessThan<Type>)));
167
168
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
169
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual, false),
170
22.5k
      FunctionAdapter::WrapFunction(LessThanOrEqual<Type>)));
171
172
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
173
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater, false),
174
22.5k
      FunctionAdapter::WrapFunction(GreaterThan<Type>)));
175
176
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
177
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual, false),
178
22.5k
      FunctionAdapter::WrapFunction(GreaterThanOrEqual<Type>)));
179
180
22.5k
  return absl::OkStatus();
181
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterComparisonFunctionsForType<unsigned long>(cel::FunctionRegistry&)
Line
Count
Source
162
22.5k
    cel::FunctionRegistry& registry) {
163
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, Type, Type>;
164
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
165
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess, false),
166
22.5k
      FunctionAdapter::WrapFunction(LessThan<Type>)));
167
168
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
169
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual, false),
170
22.5k
      FunctionAdapter::WrapFunction(LessThanOrEqual<Type>)));
171
172
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
173
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater, false),
174
22.5k
      FunctionAdapter::WrapFunction(GreaterThan<Type>)));
175
176
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
177
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual, false),
178
22.5k
      FunctionAdapter::WrapFunction(GreaterThanOrEqual<Type>)));
179
180
22.5k
  return absl::OkStatus();
181
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterComparisonFunctionsForType<double>(cel::FunctionRegistry&)
Line
Count
Source
162
22.5k
    cel::FunctionRegistry& registry) {
163
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, Type, Type>;
164
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
165
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess, false),
166
22.5k
      FunctionAdapter::WrapFunction(LessThan<Type>)));
167
168
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
169
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual, false),
170
22.5k
      FunctionAdapter::WrapFunction(LessThanOrEqual<Type>)));
171
172
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
173
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater, false),
174
22.5k
      FunctionAdapter::WrapFunction(GreaterThan<Type>)));
175
176
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
177
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual, false),
178
22.5k
      FunctionAdapter::WrapFunction(GreaterThanOrEqual<Type>)));
179
180
22.5k
  return absl::OkStatus();
181
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterComparisonFunctionsForType<cel::StringValue const&>(cel::FunctionRegistry&)
Line
Count
Source
162
22.5k
    cel::FunctionRegistry& registry) {
163
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, Type, Type>;
164
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
165
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess, false),
166
22.5k
      FunctionAdapter::WrapFunction(LessThan<Type>)));
167
168
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
169
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual, false),
170
22.5k
      FunctionAdapter::WrapFunction(LessThanOrEqual<Type>)));
171
172
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
173
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater, false),
174
22.5k
      FunctionAdapter::WrapFunction(GreaterThan<Type>)));
175
176
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
177
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual, false),
178
22.5k
      FunctionAdapter::WrapFunction(GreaterThanOrEqual<Type>)));
179
180
22.5k
  return absl::OkStatus();
181
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterComparisonFunctionsForType<cel::BytesValue const&>(cel::FunctionRegistry&)
Line
Count
Source
162
22.5k
    cel::FunctionRegistry& registry) {
163
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, Type, Type>;
164
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
165
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess, false),
166
22.5k
      FunctionAdapter::WrapFunction(LessThan<Type>)));
167
168
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
169
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual, false),
170
22.5k
      FunctionAdapter::WrapFunction(LessThanOrEqual<Type>)));
171
172
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
173
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater, false),
174
22.5k
      FunctionAdapter::WrapFunction(GreaterThan<Type>)));
175
176
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
177
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual, false),
178
22.5k
      FunctionAdapter::WrapFunction(GreaterThanOrEqual<Type>)));
179
180
22.5k
  return absl::OkStatus();
181
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterComparisonFunctionsForType<absl::lts_20260526::Duration>(cel::FunctionRegistry&)
Line
Count
Source
162
22.5k
    cel::FunctionRegistry& registry) {
163
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, Type, Type>;
164
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
165
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess, false),
166
22.5k
      FunctionAdapter::WrapFunction(LessThan<Type>)));
167
168
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
169
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual, false),
170
22.5k
      FunctionAdapter::WrapFunction(LessThanOrEqual<Type>)));
171
172
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
173
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater, false),
174
22.5k
      FunctionAdapter::WrapFunction(GreaterThan<Type>)));
175
176
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
177
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual, false),
178
22.5k
      FunctionAdapter::WrapFunction(GreaterThanOrEqual<Type>)));
179
180
22.5k
  return absl::OkStatus();
181
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterComparisonFunctionsForType<absl::lts_20260526::Time>(cel::FunctionRegistry&)
Line
Count
Source
162
22.5k
    cel::FunctionRegistry& registry) {
163
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, Type, Type>;
164
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
165
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess, false),
166
22.5k
      FunctionAdapter::WrapFunction(LessThan<Type>)));
167
168
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
169
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual, false),
170
22.5k
      FunctionAdapter::WrapFunction(LessThanOrEqual<Type>)));
171
172
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
173
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater, false),
174
22.5k
      FunctionAdapter::WrapFunction(GreaterThan<Type>)));
175
176
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
177
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual, false),
178
22.5k
      FunctionAdapter::WrapFunction(GreaterThanOrEqual<Type>)));
179
180
22.5k
  return absl::OkStatus();
181
22.5k
}
182
183
absl::Status RegisterHomogenousComparisonFunctions(
184
0
    cel::FunctionRegistry& registry) {
185
0
  CEL_RETURN_IF_ERROR(RegisterComparisonFunctionsForType<bool>(registry));
186
187
0
  CEL_RETURN_IF_ERROR(RegisterComparisonFunctionsForType<int64_t>(registry));
188
189
0
  CEL_RETURN_IF_ERROR(RegisterComparisonFunctionsForType<uint64_t>(registry));
190
191
0
  CEL_RETURN_IF_ERROR(RegisterComparisonFunctionsForType<double>(registry));
192
193
0
  CEL_RETURN_IF_ERROR(
194
0
      RegisterComparisonFunctionsForType<const StringValue&>(registry));
195
196
0
  CEL_RETURN_IF_ERROR(
197
0
      RegisterComparisonFunctionsForType<const BytesValue&>(registry));
198
199
0
  CEL_RETURN_IF_ERROR(
200
0
      RegisterComparisonFunctionsForType<absl::Duration>(registry));
201
202
0
  CEL_RETURN_IF_ERROR(RegisterComparisonFunctionsForType<absl::Time>(registry));
203
204
0
  return absl::OkStatus();
205
0
}
206
207
template <typename T, typename U>
208
135k
absl::Status RegisterCrossNumericComparisons(cel::FunctionRegistry& registry) {
209
135k
  using FunctionAdapter = BinaryFunctionAdapter<bool, T, U>;
210
135k
  CEL_RETURN_IF_ERROR(registry.Register(
211
135k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess,
212
135k
                                        /*receiver_style=*/false),
213
135k
      FunctionAdapter::WrapFunction(&CrossNumericLessThan<T, U>)));
214
135k
  CEL_RETURN_IF_ERROR(registry.Register(
215
135k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater,
216
135k
                                        /*receiver_style=*/false),
217
135k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterThan<T, U>)));
218
135k
  CEL_RETURN_IF_ERROR(registry.Register(
219
135k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual,
220
135k
                                        /*receiver_style=*/false),
221
135k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterOrEqualTo<T, U>)));
222
135k
  CEL_RETURN_IF_ERROR(registry.Register(
223
135k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual,
224
135k
                                        /*receiver_style=*/false),
225
135k
      FunctionAdapter::WrapFunction(&CrossNumericLessOrEqualTo<T, U>)));
226
135k
  return absl::OkStatus();
227
135k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterCrossNumericComparisons<double, long>(cel::FunctionRegistry&)
Line
Count
Source
208
22.5k
absl::Status RegisterCrossNumericComparisons(cel::FunctionRegistry& registry) {
209
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, T, U>;
210
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
211
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess,
212
22.5k
                                        /*receiver_style=*/false),
213
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessThan<T, U>)));
214
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
215
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater,
216
22.5k
                                        /*receiver_style=*/false),
217
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterThan<T, U>)));
218
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
219
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual,
220
22.5k
                                        /*receiver_style=*/false),
221
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterOrEqualTo<T, U>)));
222
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
223
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual,
224
22.5k
                                        /*receiver_style=*/false),
225
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessOrEqualTo<T, U>)));
226
22.5k
  return absl::OkStatus();
227
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterCrossNumericComparisons<double, unsigned long>(cel::FunctionRegistry&)
Line
Count
Source
208
22.5k
absl::Status RegisterCrossNumericComparisons(cel::FunctionRegistry& registry) {
209
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, T, U>;
210
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
211
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess,
212
22.5k
                                        /*receiver_style=*/false),
213
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessThan<T, U>)));
214
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
215
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater,
216
22.5k
                                        /*receiver_style=*/false),
217
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterThan<T, U>)));
218
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
219
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual,
220
22.5k
                                        /*receiver_style=*/false),
221
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterOrEqualTo<T, U>)));
222
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
223
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual,
224
22.5k
                                        /*receiver_style=*/false),
225
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessOrEqualTo<T, U>)));
226
22.5k
  return absl::OkStatus();
227
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterCrossNumericComparisons<unsigned long, double>(cel::FunctionRegistry&)
Line
Count
Source
208
22.5k
absl::Status RegisterCrossNumericComparisons(cel::FunctionRegistry& registry) {
209
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, T, U>;
210
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
211
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess,
212
22.5k
                                        /*receiver_style=*/false),
213
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessThan<T, U>)));
214
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
215
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater,
216
22.5k
                                        /*receiver_style=*/false),
217
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterThan<T, U>)));
218
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
219
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual,
220
22.5k
                                        /*receiver_style=*/false),
221
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterOrEqualTo<T, U>)));
222
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
223
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual,
224
22.5k
                                        /*receiver_style=*/false),
225
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessOrEqualTo<T, U>)));
226
22.5k
  return absl::OkStatus();
227
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterCrossNumericComparisons<unsigned long, long>(cel::FunctionRegistry&)
Line
Count
Source
208
22.5k
absl::Status RegisterCrossNumericComparisons(cel::FunctionRegistry& registry) {
209
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, T, U>;
210
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
211
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess,
212
22.5k
                                        /*receiver_style=*/false),
213
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessThan<T, U>)));
214
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
215
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater,
216
22.5k
                                        /*receiver_style=*/false),
217
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterThan<T, U>)));
218
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
219
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual,
220
22.5k
                                        /*receiver_style=*/false),
221
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterOrEqualTo<T, U>)));
222
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
223
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual,
224
22.5k
                                        /*receiver_style=*/false),
225
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessOrEqualTo<T, U>)));
226
22.5k
  return absl::OkStatus();
227
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterCrossNumericComparisons<long, double>(cel::FunctionRegistry&)
Line
Count
Source
208
22.5k
absl::Status RegisterCrossNumericComparisons(cel::FunctionRegistry& registry) {
209
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, T, U>;
210
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
211
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess,
212
22.5k
                                        /*receiver_style=*/false),
213
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessThan<T, U>)));
214
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
215
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater,
216
22.5k
                                        /*receiver_style=*/false),
217
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterThan<T, U>)));
218
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
219
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual,
220
22.5k
                                        /*receiver_style=*/false),
221
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterOrEqualTo<T, U>)));
222
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
223
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual,
224
22.5k
                                        /*receiver_style=*/false),
225
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessOrEqualTo<T, U>)));
226
22.5k
  return absl::OkStatus();
227
22.5k
}
comparison_functions.cc:absl::lts_20260526::Status cel::(anonymous namespace)::RegisterCrossNumericComparisons<long, unsigned long>(cel::FunctionRegistry&)
Line
Count
Source
208
22.5k
absl::Status RegisterCrossNumericComparisons(cel::FunctionRegistry& registry) {
209
22.5k
  using FunctionAdapter = BinaryFunctionAdapter<bool, T, U>;
210
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
211
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLess,
212
22.5k
                                        /*receiver_style=*/false),
213
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessThan<T, U>)));
214
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
215
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreater,
216
22.5k
                                        /*receiver_style=*/false),
217
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterThan<T, U>)));
218
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
219
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kGreaterOrEqual,
220
22.5k
                                        /*receiver_style=*/false),
221
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericGreaterOrEqualTo<T, U>)));
222
22.5k
  CEL_RETURN_IF_ERROR(registry.Register(
223
22.5k
      FunctionAdapter::CreateDescriptor(cel::builtin::kLessOrEqual,
224
22.5k
                                        /*receiver_style=*/false),
225
22.5k
      FunctionAdapter::WrapFunction(&CrossNumericLessOrEqualTo<T, U>)));
226
22.5k
  return absl::OkStatus();
227
22.5k
}
228
229
absl::Status RegisterHeterogeneousComparisonFunctions(
230
22.5k
    cel::FunctionRegistry& registry) {
231
22.5k
  CEL_RETURN_IF_ERROR(
232
22.5k
      (RegisterCrossNumericComparisons<double, int64_t>(registry)));
233
22.5k
  CEL_RETURN_IF_ERROR(
234
22.5k
      (RegisterCrossNumericComparisons<double, uint64_t>(registry)));
235
236
22.5k
  CEL_RETURN_IF_ERROR(
237
22.5k
      (RegisterCrossNumericComparisons<uint64_t, double>(registry)));
238
22.5k
  CEL_RETURN_IF_ERROR(
239
22.5k
      (RegisterCrossNumericComparisons<uint64_t, int64_t>(registry)));
240
241
22.5k
  CEL_RETURN_IF_ERROR(
242
22.5k
      (RegisterCrossNumericComparisons<int64_t, double>(registry)));
243
22.5k
  CEL_RETURN_IF_ERROR(
244
22.5k
      (RegisterCrossNumericComparisons<int64_t, uint64_t>(registry)));
245
246
22.5k
  CEL_RETURN_IF_ERROR(RegisterComparisonFunctionsForType<bool>(registry));
247
22.5k
  CEL_RETURN_IF_ERROR(RegisterComparisonFunctionsForType<int64_t>(registry));
248
22.5k
  CEL_RETURN_IF_ERROR(RegisterComparisonFunctionsForType<uint64_t>(registry));
249
22.5k
  CEL_RETURN_IF_ERROR(RegisterComparisonFunctionsForType<double>(registry));
250
22.5k
  CEL_RETURN_IF_ERROR(
251
22.5k
      RegisterComparisonFunctionsForType<const StringValue&>(registry));
252
22.5k
  CEL_RETURN_IF_ERROR(
253
22.5k
      RegisterComparisonFunctionsForType<const BytesValue&>(registry));
254
22.5k
  CEL_RETURN_IF_ERROR(
255
22.5k
      RegisterComparisonFunctionsForType<absl::Duration>(registry));
256
22.5k
  CEL_RETURN_IF_ERROR(RegisterComparisonFunctionsForType<absl::Time>(registry));
257
258
22.5k
  return absl::OkStatus();
259
22.5k
}
260
}  // namespace
261
262
absl::Status RegisterComparisonFunctions(FunctionRegistry& registry,
263
22.5k
                                         const RuntimeOptions& options) {
264
22.5k
  if (options.enable_heterogeneous_equality) {
265
22.5k
    CEL_RETURN_IF_ERROR(RegisterHeterogeneousComparisonFunctions(registry));
266
22.5k
  } else {
267
0
    CEL_RETURN_IF_ERROR(RegisterHomogenousComparisonFunctions(registry));
268
0
  }
269
22.5k
  return absl::OkStatus();
270
22.5k
}
271
272
}  // namespace cel