24
24
#include < stddef.h>
25
25
26
26
#include < algorithm> // IWYU pragma: keep
27
- #include < memory>
28
27
#include < string>
29
28
#include < type_traits>
30
29
#include < utility>
34
33
#include " absl/types/optional.h"
35
34
#include " absl/types/variant.h"
36
35
37
- #include < grpc/event_engine/event_engine.h>
38
36
#include < grpc/impl/codegen/grpc_types.h>
39
37
40
38
#include " src/core/lib/avl/avl.h"
@@ -54,7 +52,7 @@ namespace grpc_core {
54
52
// ChannelArgs to automatically derive a vtable from a T*.
55
53
// To participate as a pointer, instances should expose the function:
56
54
// // Gets the vtable for this type
57
- // static const grpc_arg_pointer_vtable * VTable();
55
+ // static const grpc_channel_arg_vtable * VTable();
58
56
// // Performs any mutations required for channel args to own a pointer
59
57
// // Only needed if ChannelArgs::Set is to be called with a raw pointer.
60
58
// static void* TakeUnownedPointer(T* p);
@@ -88,32 +86,6 @@ struct ChannelArgTypeTraits<
88
86
};
89
87
};
90
88
91
- // Specialization for shared_ptr
92
- // Incurs an allocation because shared_ptr.release is not a thing.
93
- template <typename T>
94
- struct is_shared_ptr : std::false_type {};
95
- template <typename T>
96
- struct is_shared_ptr <std::shared_ptr<T>> : std::true_type {};
97
- template <typename T>
98
- struct ChannelArgTypeTraits <T,
99
- absl::enable_if_t <is_shared_ptr<T>::value, void >> {
100
- static void * TakeUnownedPointer (T* p) { return p; }
101
- static const grpc_arg_pointer_vtable* VTable () {
102
- static const grpc_arg_pointer_vtable tbl = {
103
- // copy
104
- [](void * p) -> void * { return new T (*static_cast <T*>(p)); },
105
- // destroy
106
- [](void * p) { delete static_cast <T*>(p); },
107
- // compare
108
- [](void * p1, void * p2) {
109
- return QsortCompare (static_cast <const T*>(p1)->get (),
110
- static_cast <const T*>(p2)->get ());
111
- },
112
- };
113
- return &tbl;
114
- };
115
- };
116
-
117
89
// If a type declares some member 'struct RawPointerChannelArgTag {}' then
118
90
// we automatically generate a vtable for it that does not do any ownership
119
91
// management and compares the type by pointer identity.
@@ -136,54 +108,6 @@ struct ChannelArgTypeTraits<T,
136
108
};
137
109
};
138
110
139
- // GetObject support for shared_ptr and RefCountedPtr
140
- template <typename T>
141
- struct WrapInSharedPtr
142
- : std::integral_constant<
143
- bool , std::is_base_of<std::enable_shared_from_this<T>, T>::value> {};
144
- template <>
145
- struct WrapInSharedPtr <grpc_event_engine::experimental::EventEngine>
146
- : std::true_type {};
147
- template <typename T, typename Ignored = void /* for SFINAE */ >
148
- struct GetObjectImpl ;
149
- // std::shared_ptr implementation
150
- template <typename T>
151
- struct GetObjectImpl <T, absl::enable_if_t <WrapInSharedPtr<T>::value, void >> {
152
- using Result = T*;
153
- using ReffedResult = std::shared_ptr<T>;
154
- using StoredType = std::shared_ptr<T>*;
155
- static Result Get (StoredType p) { return p->get (); };
156
- static ReffedResult GetReffed (StoredType p) { return ReffedResult (*p); };
157
- };
158
- // RefCountedPtr
159
- template <typename T>
160
- struct GetObjectImpl <T, absl::enable_if_t <!WrapInSharedPtr<T>::value, void >> {
161
- using Result = T*;
162
- using ReffedResult = RefCountedPtr<T>;
163
- using StoredType = Result;
164
- static Result Get (StoredType p) { return p; };
165
- static ReffedResult GetReffed (StoredType p) {
166
- if (p == nullptr ) return nullptr ;
167
- return p->Ref ();
168
- };
169
- };
170
-
171
- // Provide the canonical name for a type's channel arg key
172
- template <typename T>
173
- struct ChannelArgNameTraits {
174
- static absl::string_view ChannelArgName () { return T::ChannelArgName (); }
175
- };
176
- template <typename T>
177
- struct ChannelArgNameTraits <std::shared_ptr<T>> {
178
- static absl::string_view ChannelArgName () { return T::ChannelArgName (); }
179
- };
180
-
181
- // Specialization for the EventEngine
182
- template <>
183
- struct ChannelArgNameTraits <grpc_event_engine::experimental::EventEngine> {
184
- static absl::string_view ChannelArgName () { return GRPC_ARG_EVENT_ENGINE; }
185
- };
186
-
187
111
class ChannelArgs {
188
112
public:
189
113
class Pointer {
@@ -278,40 +202,19 @@ class ChannelArgs {
278
202
absl::remove_cvref_t <decltype (*store_value)>>::VTable ()));
279
203
}
280
204
template <typename T>
281
- GRPC_MUST_USE_RESULT absl::enable_if_t <
282
- std::is_same<
283
- const grpc_arg_pointer_vtable*,
284
- decltype (ChannelArgTypeTraits<std::shared_ptr<T>>::VTable())>::value,
285
- ChannelArgs>
286
- Set(absl::string_view name, std::shared_ptr<T> value) const {
287
- auto * store_value = new std::shared_ptr<T>(value);
288
- return Set (
289
- name,
290
- Pointer (ChannelArgTypeTraits<std::shared_ptr<T>>::TakeUnownedPointer (
291
- store_value),
292
- ChannelArgTypeTraits<std::shared_ptr<T>>::VTable ()));
293
- }
294
- template <typename T>
295
205
GRPC_MUST_USE_RESULT ChannelArgs SetIfUnset (absl::string_view name, T value) {
296
206
if (Contains (name)) return *this ;
297
207
return Set (name, std::move (value));
298
208
}
299
209
GRPC_MUST_USE_RESULT ChannelArgs Remove (absl::string_view name) const ;
300
210
bool Contains (absl::string_view name) const { return Get (name) != nullptr ; }
301
211
302
- template <typename T>
303
- bool ContainsObject () const {
304
- return Get (ChannelArgNameTraits<T>::ChannelArgName ()) != nullptr ;
305
- }
306
-
307
212
absl::optional<int > GetInt (absl::string_view name) const ;
308
213
absl::optional<absl::string_view> GetString (absl::string_view name) const ;
309
214
void * GetVoidPointer (absl::string_view name) const ;
310
215
template <typename T>
311
- typename GetObjectImpl<T>::StoredType GetPointer (
312
- absl::string_view name) const {
313
- return static_cast <typename GetObjectImpl<T>::StoredType>(
314
- GetVoidPointer (name));
216
+ T* GetPointer (absl::string_view name) const {
217
+ return static_cast <T*>(GetVoidPointer (name));
315
218
}
316
219
absl::optional<Duration > GetDurationFromIntMillis (
317
220
absl::string_view name) const ;
@@ -331,18 +234,14 @@ class ChannelArgs {
331
234
return Set (T::ChannelArgName (), std::move (p));
332
235
}
333
236
template <typename T>
334
- GRPC_MUST_USE_RESULT ChannelArgs SetObject (std::shared_ptr<T> p) const {
335
- return Set (ChannelArgNameTraits<T>::ChannelArgName (), std::move (p));
336
- }
337
- template <typename T>
338
- typename GetObjectImpl<T>::Result GetObject () {
339
- return GetObjectImpl<T>::Get (
340
- GetPointer<T>(ChannelArgNameTraits<T>::ChannelArgName ()));
237
+ T* GetObject () {
238
+ return GetPointer<T>(T::ChannelArgName ());
341
239
}
342
240
template <typename T>
343
- typename GetObjectImpl<T>::ReffedResult GetObjectRef () {
344
- return GetObjectImpl<T>::GetReffed (
345
- GetPointer<T>(ChannelArgNameTraits<T>::ChannelArgName ()));
241
+ RefCountedPtr<T> GetObjectRef () {
242
+ auto * p = GetObject<T>();
243
+ if (p == nullptr ) return nullptr ;
244
+ return p->Ref ();
346
245
}
347
246
348
247
bool operator <(const ChannelArgs& other) const { return args_ < other.args_ ; }
0 commit comments