1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
diff --git a/src/google/protobuf/arena.h b/src/google/protobuf/arena.h
index 545fd5126..55b1ec83b 100644
--- a/src/google/protobuf/arena.h
+++ b/src/google/protobuf/arena.h
@@ -32,7 +32,6 @@ using type_info = ::type_info;
#include "absl/base/optimization.h"
#include "absl/base/prefetch.h"
#include "absl/log/absl_check.h"
-#include "absl/utility/internal/if_constexpr.h"
#include "google/protobuf/arena_align.h"
#include "google/protobuf/arena_allocation_policy.h"
#include "google/protobuf/port.h"
@@ -214,41 +213,31 @@ class PROTOBUF_EXPORT PROTOBUF_ALIGNAS(8) Arena final {
// otherwise, returns a heap-allocated object.
template <typename T, typename... Args>
PROTOBUF_NDEBUG_INLINE static T* Create(Arena* arena, Args&&... args) {
- return absl::utility_internal::IfConstexprElse<
- is_arena_constructable<T>::value>(
- // Arena-constructable
- [arena](auto&&... args) {
- using Type = std::remove_const_t<T>;
-#ifdef __cpp_if_constexpr
- // DefaultConstruct/CopyConstruct are optimized for messages, which
- // are both arena constructible and destructor skippable and they
- // assume much. Don't use these functions unless the invariants
- // hold.
- if constexpr (is_destructor_skippable<T>::value) {
- constexpr auto construct_type = GetConstructType<T, Args&&...>();
- // We delegate to DefaultConstruct/CopyConstruct where appropriate
- // because protobuf generated classes have external templates for
- // these functions for code size reasons. When `if constexpr` is not
- // available always use the fallback.
- if constexpr (construct_type == ConstructType::kDefault) {
- return static_cast<Type*>(DefaultConstruct<Type>(arena));
- } else if constexpr (construct_type == ConstructType::kCopy) {
- return static_cast<Type*>(CopyConstruct<Type>(arena, &args...));
- }
- }
-#endif
- return CreateArenaCompatible<Type>(arena,
- std::forward<Args>(args)...);
- },
- // Non arena-constructable
- [arena](auto&&... args) {
- if (PROTOBUF_PREDICT_FALSE(arena == nullptr)) {
- return new T(std::forward<Args>(args)...);
- }
- return new (arena->AllocateInternal<T>())
- T(std::forward<Args>(args)...);
- },
- std::forward<Args>(args)...);
+ if constexpr (is_arena_constructable<T>::value) {
+ using Type = std::remove_const_t<T>;
+ // DefaultConstruct/CopyConstruct are optimized for messages, which
+ // are both arena constructible and destructor skippable and they
+ // assume much. Don't use these functions unless the invariants
+ // hold.
+ if constexpr (is_destructor_skippable<T>::value) {
+ constexpr auto construct_type = GetConstructType<T, Args&&...>();
+ // We delegate to DefaultConstruct/CopyConstruct where appropriate
+ // because protobuf generated classes have external templates for
+ // these functions for code size reasons. When `if constexpr` is not
+ // available always use the fallback.
+ if constexpr (construct_type == ConstructType::kDefault) {
+ return static_cast<Type*>(DefaultConstruct<Type>(arena));
+ } else if constexpr (construct_type == ConstructType::kCopy) {
+ return static_cast<Type*>(CopyConstruct<Type>(arena, &args...));
+ }
+ }
+ return CreateArenaCompatible<Type>(arena, std::forward<Args>(args)...);
+ } else {
+ if (ABSL_PREDICT_FALSE(arena == nullptr)) {
+ return new T(std::forward<Args>(args)...);
+ }
+ return new (arena->AllocateInternal<T>()) T(std::forward<Args>(args)...);
+ }
}
// API to delete any objects not on an arena. This can be used to safely
diff --git a/cmake/abseil-cpp.cmake b/cmake/abseil-cpp.cmake
index 1b64affa5..c45fb222a 100644
--- a/cmake/abseil-cpp.cmake
+++ b/cmake/abseil-cpp.cmake
@@ -72,7 +72,6 @@ else()
absl::flat_hash_set
absl::function_ref
absl::hash
- absl::if_constexpr
absl::layout
absl::log_initialize
absl::log_globals
|