| 164 | // EqualityProvider is used for equality among members of container types. |
| 165 | template <class EqualityProvider> |
| 166 | absl::optional<bool> HomogenousCelValueEqual(const CelValue& t1, |
| 167 | const CelValue& t2) { |
| 168 | if (t1.type() != t2.type()) { |
| 169 | return absl::nullopt; |
| 170 | } |
| 171 | switch (t1.type()) { |
| 172 | case Kind::kNullType: |
| 173 | return Equal<CelValue::NullType>(CelValue::NullType(), |
| 174 | CelValue::NullType()); |
| 175 | case Kind::kBool: |
| 176 | return Equal<bool>(t1.BoolOrDie(), t2.BoolOrDie()); |
| 177 | case Kind::kInt64: |
| 178 | return Equal<int64_t>(t1.Int64OrDie(), t2.Int64OrDie()); |
| 179 | case Kind::kUint64: |
| 180 | return Equal<uint64_t>(t1.Uint64OrDie(), t2.Uint64OrDie()); |
| 181 | case Kind::kDouble: |
| 182 | return Equal<double>(t1.DoubleOrDie(), t2.DoubleOrDie()); |
| 183 | case Kind::kString: |
| 184 | return Equal<CelValue::StringHolder>(t1.StringOrDie(), t2.StringOrDie()); |
| 185 | case Kind::kBytes: |
| 186 | return Equal<CelValue::BytesHolder>(t1.BytesOrDie(), t2.BytesOrDie()); |
| 187 | case Kind::kDuration: |
| 188 | return Equal<absl::Duration>(t1.DurationOrDie(), t2.DurationOrDie()); |
| 189 | case Kind::kTimestamp: |
| 190 | return Equal<absl::Time>(t1.TimestampOrDie(), t2.TimestampOrDie()); |
| 191 | case Kind::kList: |
| 192 | return ListEqual<EqualityProvider>(t1.ListOrDie(), t2.ListOrDie()); |
| 193 | case Kind::kMap: |
| 194 | return MapEqual<EqualityProvider>(t1.MapOrDie(), t2.MapOrDie()); |
| 195 | case Kind::kCelType: |
| 196 | return Equal<CelValue::CelTypeHolder>(t1.CelTypeOrDie(), |
| 197 | t2.CelTypeOrDie()); |
| 198 | default: |
| 199 | break; |
| 200 | } |
| 201 | return absl::nullopt; |
| 202 | } |
| 203 | |
| 204 | absl::optional<bool> HeterogeneousEqualProvider::operator()( |
| 205 | const CelValue& lhs, const CelValue& rhs) const { |
nothing calls this directly
no test coverage detected