Coverage Report

Created: 2026-09-03 06:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/proc/self/cwd/common/arena.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_ARENA_H_
16
#define THIRD_PARTY_CEL_CPP_COMMON_ARENA_H_
17
18
#include <type_traits>
19
#include <utility>
20
21
#include "absl/base/nullability.h"
22
#include "google/protobuf/arena.h"
23
24
namespace cel {
25
26
template <typename T = void>
27
struct ArenaTraits;
28
29
namespace common_internal {
30
31
template <typename T>
32
struct AssertArenaType : std::false_type {
33
  static_assert(!std::is_void_v<T>, "T must not be void");
34
  static_assert(!std::is_reference_v<T>, "T must not be a reference");
35
  static_assert(!std::is_volatile_v<T>, "T must not be volatile qualified");
36
  static_assert(!std::is_const_v<T>, "T must not be const qualified");
37
  static_assert(!std::is_array_v<T>, "T must not be an array");
38
};
39
40
template <typename, typename = void>
41
struct ArenaTraitsConstructible {
42
  using type = std::false_type;
43
};
44
45
template <typename T>
46
struct ArenaTraitsConstructible<
47
    T, std::void_t<decltype(ArenaTraits<T>::constructible)>> {
48
  using type = typename ArenaTraits<T>::constructible;
49
};
50
51
template <typename T>
52
std::enable_if_t<google::protobuf::Arena::is_arena_constructable<T>::value,
53
                 google::protobuf::Arena* absl_nullable>
54
GetArena(const T* absl_nullable ptr) {
55
  return ptr != nullptr ? ptr->GetArena() : nullptr;
56
}
57
58
template <typename T>
59
std::enable_if_t<!google::protobuf::Arena::is_arena_constructable<T>::value,
60
                 google::protobuf::Arena* absl_nullable>
61
GetArena([[maybe_unused]] const T* absl_nullable ptr) {
62
  return nullptr;
63
}
64
65
template <typename, typename = void>
66
struct HasArenaTraitsTriviallyDestructible : std::false_type {};
67
68
template <typename T>
69
struct HasArenaTraitsTriviallyDestructible<
70
    T, std::void_t<decltype(ArenaTraits<T>::trivially_destructible(
71
           std::declval<const T&>()))>> : std::true_type {};
72
73
}  // namespace common_internal
74
75
template <>
76
struct ArenaTraits<void> {
77
  template <typename U>
78
  using constructible = std::disjunction<
79
      typename common_internal::AssertArenaType<U>::type,
80
      typename common_internal::ArenaTraitsConstructible<U>::type>;
81
82
  template <typename U>
83
  using always_trivially_destructible =
84
      std::disjunction<typename common_internal::AssertArenaType<U>::type,
85
                       std::is_trivially_destructible<U>>;
86
87
  template <typename U>
88
23.8M
  static bool trivially_destructible(const U& obj) {
89
23.8M
    static_assert(!std::is_void_v<U>, "T must not be void");
90
23.8M
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
23.8M
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
23.8M
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
23.8M
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
23.8M
    if constexpr (always_trivially_destructible<U>()) {
96
11.3M
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
12.5M
                             U>::value) {
101
12.5M
      return ArenaTraits<U>::trivially_destructible(obj);
102
12.5M
    } else {
103
0
      return false;
104
0
    }
105
23.8M
  }
Unexecuted instantiation: bool cel::ArenaTraits<void>::trivially_destructible<std::__1::monostate>(std::__1::monostate const&)
Unexecuted instantiation: bool cel::ArenaTraits<void>::trivially_destructible<cel::ParsedMessageValue>(cel::ParsedMessageValue const&)
bool cel::ArenaTraits<void>::trivially_destructible<cel::NullValue>(cel::NullValue const&)
Line
Count
Source
88
1.28k
  static bool trivially_destructible(const U& obj) {
89
1.28k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
1.28k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
1.28k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
1.28k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
1.28k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
1.28k
    if constexpr (always_trivially_destructible<U>()) {
96
1.28k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
1.28k
  }
bool cel::ArenaTraits<void>::trivially_destructible<cel::BoolValue>(cel::BoolValue const&)
Line
Count
Source
88
405k
  static bool trivially_destructible(const U& obj) {
89
405k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
405k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
405k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
405k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
405k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
405k
    if constexpr (always_trivially_destructible<U>()) {
96
405k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
405k
  }
bool cel::ArenaTraits<void>::trivially_destructible<cel::IntValue>(cel::IntValue const&)
Line
Count
Source
88
10.3M
  static bool trivially_destructible(const U& obj) {
89
10.3M
    static_assert(!std::is_void_v<U>, "T must not be void");
90
10.3M
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
10.3M
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
10.3M
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
10.3M
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
10.3M
    if constexpr (always_trivially_destructible<U>()) {
96
10.3M
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
10.3M
  }
bool cel::ArenaTraits<void>::trivially_destructible<cel::UintValue>(cel::UintValue const&)
Line
Count
Source
88
87.7k
  static bool trivially_destructible(const U& obj) {
89
87.7k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
87.7k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
87.7k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
87.7k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
87.7k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
87.7k
    if constexpr (always_trivially_destructible<U>()) {
96
87.7k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
87.7k
  }
bool cel::ArenaTraits<void>::trivially_destructible<cel::DoubleValue>(cel::DoubleValue const&)
Line
Count
Source
88
251k
  static bool trivially_destructible(const U& obj) {
89
251k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
251k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
251k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
251k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
251k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
251k
    if constexpr (always_trivially_destructible<U>()) {
96
251k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
251k
  }
bool cel::ArenaTraits<void>::trivially_destructible<cel::DurationValue>(cel::DurationValue const&)
Line
Count
Source
88
10.0k
  static bool trivially_destructible(const U& obj) {
89
10.0k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
10.0k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
10.0k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
10.0k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
10.0k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
10.0k
    if constexpr (always_trivially_destructible<U>()) {
96
10.0k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
10.0k
  }
bool cel::ArenaTraits<void>::trivially_destructible<cel::TimestampValue>(cel::TimestampValue const&)
Line
Count
Source
88
829
  static bool trivially_destructible(const U& obj) {
89
829
    static_assert(!std::is_void_v<U>, "T must not be void");
90
829
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
829
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
829
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
829
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
829
    if constexpr (always_trivially_destructible<U>()) {
96
829
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
829
  }
bool cel::ArenaTraits<void>::trivially_destructible<cel::TypeValue>(cel::TypeValue const&)
Line
Count
Source
88
3.16k
  static bool trivially_destructible(const U& obj) {
89
3.16k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
3.16k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
3.16k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
3.16k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
3.16k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
3.16k
    if constexpr (always_trivially_destructible<U>()) {
96
3.16k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
3.16k
  }
Unexecuted instantiation: bool cel::ArenaTraits<void>::trivially_destructible<cel::common_internal::LegacyListValue>(cel::common_internal::LegacyListValue const&)
bool cel::ArenaTraits<void>::trivially_destructible<cel::ParsedJsonListValue>(cel::ParsedJsonListValue const&)
Line
Count
Source
88
1.27k
  static bool trivially_destructible(const U& obj) {
89
1.27k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
1.27k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
1.27k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
1.27k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
1.27k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
1.27k
    if constexpr (always_trivially_destructible<U>()) {
96
1.27k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
1.27k
  }
Unexecuted instantiation: bool cel::ArenaTraits<void>::trivially_destructible<cel::ParsedRepeatedFieldValue>(cel::ParsedRepeatedFieldValue const&)
bool cel::ArenaTraits<void>::trivially_destructible<cel::CustomListValue>(cel::CustomListValue const&)
Line
Count
Source
88
19.1k
  static bool trivially_destructible(const U& obj) {
89
19.1k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
19.1k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
19.1k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
19.1k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
19.1k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
19.1k
    if constexpr (always_trivially_destructible<U>()) {
96
19.1k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
19.1k
  }
Unexecuted instantiation: bool cel::ArenaTraits<void>::trivially_destructible<cel::common_internal::LegacyMapValue>(cel::common_internal::LegacyMapValue const&)
bool cel::ArenaTraits<void>::trivially_destructible<cel::ParsedJsonMapValue>(cel::ParsedJsonMapValue const&)
Line
Count
Source
88
1.20k
  static bool trivially_destructible(const U& obj) {
89
1.20k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
1.20k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
1.20k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
1.20k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
1.20k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
1.20k
    if constexpr (always_trivially_destructible<U>()) {
96
1.20k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
1.20k
  }
Unexecuted instantiation: bool cel::ArenaTraits<void>::trivially_destructible<cel::ParsedMapFieldValue>(cel::ParsedMapFieldValue const&)
bool cel::ArenaTraits<void>::trivially_destructible<cel::CustomMapValue>(cel::CustomMapValue const&)
Line
Count
Source
88
138k
  static bool trivially_destructible(const U& obj) {
89
138k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
138k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
138k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
138k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
138k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
138k
    if constexpr (always_trivially_destructible<U>()) {
96
138k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
138k
  }
bool cel::ArenaTraits<void>::trivially_destructible<cel::common_internal::LegacyStructValue>(cel::common_internal::LegacyStructValue const&)
Line
Count
Source
88
19.1k
  static bool trivially_destructible(const U& obj) {
89
19.1k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
19.1k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
19.1k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
19.1k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
19.1k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
19.1k
    if constexpr (always_trivially_destructible<U>()) {
96
19.1k
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
                             U>::value) {
101
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
19.1k
  }
Unexecuted instantiation: bool cel::ArenaTraits<void>::trivially_destructible<cel::CustomStructValue>(cel::CustomStructValue const&)
Unexecuted instantiation: bool cel::ArenaTraits<void>::trivially_destructible<cel::OpaqueValue>(cel::OpaqueValue const&)
bool cel::ArenaTraits<void>::trivially_destructible<cel::BytesValue>(cel::BytesValue const&)
Line
Count
Source
88
9.41k
  static bool trivially_destructible(const U& obj) {
89
9.41k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
9.41k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
9.41k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
9.41k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
9.41k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
    if constexpr (always_trivially_destructible<U>()) {
96
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
9.41k
                             U>::value) {
101
9.41k
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
9.41k
  }
bool cel::ArenaTraits<void>::trivially_destructible<cel::StringValue>(cel::StringValue const&)
Line
Count
Source
88
379k
  static bool trivially_destructible(const U& obj) {
89
379k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
379k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
379k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
379k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
379k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
    if constexpr (always_trivially_destructible<U>()) {
96
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
379k
                             U>::value) {
101
379k
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
379k
  }
Unexecuted instantiation: bool cel::ArenaTraits<void>::trivially_destructible<cel::ErrorValue>(cel::ErrorValue const&)
Unexecuted instantiation: bool cel::ArenaTraits<void>::trivially_destructible<cel::UnknownValue>(cel::UnknownValue const&)
bool cel::ArenaTraits<void>::trivially_destructible<cel::common_internal::ByteString>(cel::common_internal::ByteString const&)
Line
Count
Source
88
455k
  static bool trivially_destructible(const U& obj) {
89
455k
    static_assert(!std::is_void_v<U>, "T must not be void");
90
455k
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
455k
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
455k
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
455k
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
    if constexpr (always_trivially_destructible<U>()) {
96
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
455k
                             U>::value) {
101
455k
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
455k
  }
bool cel::ArenaTraits<void>::trivially_destructible<cel::Value>(cel::Value const&)
Line
Count
Source
88
11.7M
  static bool trivially_destructible(const U& obj) {
89
11.7M
    static_assert(!std::is_void_v<U>, "T must not be void");
90
11.7M
    static_assert(!std::is_reference_v<U>, "T must not be a reference");
91
11.7M
    static_assert(!std::is_volatile_v<U>, "T must not be volatile qualified");
92
11.7M
    static_assert(!std::is_const_v<U>, "T must not be const qualified");
93
11.7M
    static_assert(!std::is_array_v<U>, "T must not be an array");
94
95
    if constexpr (always_trivially_destructible<U>()) {
96
      return true;
97
    } else if constexpr (google::protobuf::Arena::is_destructor_skippable<U>::value) {
98
      return obj.GetArena() != nullptr;
99
    } else if constexpr (common_internal::HasArenaTraitsTriviallyDestructible<
100
11.7M
                             U>::value) {
101
11.7M
      return ArenaTraits<U>::trivially_destructible(obj);
102
    } else {
103
      return false;
104
    }
105
11.7M
  }
106
};
107
108
}  // namespace cel
109
110
#endif  // THIRD_PARTY_CEL_CPP_COMMON_ARENA_H_