Fix emulator build error
[platform/framework/web/chromium-efl.git] / base / functional / bind_internal.h
1 // Copyright 2011 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef BASE_FUNCTIONAL_BIND_INTERNAL_H_
6 #define BASE_FUNCTIONAL_BIND_INTERNAL_H_
7
8 #include <stddef.h>
9
10 #include <functional>
11 #include <memory>
12 #include <tuple>
13 #include <type_traits>
14 #include <utility>
15
16 #include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
17 #include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
18 #include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h"
19 #include "base/check.h"
20 #include "base/compiler_specific.h"
21 #include "base/functional/callback_internal.h"
22 #include "base/functional/disallow_unretained.h"
23 #include "base/functional/unretained_traits.h"
24 #include "base/memory/raw_ptr.h"
25 #include "base/memory/raw_ptr_asan_bound_arg_tracker.h"
26 #include "base/memory/raw_ref.h"
27 #include "base/memory/raw_scoped_refptr_mismatch_checker.h"
28 #include "base/memory/weak_ptr.h"
29 #include "base/notreached.h"
30 #include "base/types/always_false.h"
31 #include "build/build_config.h"
32 #include "third_party/abseil-cpp/absl/functional/function_ref.h"
33
34 // See base/functional/callback.h for user documentation.
35 //
36 //
37 // CONCEPTS:
38 //  Functor -- A movable type representing something that should be called.
39 //             All function pointers and Callback<> are functors even if the
40 //             invocation syntax differs.
41 //  RunType -- A function type (as opposed to function _pointer_ type) for
42 //             a Callback<>::Run().  Usually just a convenience typedef.
43 //  (Bound)Args -- A set of types that stores the arguments.
44 //
45 // Types:
46 //  ForceVoidReturn<> -- Helper class for translating function signatures to
47 //                       equivalent forms with a "void" return type.
48 //  FunctorTraits<> -- Type traits used to determine the correct RunType and
49 //                     invocation manner for a Functor.  This is where function
50 //                     signature adapters are applied.
51 //  StorageTraits<> -- Type traits that determine how a bound argument is
52 //                     stored in BindState.
53 //  InvokeHelper<> -- Take a Functor + arguments and actually invokes it.
54 //                    Handle the differing syntaxes needed for WeakPtr<>
55 //                    support.  This is separate from Invoker to avoid creating
56 //                    multiple version of Invoker<>.
57 //  Invoker<> -- Unwraps the curried parameters and executes the Functor.
58 //  BindState<> -- Stores the curried parameters, and is the main entry point
59 //                 into the Bind() system.
60
61 #if BUILDFLAG(IS_WIN)
62 namespace Microsoft {
63 namespace WRL {
64 template <typename>
65 class ComPtr;
66 }  // namespace WRL
67 }  // namespace Microsoft
68 #endif
69
70 namespace base {
71
72 template <typename T>
73 struct IsWeakReceiver;
74
75 template <typename>
76 struct BindUnwrapTraits;
77
78 template <typename Functor, typename BoundArgsTuple, typename SFINAE = void>
79 struct CallbackCancellationTraits;
80
81 template <typename Signature>
82 class FunctionRef;
83
84 namespace unretained_traits {
85
86 // UnretainedWrapper will check and report if pointer is dangling upon
87 // invocation.
88 struct MayNotDangle {};
89 // UnretainedWrapper won't check if pointer is dangling upon invocation. For
90 // extra safety, the receiver must be of type MayBeDangling<>.
91 struct MayDangle {};
92 // UnretainedWrapper won't check if pointer is dangling upon invocation. The
93 // receiver doesn't have to be a raw_ptr<>. This is just a temporary state, to
94 // allow dangling pointers that would otherwise crash if MayNotDangle was used.
95 // It should be replaced ASAP with MayNotDangle (after fixing the dangling
96 // pointers) or with MayDangle if there is really no other way (after making
97 // receivers MayBeDangling<>).
98 struct MayDangleUntriaged {};
99
100 }  // namespace unretained_traits
101
102 namespace internal {
103
104 template <typename Functor, typename SFINAE = void>
105 struct FunctorTraits;
106
107 template <typename T,
108           typename UnretainedTrait,
109           RawPtrTraits PtrTraits = RawPtrTraits::kEmpty>
110 class UnretainedWrapper {
111   // Note that if PtrTraits already includes MayDangle, DanglingRawPtrType
112   // will be identical to `raw_ptr<T, PtrTraits>`.
113   using DanglingRawPtrType = MayBeDangling<T, PtrTraits>;
114
115  public:
116   // We want the getter type to match the receiver parameter that it is passed
117   // into, to minimize `raw_ptr<T>` <-> `T*` conversions. We also would like to
118   // match `StorageType`, but sometimes we can't have both, as shown in
119   // https://docs.google.com/document/d/1dLM34aKqbNBfRdOYxxV_T-zQU4J5wjmXwIBJZr7JvZM/edit
120   // When we can't have both, prefer the former, mostly because
121   // `GetPtrType`=`raw_ptr<T>` would break if e.g. UnretainedWrapper() is
122   // constructed using `char*`, but the receiver is of type `std::string&`.
123   // This is enforced by static_asserts in base::internal::AssertConstructible.
124   using GetPtrType = std::conditional_t<
125       raw_ptr_traits::IsSupportedType<T>::value &&
126           std::is_same_v<UnretainedTrait, unretained_traits::MayDangle>,
127       DanglingRawPtrType,
128       T*>;
129
130   static_assert(TypeSupportsUnretainedV<T>,
131                 "Callback cannot capture an unprotected C++ pointer since this "
132                 "Type is annotated with DISALLOW_UNRETAINED(). Please see "
133                 "base/functional/disallow_unretained.h for alternatives.");
134
135   // Raw pointer makes sense only if there are no PtrTraits. If there are,
136   // it means that a `raw_ptr` is being passed, so use the ctors below instead.
137   template <RawPtrTraits PTraits = PtrTraits,
138             typename = std::enable_if_t<PTraits == RawPtrTraits::kEmpty>>
139   explicit UnretainedWrapper(T* o) : ptr_(o) {}
140
141   // Trick to only instantiate these constructors if they are used. Otherwise,
142   // instantiating UnretainedWrapper with a T that is not supported by
143   // raw_ptr would trigger raw_ptr<T>'s static_assert.
144   template <typename U = T>
145   explicit UnretainedWrapper(const raw_ptr<U, PtrTraits>& o) : ptr_(o) {}
146   template <typename U = T>
147   explicit UnretainedWrapper(raw_ptr<U, PtrTraits>&& o) : ptr_(std::move(o)) {}
148
149   GetPtrType get() const { return GetInternal(ptr_); }
150
151  private:
152   // `ptr_` is either a `raw_ptr` or a regular C++ pointer.
153   template <typename U>
154   static GetPtrType GetInternal(U* ptr) {
155     static_assert(std::is_same_v<T, U>);
156     return ptr;
157   }
158   template <typename U, RawPtrTraits Traits>
159   static GetPtrType GetInternal(const raw_ptr<U, Traits>& ptr) {
160     static_assert(std::is_same_v<T, U>);
161     if constexpr (std::is_same_v<UnretainedTrait,
162                                  unretained_traits::MayNotDangle>) {
163       ptr.ReportIfDangling();
164     }
165     return ptr;
166   }
167
168   // `Unretained()` arguments often dangle by design (a common design pattern
169   // is to manage an object's lifetime inside the callback itself, using
170   // stateful information), so disable direct dangling pointer detection
171   // of `ptr_`.
172   //
173   // If the callback is invoked, dangling pointer detection will be triggered
174   // before invoking the bound functor (unless stated otherwise, see
175   // `UnsafeDangling()` and `UnsafeDanglingUntriaged()`), when retrieving the
176   // pointer value via `get()` above.
177   using StorageType =
178       std::conditional_t<raw_ptr_traits::IsSupportedType<T>::value,
179                          DanglingRawPtrType,
180                          T*>;
181   // Avoid converting between different `raw_ptr` types when calling `get()`.
182   // It is allowable to convert `raw_ptr<T>` -> `T*`, but not in the other
183   // direction. See the comment by `GetPtrType` describing for more details.
184   static_assert(std::is_pointer_v<GetPtrType> ||
185                 std::is_same_v<GetPtrType, StorageType>);
186   StorageType ptr_;
187 };
188
189 // Storage type for std::reference_wrapper so `BindState` can internally store
190 // unprotected references using raw_ref.
191 //
192 // std::reference_wrapper<T> and T& do not work, since the reference lifetime is
193 // not safely protected by MiraclePtr.
194 //
195 // UnretainedWrapper<T> and raw_ptr<T> do not work, since BindUnwrapTraits would
196 // try to pass by T* rather than T&.
197 template <typename T,
198           typename UnretainedTrait,
199           RawPtrTraits PtrTraits = RawPtrTraits::kEmpty>
200 class UnretainedRefWrapper {
201  public:
202   static_assert(
203       TypeSupportsUnretainedV<T>,
204       "Callback cannot capture an unprotected C++ reference since this "
205       "type is annotated with DISALLOW_UNRETAINED(). Please see "
206       "base/functional/disallow_unretained.h for alternatives.");
207
208   // Raw reference makes sense only if there are no PtrTraits. If there are,
209   // it means that a `raw_ref` is being passed, so use the ctors below instead.
210   template <RawPtrTraits PTraits = PtrTraits,
211             typename = std::enable_if_t<PTraits == RawPtrTraits::kEmpty>>
212   explicit UnretainedRefWrapper(T& o) : ref_(o) {}
213
214   // Trick to only instantiate these constructors if they are used. Otherwise,
215   // instantiating UnretainedWrapper with a T that is not supported by
216   // raw_ref would trigger raw_ref<T>'s static_assert.
217   template <typename U = T>
218   explicit UnretainedRefWrapper(const raw_ref<U, PtrTraits>& o) : ref_(o) {}
219   template <typename U = T>
220   explicit UnretainedRefWrapper(raw_ref<U, PtrTraits>&& o)
221       : ref_(std::move(o)) {}
222
223   T& get() const { return GetInternal(ref_); }
224
225  private:
226   // `ref_` is either a `raw_ref` or a regular C++ reference.
227   template <typename U>
228   static T& GetInternal(U& ref) {
229     static_assert(std::is_same_v<T, U>);
230     return ref;
231   }
232   template <typename U, RawPtrTraits Traits>
233   static T& GetInternal(const raw_ref<U, Traits>& ref) {
234     static_assert(std::is_same_v<T, U>);
235     // The ultimate goal is to crash when a callback is invoked with a
236     // dangling pointer. This is checked here. For now, it is configured to
237     // either crash, DumpWithoutCrashing or be ignored. This depends on the
238     // PartitionAllocUnretainedDanglingPtr feature.
239     if constexpr (std::is_same_v<UnretainedTrait,
240                                  unretained_traits::MayNotDangle>) {
241       ref.ReportIfDangling();
242     }
243     // We can't use operator* here, we need to use raw_ptr's GetForExtraction
244     // instead of GetForDereference. If we did use GetForDereference then we'd
245     // crash in ASAN builds on calling a bound callback with a dangling
246     // reference parameter even if that parameter is not used. This could hide
247     // a later unprotected issue that would be reached in release builds.
248     return ref.get();
249   }
250
251   // `Unretained()` arguments often dangle by design (a common design pattern
252   // is to manage an object's lifetime inside the callback itself, using
253   // stateful information), so disable direct dangling pointer detection
254   // of `ref_`.
255   //
256   // If the callback is invoked, dangling pointer detection will be triggered
257   // before invoking the bound functor (unless stated otherwise, see
258   // `UnsafeDangling()` and `UnsafeDanglingUntriaged()`), when retrieving the
259   // pointer value via `get()` above.
260   using StorageType =
261       std::conditional_t<raw_ptr_traits::IsSupportedType<T>::value,
262                          raw_ref<T, DisableDanglingPtrDetection>,
263                          T&>;
264
265   StorageType ref_;
266 };
267
268 // The class is used to wrap `UnretainedRefWrapper` when the latter is used as
269 // a method receiver (a reference on `this` argument). This is needed because
270 // the internal callback mechanism expects the receiver to have the type
271 // `MyClass*` and to have `operator*`.
272 // This is used as storage.
273 template <typename T, typename UnretainedTrait, RawPtrTraits PtrTraits>
274 class UnretainedRefWrapperReceiver {
275  public:
276   // NOLINTNEXTLINE(google-explicit-constructor)
277   UnretainedRefWrapperReceiver(
278       UnretainedRefWrapper<T, UnretainedTrait, PtrTraits>&& obj)
279       : obj_(std::move(obj)) {}
280   // NOLINTNEXTLINE(google-explicit-constructor)
281   T& operator*() const { return obj_.get(); }
282
283  private:
284   UnretainedRefWrapper<T, UnretainedTrait, PtrTraits> obj_;
285 };
286
287 // MethodReceiverStorageType converts the current receiver type to its stored
288 // type. For instance, it converts pointers to `scoped_refptr`, and wraps
289 // `UnretainedRefWrapper` to make it compliant with the internal callback
290 // invocation mechanism.
291 template <typename T>
292 struct MethodReceiverStorageType {
293   using Type =
294       std::conditional_t<IsPointerV<T>, scoped_refptr<RemovePointerT<T>>, T>;
295 };
296
297 template <typename T, typename UnretainedTrait, RawPtrTraits PtrTraits>
298 struct MethodReceiverStorageType<
299     UnretainedRefWrapper<T, UnretainedTrait, PtrTraits>> {
300   // We can't use UnretainedRefWrapper as a receiver directly (see
301   // UnretainedRefWrapperReceiver for why).
302   using Type = UnretainedRefWrapperReceiver<T, UnretainedTrait, PtrTraits>;
303 };
304
305 template <typename T>
306 class RetainedRefWrapper {
307  public:
308   explicit RetainedRefWrapper(T* o) : ptr_(o) {}
309   explicit RetainedRefWrapper(scoped_refptr<T> o) : ptr_(std::move(o)) {}
310   T* get() const { return ptr_.get(); }
311
312  private:
313   scoped_refptr<T> ptr_;
314 };
315
316 template <typename T>
317 struct IgnoreResultHelper {
318   explicit IgnoreResultHelper(T functor) : functor_(std::move(functor)) {}
319   explicit operator bool() const { return !!functor_; }
320
321   T functor_;
322 };
323
324 template <typename T, typename Deleter = std::default_delete<T>>
325 class OwnedWrapper {
326  public:
327   explicit OwnedWrapper(T* o) : ptr_(o) {}
328   explicit OwnedWrapper(std::unique_ptr<T, Deleter>&& ptr)
329       : ptr_(std::move(ptr)) {}
330   T* get() const { return ptr_.get(); }
331
332  private:
333   std::unique_ptr<T, Deleter> ptr_;
334 };
335
336 template <typename T>
337 class OwnedRefWrapper {
338  public:
339   explicit OwnedRefWrapper(const T& t) : t_(t) {}
340   explicit OwnedRefWrapper(T&& t) : t_(std::move(t)) {}
341   T& get() const { return t_; }
342
343  private:
344   mutable T t_;
345 };
346
347 // PassedWrapper is a copyable adapter for a scoper that ignores const.
348 //
349 // It is needed to get around the fact that Bind() takes a const reference to
350 // all its arguments.  Because Bind() takes a const reference to avoid
351 // unnecessary copies, it is incompatible with movable-but-not-copyable
352 // types; doing a destructive "move" of the type into Bind() would violate
353 // the const correctness.
354 //
355 // This conundrum cannot be solved without either C++11 rvalue references or
356 // a O(2^n) blowup of Bind() templates to handle each combination of regular
357 // types and movable-but-not-copyable types.  Thus we introduce a wrapper type
358 // that is copyable to transmit the correct type information down into
359 // BindState<>. Ignoring const in this type makes sense because it is only
360 // created when we are explicitly trying to do a destructive move.
361 //
362 // Two notes:
363 //  1) PassedWrapper supports any type that has a move constructor, however
364 //     the type will need to be specifically allowed in order for it to be
365 //     bound to a Callback. We guard this explicitly at the call of Passed()
366 //     to make for clear errors. Things not given to Passed() will be forwarded
367 //     and stored by value which will not work for general move-only types.
368 //  2) is_valid_ is distinct from NULL because it is valid to bind a "NULL"
369 //     scoper to a Callback and allow the Callback to execute once.
370 template <typename T>
371 class PassedWrapper {
372  public:
373   explicit PassedWrapper(T&& scoper) : scoper_(std::move(scoper)) {}
374   PassedWrapper(PassedWrapper&& other)
375       : is_valid_(other.is_valid_), scoper_(std::move(other.scoper_)) {}
376   T Take() const {
377     CHECK(is_valid_);
378     is_valid_ = false;
379     return std::move(scoper_);
380   }
381
382  private:
383   mutable bool is_valid_ = true;
384   mutable T scoper_;
385 };
386
387 template <typename T>
388 using Unwrapper = BindUnwrapTraits<std::decay_t<T>>;
389
390 template <typename T>
391 decltype(auto) Unwrap(T&& o) {
392   return Unwrapper<T>::Unwrap(std::forward<T>(o));
393 }
394
395 // IsWeakMethod is a helper that determine if we are binding a WeakPtr<> to a
396 // method.  It is used internally by Bind() to select the correct
397 // InvokeHelper that will no-op itself in the event the WeakPtr<> for
398 // the target object is invalidated.
399 //
400 // The first argument should be the type of the object that will be received by
401 // the method.
402 template <bool is_method, typename... Args>
403 struct IsWeakMethod : std::false_type {};
404
405 template <typename T, typename... Args>
406 struct IsWeakMethod<true, T, Args...> : IsWeakReceiver<T> {};
407
408 // Packs a list of types to hold them in a single type.
409 template <typename... Types>
410 struct TypeList {};
411
412 // Used for DropTypeListItem implementation.
413 template <size_t n, typename List>
414 struct DropTypeListItemImpl;
415
416 // Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure.
417 template <size_t n, typename T, typename... List>
418 struct DropTypeListItemImpl<n, TypeList<T, List...>>
419     : DropTypeListItemImpl<n - 1, TypeList<List...>> {};
420
421 template <typename T, typename... List>
422 struct DropTypeListItemImpl<0, TypeList<T, List...>> {
423   using Type = TypeList<T, List...>;
424 };
425
426 template <>
427 struct DropTypeListItemImpl<0, TypeList<>> {
428   using Type = TypeList<>;
429 };
430
431 // A type-level function that drops |n| list item from given TypeList.
432 template <size_t n, typename List>
433 using DropTypeListItem = typename DropTypeListItemImpl<n, List>::Type;
434
435 // Used for TakeTypeListItem implementation.
436 template <size_t n, typename List, typename... Accum>
437 struct TakeTypeListItemImpl;
438
439 // Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure.
440 template <size_t n, typename T, typename... List, typename... Accum>
441 struct TakeTypeListItemImpl<n, TypeList<T, List...>, Accum...>
442     : TakeTypeListItemImpl<n - 1, TypeList<List...>, Accum..., T> {};
443
444 template <typename T, typename... List, typename... Accum>
445 struct TakeTypeListItemImpl<0, TypeList<T, List...>, Accum...> {
446   using Type = TypeList<Accum...>;
447 };
448
449 template <typename... Accum>
450 struct TakeTypeListItemImpl<0, TypeList<>, Accum...> {
451   using Type = TypeList<Accum...>;
452 };
453
454 // A type-level function that takes first |n| list item from given TypeList.
455 // E.g. TakeTypeListItem<3, TypeList<A, B, C, D>> is evaluated to
456 // TypeList<A, B, C>.
457 template <size_t n, typename List>
458 using TakeTypeListItem = typename TakeTypeListItemImpl<n, List>::Type;
459
460 // Used for ConcatTypeLists implementation.
461 template <typename List1, typename List2>
462 struct ConcatTypeListsImpl;
463
464 template <typename... Types1, typename... Types2>
465 struct ConcatTypeListsImpl<TypeList<Types1...>, TypeList<Types2...>> {
466   using Type = TypeList<Types1..., Types2...>;
467 };
468
469 // A type-level function that concats two TypeLists.
470 template <typename List1, typename List2>
471 using ConcatTypeLists = typename ConcatTypeListsImpl<List1, List2>::Type;
472
473 // Used for MakeFunctionType implementation.
474 template <typename R, typename ArgList>
475 struct MakeFunctionTypeImpl;
476
477 template <typename R, typename... Args>
478 struct MakeFunctionTypeImpl<R, TypeList<Args...>> {
479   // MSVC 2013 doesn't support Type Alias of function types.
480   // Revisit this after we update it to newer version.
481   typedef R Type(Args...);
482 };
483
484 // A type-level function that constructs a function type that has |R| as its
485 // return type and has TypeLists items as its arguments.
486 template <typename R, typename ArgList>
487 using MakeFunctionType = typename MakeFunctionTypeImpl<R, ArgList>::Type;
488
489 // Used for ExtractArgs and ExtractReturnType.
490 template <typename Signature>
491 struct ExtractArgsImpl;
492
493 template <typename R, typename... Args>
494 struct ExtractArgsImpl<R(Args...)> {
495   using ReturnType = R;
496   using ArgsList = TypeList<Args...>;
497 };
498
499 // A type-level function that extracts function arguments into a TypeList.
500 // E.g. ExtractArgs<R(A, B, C)> is evaluated to TypeList<A, B, C>.
501 template <typename Signature>
502 using ExtractArgs = typename ExtractArgsImpl<Signature>::ArgsList;
503
504 // A type-level function that extracts the return type of a function.
505 // E.g. ExtractReturnType<R(A, B, C)> is evaluated to R.
506 template <typename Signature>
507 using ExtractReturnType = typename ExtractArgsImpl<Signature>::ReturnType;
508
509 template <typename Callable,
510           typename Signature = decltype(&Callable::operator())>
511 struct ExtractCallableRunTypeImpl;
512
513 template <typename Callable, typename R, typename... Args>
514 struct ExtractCallableRunTypeImpl<Callable, R (Callable::*)(Args...)> {
515   using Type = R(Args...);
516 };
517
518 template <typename Callable, typename R, typename... Args>
519 struct ExtractCallableRunTypeImpl<Callable, R (Callable::*)(Args...) const> {
520   using Type = R(Args...);
521 };
522
523 template <typename Callable, typename R, typename... Args>
524 struct ExtractCallableRunTypeImpl<Callable, R (Callable::*)(Args...) noexcept> {
525   using Type = R(Args...);
526 };
527
528 template <typename Callable, typename R, typename... Args>
529 struct ExtractCallableRunTypeImpl<Callable,
530                                   R (Callable::*)(Args...) const noexcept> {
531   using Type = R(Args...);
532 };
533
534 // Evaluated to RunType of the given callable type.
535 // Example:
536 //   auto f = [](int, char*) { return 0.1; };
537 //   ExtractCallableRunType<decltype(f)>
538 //   is evaluated to
539 //   double(int, char*);
540 template <typename Callable>
541 using ExtractCallableRunType =
542     typename ExtractCallableRunTypeImpl<Callable>::Type;
543
544 // IsCallableObject<Functor> is std::true_type if |Functor| has operator().
545 // Otherwise, it's std::false_type.
546 // Example:
547 //   IsCallableObject<void(*)()>::value is false.
548 //
549 //   struct Foo {};
550 //   IsCallableObject<void(Foo::*)()>::value is false.
551 //
552 //   int i = 0;
553 //   auto f = [i] {};
554 //   IsCallableObject<decltype(f)>::value is false.
555 template <typename Functor, typename SFINAE = void>
556 struct IsCallableObject : std::false_type {};
557
558 template <typename Callable>
559 struct IsCallableObject<Callable, std::void_t<decltype(&Callable::operator())>>
560     : std::true_type {};
561
562 // HasRefCountedTypeAsRawPtr inherits from true_type when any of the |Args| is a
563 // raw pointer to a RefCounted type.
564 template <typename... Ts>
565 struct HasRefCountedTypeAsRawPtr
566     : std::disjunction<NeedsScopedRefptrButGetsRawPtr<Ts>...> {};
567
568 // ForceVoidReturn<>
569 //
570 // Set of templates that support forcing the function return type to void.
571 template <typename Sig>
572 struct ForceVoidReturn;
573
574 template <typename R, typename... Args>
575 struct ForceVoidReturn<R(Args...)> {
576   using RunType = void(Args...);
577 };
578
579 // FunctorTraits<>
580 //
581 // See description at top of file.
582 template <typename Functor, typename SFINAE>
583 struct FunctorTraits;
584
585 // For callable types.
586 // This specialization handles lambdas (captureless and capturing) and functors
587 // with a call operator. Capturing lambdas and stateful functors are explicitly
588 // disallowed by BindImpl().
589 //
590 // Example:
591 //
592 //   // Captureless lambdas are allowed.
593 //   [] { return 42; };
594 //
595 //   // Capturing lambdas are *not* allowed.
596 //   int x;
597 //   [x] { return x; };
598 //
599 //   // Any empty class with operator() is allowed.
600 //   struct Foo {
601 //     void operator()() const {}
602 //     // No non-static member variable and no virtual functions.
603 //   };
604 template <typename Functor>
605 struct FunctorTraits<Functor,
606                      std::enable_if_t<IsCallableObject<Functor>::value>> {
607   using RunType = ExtractCallableRunType<Functor>;
608   static constexpr bool is_method = false;
609   static constexpr bool is_nullable = false;
610   static constexpr bool is_callback = false;
611   static constexpr bool is_stateless = std::is_empty_v<Functor>;
612
613   template <typename RunFunctor, typename... RunArgs>
614   static ExtractReturnType<RunType> Invoke(RunFunctor&& functor,
615                                            RunArgs&&... args) {
616     return std::forward<RunFunctor>(functor)(std::forward<RunArgs>(args)...);
617   }
618 };
619
620 // For functions.
621 template <typename R, typename... Args>
622 struct FunctorTraits<R (*)(Args...)> {
623   using RunType = R(Args...);
624   static constexpr bool is_method = false;
625   static constexpr bool is_nullable = true;
626   static constexpr bool is_callback = false;
627   static constexpr bool is_stateless = true;
628
629   template <typename Function, typename... RunArgs>
630   static R Invoke(Function&& function, RunArgs&&... args) {
631     return std::forward<Function>(function)(std::forward<RunArgs>(args)...);
632   }
633 };
634
635 #if BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS)
636
637 // For functions.
638 template <typename R, typename... Args>
639 struct FunctorTraits<R(__stdcall*)(Args...)> {
640   using RunType = R(Args...);
641   static constexpr bool is_method = false;
642   static constexpr bool is_nullable = true;
643   static constexpr bool is_callback = false;
644   static constexpr bool is_stateless = true;
645
646   template <typename... RunArgs>
647   static R Invoke(R(__stdcall* function)(Args...), RunArgs&&... args) {
648     return function(std::forward<RunArgs>(args)...);
649   }
650 };
651
652 // For functions.
653 template <typename R, typename... Args>
654 struct FunctorTraits<R(__fastcall*)(Args...)> {
655   using RunType = R(Args...);
656   static constexpr bool is_method = false;
657   static constexpr bool is_nullable = true;
658   static constexpr bool is_callback = false;
659   static constexpr bool is_stateless = true;
660
661   template <typename... RunArgs>
662   static R Invoke(R(__fastcall* function)(Args...), RunArgs&&... args) {
663     return function(std::forward<RunArgs>(args)...);
664   }
665 };
666
667 #endif  // BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS)
668
669 #if __OBJC__
670
671 // Support for Objective-C blocks. Blocks can be bound as the compiler will
672 // ensure their lifetimes will be correctly managed.
673
674 #if HAS_FEATURE(objc_arc)
675
676 template <typename R, typename... Args>
677 struct FunctorTraits<R (^)(Args...)> {
678   using RunType = R(Args...);
679   static constexpr bool is_method = false;
680   static constexpr bool is_nullable = true;
681   static constexpr bool is_callback = false;
682   static constexpr bool is_stateless = true;
683
684   template <typename BlockType, typename... RunArgs>
685   static R Invoke(BlockType&& block, RunArgs&&... args) {
686     // According to LLVM documentation (§ 6.3), "local variables of automatic
687     // storage duration do not have precise lifetime." Use objc_precise_lifetime
688     // to ensure that the Objective-C block is not deallocated until it has
689     // finished executing even if the Callback<> is destroyed during the block
690     // execution.
691     // https://clang.llvm.org/docs/AutomaticReferenceCounting.html#precise-lifetime-semantics
692     __attribute__((objc_precise_lifetime)) R (^scoped_block)(Args...) = block;
693     return scoped_block(std::forward<RunArgs>(args)...);
694   }
695 };
696
697 #endif  // HAS_FEATURE(objc_arc)
698 #endif  // __OBJC__
699
700 // For methods.
701 template <typename R, typename Receiver, typename... Args>
702 struct FunctorTraits<R (Receiver::*)(Args...)> {
703   using RunType = R(Receiver*, Args...);
704   static constexpr bool is_method = true;
705   static constexpr bool is_nullable = true;
706   static constexpr bool is_callback = false;
707   static constexpr bool is_stateless = true;
708
709   template <typename Method, typename ReceiverPtr, typename... RunArgs>
710   static R Invoke(Method method,
711                   ReceiverPtr&& receiver_ptr,
712                   RunArgs&&... args) {
713     return ((*receiver_ptr).*method)(std::forward<RunArgs>(args)...);
714   }
715 };
716
717 // For const methods.
718 template <typename R, typename Receiver, typename... Args>
719 struct FunctorTraits<R (Receiver::*)(Args...) const> {
720   using RunType = R(const Receiver*, Args...);
721   static constexpr bool is_method = true;
722   static constexpr bool is_nullable = true;
723   static constexpr bool is_callback = false;
724   static constexpr bool is_stateless = true;
725
726   template <typename Method, typename ReceiverPtr, typename... RunArgs>
727   static R Invoke(Method method,
728                   ReceiverPtr&& receiver_ptr,
729                   RunArgs&&... args) {
730     return ((*receiver_ptr).*method)(std::forward<RunArgs>(args)...);
731   }
732 };
733
734 #if BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS)
735
736 // For __stdcall methods.
737 template <typename R, typename Receiver, typename... Args>
738 struct FunctorTraits<R (__stdcall Receiver::*)(Args...)>
739     : public FunctorTraits<R (Receiver::*)(Args...)> {};
740
741 // For __stdcall const methods.
742 template <typename R, typename Receiver, typename... Args>
743 struct FunctorTraits<R (__stdcall Receiver::*)(Args...) const>
744     : public FunctorTraits<R (Receiver::*)(Args...) const> {};
745
746 #endif  // BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS)
747
748 #ifdef __cpp_noexcept_function_type
749 // noexcept makes a distinct function type in C++17.
750 // I.e. `void(*)()` and `void(*)() noexcept` are same in pre-C++17, and
751 // different in C++17.
752 template <typename R, typename... Args>
753 struct FunctorTraits<R (*)(Args...) noexcept> : FunctorTraits<R (*)(Args...)> {
754 };
755
756 template <typename R, typename Receiver, typename... Args>
757 struct FunctorTraits<R (Receiver::*)(Args...) noexcept>
758     : FunctorTraits<R (Receiver::*)(Args...)> {};
759
760 template <typename R, typename Receiver, typename... Args>
761 struct FunctorTraits<R (Receiver::*)(Args...) const noexcept>
762     : FunctorTraits<R (Receiver::*)(Args...) const> {};
763 #endif
764
765 // For IgnoreResults.
766 template <typename T>
767 struct FunctorTraits<IgnoreResultHelper<T>> : FunctorTraits<T> {
768   using RunType =
769       typename ForceVoidReturn<typename FunctorTraits<T>::RunType>::RunType;
770
771   template <typename IgnoreResultType, typename... RunArgs>
772   static void Invoke(IgnoreResultType&& ignore_result_helper,
773                      RunArgs&&... args) {
774     FunctorTraits<T>::Invoke(
775         std::forward<IgnoreResultType>(ignore_result_helper).functor_,
776         std::forward<RunArgs>(args)...);
777   }
778 };
779
780 // For OnceCallbacks.
781 template <typename R, typename... Args>
782 struct FunctorTraits<OnceCallback<R(Args...)>> {
783   using RunType = R(Args...);
784   static constexpr bool is_method = false;
785   static constexpr bool is_nullable = true;
786   static constexpr bool is_callback = true;
787   static constexpr bool is_stateless = true;
788
789   template <typename CallbackType, typename... RunArgs>
790   static R Invoke(CallbackType&& callback, RunArgs&&... args) {
791     DCHECK(!callback.is_null());
792     return std::forward<CallbackType>(callback).Run(
793         std::forward<RunArgs>(args)...);
794   }
795 };
796
797 // For RepeatingCallbacks.
798 template <typename R, typename... Args>
799 struct FunctorTraits<RepeatingCallback<R(Args...)>> {
800   using RunType = R(Args...);
801   static constexpr bool is_method = false;
802   static constexpr bool is_nullable = true;
803   static constexpr bool is_callback = true;
804   static constexpr bool is_stateless = true;
805
806   template <typename CallbackType, typename... RunArgs>
807   static R Invoke(CallbackType&& callback, RunArgs&&... args) {
808     DCHECK(!callback.is_null());
809     return std::forward<CallbackType>(callback).Run(
810         std::forward<RunArgs>(args)...);
811   }
812 };
813
814 template <typename Functor>
815 using MakeFunctorTraits = FunctorTraits<std::decay_t<Functor>>;
816
817 // StorageTraits<>
818 //
819 // See description at top of file.
820 template <typename T>
821 struct StorageTraits {
822   using Type = T;
823 };
824
825 // For T*, store as UnretainedWrapper<T> for safety, as it internally uses
826 // raw_ptr<T> (when possible).
827 template <typename T>
828 struct StorageTraits<T*> {
829   using Type = UnretainedWrapper<T, unretained_traits::MayNotDangle>;
830 };
831
832 // For raw_ptr<T>, store as UnretainedWrapper<T> for safety. This may seem
833 // contradictory, but this ensures guaranteed protection for the pointer even
834 // during execution of callbacks with parameters of type raw_ptr<T>.
835 template <typename T, RawPtrTraits PtrTraits>
836 struct StorageTraits<raw_ptr<T, PtrTraits>> {
837   using Type = UnretainedWrapper<T, unretained_traits::MayNotDangle, PtrTraits>;
838 };
839
840 // Unwrap std::reference_wrapper and store it in a custom wrapper so that
841 // references are also protected with raw_ptr<T>.
842 template <typename T>
843 struct StorageTraits<std::reference_wrapper<T>> {
844   using Type = UnretainedRefWrapper<T, unretained_traits::MayNotDangle>;
845 };
846
847 template <typename T>
848 using MakeStorageType = typename StorageTraits<std::decay_t<T>>::Type;
849
850 // InvokeHelper<>
851 //
852 // There are 2 logical InvokeHelper<> specializations: normal, WeakCalls.
853 //
854 // The normal type just calls the underlying runnable.
855 //
856 // WeakCalls need special syntax that is applied to the first argument to check
857 // if they should no-op themselves.
858 template <bool is_weak_call, typename ReturnType, size_t... indices>
859 struct InvokeHelper;
860
861 template <typename ReturnType, size_t... indices>
862 struct InvokeHelper<false, ReturnType, indices...> {
863   template <typename Functor, typename BoundArgsTuple, typename... RunArgs>
864   static inline ReturnType MakeItSo(Functor&& functor,
865                                     BoundArgsTuple&& bound,
866                                     RunArgs&&... args) {
867     using Traits = MakeFunctorTraits<Functor>;
868     return Traits::Invoke(
869         std::forward<Functor>(functor),
870         Unwrap(std::get<indices>(std::forward<BoundArgsTuple>(bound)))...,
871         std::forward<RunArgs>(args)...);
872   }
873 };
874
875 template <typename ReturnType, size_t index_target, size_t... index_tail>
876 struct InvokeHelper<true, ReturnType, index_target, index_tail...> {
877   // WeakCalls are only supported for functions with a void return type.
878   // Otherwise, the function result would be undefined if the WeakPtr<>
879   // is invalidated.
880   static_assert(std::is_void_v<ReturnType>,
881                 "weak_ptrs can only bind to methods without return values");
882
883   template <typename Functor, typename BoundArgsTuple, typename... RunArgs>
884   static inline void MakeItSo(Functor&& functor,
885                               BoundArgsTuple&& bound,
886                               RunArgs&&... args) {
887     static_assert(index_target == 0);
888     // Note the validity of the weak pointer should be tested _after_ it is
889     // unwrapped, otherwise it creates a race for weak pointer implementations
890     // that allow cross-thread usage and perform `Lock()` in Unwrap() traits.
891     const auto& target = Unwrap(std::get<0>(bound));
892     if (!target) {
893       return;
894     }
895     using Traits = MakeFunctorTraits<Functor>;
896     Traits::Invoke(
897         std::forward<Functor>(functor), target,
898         Unwrap(std::get<index_tail>(std::forward<BoundArgsTuple>(bound)))...,
899         std::forward<RunArgs>(args)...);
900   }
901 };
902
903 // Invoker<>
904 //
905 // See description at the top of the file.
906 template <typename StorageType, typename UnboundRunType>
907 struct Invoker;
908
909 template <typename StorageType, typename R, typename... UnboundArgs>
910 struct Invoker<StorageType, R(UnboundArgs...)> {
911   static R RunOnce(BindStateBase* base,
912                    PassingType<UnboundArgs>... unbound_args) {
913     // Local references to make debugger stepping easier. If in a debugger,
914     // you really want to warp ahead and step through the
915     // InvokeHelper<>::MakeItSo() call below.
916     StorageType* storage = static_cast<StorageType*>(base);
917     static constexpr size_t num_bound_args =
918         std::tuple_size_v<decltype(storage->bound_args_)>;
919     return RunImpl(std::move(storage->functor_),
920                    std::move(storage->bound_args_),
921                    std::make_index_sequence<num_bound_args>(),
922                    std::forward<UnboundArgs>(unbound_args)...);
923   }
924
925   static R Run(BindStateBase* base, PassingType<UnboundArgs>... unbound_args) {
926     // Local references to make debugger stepping easier. If in a debugger,
927     // you really want to warp ahead and step through the
928     // InvokeHelper<>::MakeItSo() call below.
929     const StorageType* storage = static_cast<StorageType*>(base);
930     static constexpr size_t num_bound_args =
931         std::tuple_size_v<decltype(storage->bound_args_)>;
932     return RunImpl(storage->functor_, storage->bound_args_,
933                    std::make_index_sequence<num_bound_args>(),
934                    std::forward<UnboundArgs>(unbound_args)...);
935   }
936
937  private:
938   template <typename Functor, typename BoundArgsTuple, size_t... indices>
939   static inline R RunImpl(Functor&& functor,
940                           BoundArgsTuple&& bound,
941                           std::index_sequence<indices...> seq,
942                           UnboundArgs&&... unbound_args) {
943     static constexpr bool is_method = MakeFunctorTraits<Functor>::is_method;
944
945     using DecayedArgsTuple = std::decay_t<BoundArgsTuple>;
946
947 #if BUILDFLAG(USE_ASAN_BACKUP_REF_PTR)
948     RawPtrAsanBoundArgTracker raw_ptr_asan_bound_arg_tracker;
949     raw_ptr_asan_bound_arg_tracker.AddArgs(
950         std::get<indices>(std::forward<BoundArgsTuple>(bound))...,
951         std::forward<UnboundArgs>(unbound_args)...);
952 #endif  // BUILDFLAG(USE_ASAN_BACKUP_REF_PTR)
953
954     static constexpr bool is_weak_call =
955         IsWeakMethod<is_method,
956                      std::tuple_element_t<indices, DecayedArgsTuple>...>();
957
958     // Do not `Unwrap()` here, as that immediately triggers dangling pointer
959     // detection. Dangling pointer detection should only be triggered if the
960     // callback is not cancelled, but cancellation status is not determined
961     // until later inside the InvokeHelper::MakeItSo specialization for weak
962     // calls.
963     //
964     // Dangling pointers when invoking a cancelled callback are not considered
965     // a memory safety error because protecting raw pointers usage with weak
966     // receivers (where the weak receiver usually own the pointed objects) is a
967     // common and broadly used pattern in the codebase.
968     return InvokeHelper<is_weak_call, R, indices...>::MakeItSo(
969         std::forward<Functor>(functor), std::forward<BoundArgsTuple>(bound),
970         std::forward<UnboundArgs>(unbound_args)...);
971   }
972 };
973
974 // Extracts necessary type info from Functor and BoundArgs.
975 // Used to implement MakeUnboundRunType, BindOnce and BindRepeating.
976 template <typename Functor, typename... BoundArgs>
977 struct BindTypeHelper {
978   static constexpr size_t num_bounds = sizeof...(BoundArgs);
979   using FunctorTraits = MakeFunctorTraits<Functor>;
980
981   // Example:
982   //   When Functor is `double (Foo::*)(int, const std::string&)`, and BoundArgs
983   //   is a template pack of `Foo*` and `int16_t`:
984   //    - RunType is `double(Foo*, int, const std::string&)`,
985   //    - ReturnType is `double`,
986   //    - RunParamsList is `TypeList<Foo*, int, const std::string&>`,
987   //    - BoundParamsList is `TypeList<Foo*, int>`,
988   //    - UnboundParamsList is `TypeList<const std::string&>`,
989   //    - BoundArgsList is `TypeList<Foo*, int16_t>`,
990   //    - UnboundRunType is `double(const std::string&)`.
991   using RunType = typename FunctorTraits::RunType;
992   using ReturnType = ExtractReturnType<RunType>;
993
994   using RunParamsList = ExtractArgs<RunType>;
995   using BoundParamsList = TakeTypeListItem<num_bounds, RunParamsList>;
996   using UnboundParamsList = DropTypeListItem<num_bounds, RunParamsList>;
997
998   using BoundArgsList = TypeList<BoundArgs...>;
999
1000   using UnboundRunType = MakeFunctionType<ReturnType, UnboundParamsList>;
1001 };
1002
1003 template <typename Functor>
1004 std::enable_if_t<FunctorTraits<Functor>::is_nullable, bool> IsNull(
1005     const Functor& functor) {
1006   return !functor;
1007 }
1008
1009 template <typename Functor>
1010 std::enable_if_t<!FunctorTraits<Functor>::is_nullable, bool> IsNull(
1011     const Functor&) {
1012   return false;
1013 }
1014
1015 // Used by QueryCancellationTraits below.
1016 template <typename Functor, typename BoundArgsTuple, size_t... indices>
1017 bool QueryCancellationTraitsImpl(BindStateBase::CancellationQueryMode mode,
1018                                  const Functor& functor,
1019                                  const BoundArgsTuple& bound_args,
1020                                  std::index_sequence<indices...>) {
1021   switch (mode) {
1022     case BindStateBase::IS_CANCELLED:
1023       return CallbackCancellationTraits<Functor, BoundArgsTuple>::IsCancelled(
1024           functor, std::get<indices>(bound_args)...);
1025     case BindStateBase::MAYBE_VALID:
1026       return CallbackCancellationTraits<Functor, BoundArgsTuple>::MaybeValid(
1027           functor, std::get<indices>(bound_args)...);
1028   }
1029   NOTREACHED();
1030   return false;
1031 }
1032
1033 // Relays |base| to corresponding CallbackCancellationTraits<>::Run(). Returns
1034 // true if the callback |base| represents is canceled.
1035 template <typename BindStateType>
1036 bool QueryCancellationTraits(const BindStateBase* base,
1037                              BindStateBase::CancellationQueryMode mode) {
1038   const BindStateType* storage = static_cast<const BindStateType*>(base);
1039   static constexpr size_t num_bound_args =
1040       std::tuple_size_v<decltype(storage->bound_args_)>;
1041   return QueryCancellationTraitsImpl(
1042       mode, storage->functor_, storage->bound_args_,
1043       std::make_index_sequence<num_bound_args>());
1044 }
1045
1046 // The base case of BanUnconstructedRefCountedReceiver that checks nothing.
1047 template <typename Functor, typename Receiver, typename... Unused>
1048 std::enable_if_t<
1049     !(MakeFunctorTraits<Functor>::is_method &&
1050       IsPointerV<std::decay_t<Receiver>> &&
1051       IsRefCountedType<RemovePointerT<std::decay_t<Receiver>>>::value)>
1052 BanUnconstructedRefCountedReceiver(const Receiver& receiver, Unused&&...) {}
1053
1054 template <typename Functor>
1055 void BanUnconstructedRefCountedReceiver() {}
1056
1057 // Asserts that Callback is not the first owner of a ref-counted receiver.
1058 template <typename Functor, typename Receiver, typename... Unused>
1059 std::enable_if_t<
1060     MakeFunctorTraits<Functor>::is_method &&
1061     IsPointerV<std::decay_t<Receiver>> &&
1062     IsRefCountedType<RemovePointerT<std::decay_t<Receiver>>>::value>
1063 BanUnconstructedRefCountedReceiver(const Receiver& receiver, Unused&&...) {
1064   DCHECK(receiver);
1065
1066   // It's error prone to make the implicit first reference to ref-counted types.
1067   // In the example below, base::BindOnce() would make the implicit first
1068   // reference to the ref-counted Foo. If PostTask() failed or the posted task
1069   // ran fast enough, the newly created instance could be destroyed before `oo`
1070   // makes another reference.
1071   //   Foo::Foo() {
1072   //     base::ThreadPool::PostTask(FROM_HERE, base::BindOnce(&Foo::Bar, this));
1073   //   }
1074   //
1075   //   scoped_refptr<Foo> oo = new Foo();
1076   //
1077   // Hence, base::Bind{Once,Repeating}() refuses to create the first reference
1078   // to ref-counted objects, and DCHECK()s otherwise. As above, that typically
1079   // happens around PostTask() in their constructor, and such objects can be
1080   // destroyed before `new` returns if the task resolves fast enough.
1081   //
1082   // Instead of doing the above, please consider adding a static constructor,
1083   // and keep the first reference alive explicitly.
1084   //   // static
1085   //   scoped_refptr<Foo> Foo::Create() {
1086   //     auto foo = base::WrapRefCounted(new Foo());
1087   //     base::ThreadPool::PostTask(FROM_HERE, base::BindOnce(&Foo::Bar, foo));
1088   //     return foo;
1089   //   }
1090   //
1091   //   Foo::Foo() {}
1092   //
1093   //   scoped_refptr<Foo> oo = Foo::Create();
1094   DCHECK(receiver->HasAtLeastOneRef());
1095 }
1096
1097 // BindState<>
1098 //
1099 // This stores all the state passed into Bind().
1100 template <typename Functor, typename... BoundArgs>
1101 struct BindState final : BindStateBase {
1102   using IsCancellable = std::bool_constant<
1103       CallbackCancellationTraits<Functor,
1104                                  std::tuple<BoundArgs...>>::is_cancellable>;
1105   template <typename ForwardFunctor, typename... ForwardBoundArgs>
1106   static BindState* Create(BindStateBase::InvokeFuncStorage invoke_func,
1107                            ForwardFunctor&& functor,
1108                            ForwardBoundArgs&&... bound_args) {
1109     // Ban ref counted receivers that were not yet fully constructed to avoid
1110     // a common pattern of racy situation.
1111     BanUnconstructedRefCountedReceiver<ForwardFunctor>(bound_args...);
1112
1113     // IsCancellable is std::false_type if
1114     // CallbackCancellationTraits<>::IsCancelled returns always false.
1115     // Otherwise, it's std::true_type.
1116     return new BindState(IsCancellable{}, invoke_func,
1117                          std::forward<ForwardFunctor>(functor),
1118                          std::forward<ForwardBoundArgs>(bound_args)...);
1119   }
1120
1121   Functor functor_;
1122   std::tuple<BoundArgs...> bound_args_;
1123
1124  private:
1125   static constexpr bool is_nested_callback =
1126       MakeFunctorTraits<Functor>::is_callback;
1127
1128   template <typename ForwardFunctor, typename... ForwardBoundArgs>
1129   explicit BindState(std::true_type,
1130                      BindStateBase::InvokeFuncStorage invoke_func,
1131                      ForwardFunctor&& functor,
1132                      ForwardBoundArgs&&... bound_args)
1133       : BindStateBase(invoke_func,
1134                       &Destroy,
1135                       &QueryCancellationTraits<BindState>),
1136         functor_(std::forward<ForwardFunctor>(functor)),
1137         bound_args_(std::forward<ForwardBoundArgs>(bound_args)...) {
1138     // We check the validity of nested callbacks (e.g., Bind(callback, ...)) in
1139     // release builds to avoid null pointers from ending up in posted tasks,
1140     // causing hard-to-diagnose crashes. Ideally we'd do this for all functors
1141     // here, but that would have a large binary size impact.
1142     if (is_nested_callback) {
1143       CHECK(!IsNull(functor_));
1144     } else {
1145       DCHECK(!IsNull(functor_));
1146     }
1147   }
1148
1149   template <typename ForwardFunctor, typename... ForwardBoundArgs>
1150   explicit BindState(std::false_type,
1151                      BindStateBase::InvokeFuncStorage invoke_func,
1152                      ForwardFunctor&& functor,
1153                      ForwardBoundArgs&&... bound_args)
1154       : BindStateBase(invoke_func, &Destroy),
1155         functor_(std::forward<ForwardFunctor>(functor)),
1156         bound_args_(std::forward<ForwardBoundArgs>(bound_args)...) {
1157     // See above for CHECK/DCHECK rationale.
1158     if (is_nested_callback) {
1159       CHECK(!IsNull(functor_));
1160     } else {
1161       DCHECK(!IsNull(functor_));
1162     }
1163   }
1164
1165   ~BindState() = default;
1166
1167   static void Destroy(const BindStateBase* self) {
1168     delete static_cast<const BindState*>(self);
1169   }
1170 };
1171
1172 // Used to implement MakeBindStateType.
1173 template <bool is_method, typename Functor, typename... BoundArgs>
1174 struct MakeBindStateTypeImpl;
1175
1176 template <typename Functor, typename... BoundArgs>
1177 struct MakeBindStateTypeImpl<false, Functor, BoundArgs...> {
1178   static_assert(!HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>::value,
1179                 "A parameter is a refcounted type and needs scoped_refptr.");
1180   using Type = BindState<std::decay_t<Functor>, MakeStorageType<BoundArgs>...>;
1181 };
1182
1183 template <typename Functor>
1184 struct MakeBindStateTypeImpl<true, Functor> {
1185   using Type = BindState<std::decay_t<Functor>>;
1186 };
1187
1188 template <typename Functor, typename Receiver, typename... BoundArgs>
1189 struct MakeBindStateTypeImpl<true, Functor, Receiver, BoundArgs...> {
1190  private:
1191   using DecayedReceiver = std::decay_t<Receiver>;
1192   static_assert(!std::is_array_v<std::remove_reference_t<Receiver>>,
1193                 "First bound argument to a method cannot be an array.");
1194   static_assert(
1195       !IsRawRefV<DecayedReceiver>,
1196       "Receivers may not be raw_ref<T>. If using a raw_ref<T> here is safe"
1197       " and has no lifetime concerns, use base::Unretained() and document why"
1198       " it's safe.");
1199   static_assert(
1200       !IsPointerV<DecayedReceiver> ||
1201           IsRefCountedType<RemovePointerT<DecayedReceiver>>::value,
1202       "Receivers may not be raw pointers. If using a raw pointer here is safe"
1203       " and has no lifetime concerns, use base::Unretained() and document why"
1204       " it's safe.");
1205
1206   static_assert(!HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>::value,
1207                 "A parameter is a refcounted type and needs scoped_refptr.");
1208
1209   using ReceiverStorageType =
1210       typename MethodReceiverStorageType<DecayedReceiver>::Type;
1211
1212  public:
1213   using Type = BindState<std::decay_t<Functor>,
1214                          ReceiverStorageType,
1215                          MakeStorageType<BoundArgs>...>;
1216 };
1217
1218 template <typename Functor, typename... BoundArgs>
1219 using MakeBindStateType =
1220     typename MakeBindStateTypeImpl<MakeFunctorTraits<Functor>::is_method,
1221                                    Functor,
1222                                    BoundArgs...>::Type;
1223
1224 // Returns a RunType of bound functor.
1225 // E.g. MakeUnboundRunType<R(A, B, C), A, B> is evaluated to R(C).
1226 template <typename Functor, typename... BoundArgs>
1227 using MakeUnboundRunType =
1228     typename BindTypeHelper<Functor, BoundArgs...>::UnboundRunType;
1229
1230 // The implementation of TransformToUnwrappedType below.
1231 template <bool is_once, typename T>
1232 struct TransformToUnwrappedTypeImpl;
1233
1234 template <typename T>
1235 struct TransformToUnwrappedTypeImpl<true, T> {
1236   using StoredType = std::decay_t<T>;
1237   using ForwardType = StoredType&&;
1238   using Unwrapped = decltype(Unwrap(std::declval<ForwardType>()));
1239 };
1240
1241 template <typename T>
1242 struct TransformToUnwrappedTypeImpl<false, T> {
1243   using StoredType = std::decay_t<T>;
1244   using ForwardType = const StoredType&;
1245   using Unwrapped = decltype(Unwrap(std::declval<ForwardType>()));
1246 };
1247
1248 // Transform |T| into `Unwrapped` type, which is passed to the target function.
1249 // Example:
1250 //   In is_once == true case,
1251 //     `int&&` -> `int&&`,
1252 //     `const int&` -> `int&&`,
1253 //     `OwnedWrapper<int>&` -> `int*&&`.
1254 //   In is_once == false case,
1255 //     `int&&` -> `const int&`,
1256 //     `const int&` -> `const int&`,
1257 //     `OwnedWrapper<int>&` -> `int* const &`.
1258 template <bool is_once, typename T>
1259 using TransformToUnwrappedType =
1260     typename TransformToUnwrappedTypeImpl<is_once, T>::Unwrapped;
1261
1262 // Transforms |Args| into `Unwrapped` types, and packs them into a TypeList.
1263 // If |is_method| is true, tries to dereference the first argument to support
1264 // smart pointers.
1265 template <bool is_once, bool is_method, typename... Args>
1266 struct MakeUnwrappedTypeListImpl {
1267   using Type = TypeList<TransformToUnwrappedType<is_once, Args>...>;
1268 };
1269
1270 // Performs special handling for this pointers.
1271 // Example:
1272 //   int* -> int*,
1273 //   std::unique_ptr<int> -> int*.
1274 template <bool is_once, typename Receiver, typename... Args>
1275 struct MakeUnwrappedTypeListImpl<is_once, true, Receiver, Args...> {
1276   using ReceiverStorageType =
1277       typename MethodReceiverStorageType<std::decay_t<Receiver>>::Type;
1278   using UnwrappedReceiver =
1279       TransformToUnwrappedType<is_once, ReceiverStorageType>;
1280   using Type = TypeList<decltype(&*std::declval<UnwrappedReceiver>()),
1281                         TransformToUnwrappedType<is_once, Args>...>;
1282 };
1283
1284 template <bool is_once, bool is_method, typename... Args>
1285 using MakeUnwrappedTypeList =
1286     typename MakeUnwrappedTypeListImpl<is_once, is_method, Args...>::Type;
1287
1288 // IsOnceCallback<T> is a std::true_type if |T| is a OnceCallback.
1289 template <typename T>
1290 struct IsOnceCallback : std::false_type {};
1291
1292 template <typename Signature>
1293 struct IsOnceCallback<OnceCallback<Signature>> : std::true_type {};
1294
1295 // IsUnretainedMayDangle is true if StorageType is of type
1296 // `UnretainedWrapper<T, unretained_traits::MayDangle, PtrTraits>.
1297 // Note that it is false for unretained_traits::MayDangleUntriaged.
1298 template <typename StorageType>
1299 inline constexpr bool IsUnretainedMayDangle = false;
1300 template <typename T, RawPtrTraits PtrTraits>
1301 inline constexpr bool IsUnretainedMayDangle<
1302     UnretainedWrapper<T, unretained_traits::MayDangle, PtrTraits>> = true;
1303
1304 // UnretainedAndRawPtrHaveCompatibleTraits is true if StorageType is of type
1305 // `UnretainedWrapper<T, unretained_traits::MayDangle, PtrTraits1>` and
1306 // FunctionParamType is of type `raw_ptr<T, PtrTraits2>`, and the former's
1307 // ::GetPtrType is the same type as the latter.
1308 template <typename StorageType, typename FunctionParamType>
1309 inline constexpr bool UnretainedAndRawPtrHaveCompatibleTraits = false;
1310 template <typename T,
1311           RawPtrTraits PtrTraitsInUnretained,
1312           RawPtrTraits PtrTraitsInReceiver>
1313 inline constexpr bool UnretainedAndRawPtrHaveCompatibleTraits<
1314     UnretainedWrapper<T, unretained_traits::MayDangle, PtrTraitsInUnretained>,
1315     raw_ptr<T, PtrTraitsInReceiver>> =
1316     std::is_same_v<
1317         typename UnretainedWrapper<T,
1318                                    unretained_traits::MayDangle,
1319                                    PtrTraitsInUnretained>::GetPtrType,
1320         raw_ptr<T, PtrTraitsInReceiver>>;
1321
1322 // Helpers to make error messages slightly more readable.
1323 template <int i>
1324 struct BindArgument {
1325   template <typename ForwardingType>
1326   struct ForwardedAs {
1327     template <typename FunctorParamType>
1328     struct ToParamWithType {
1329       static constexpr bool kNotARawPtr = !IsRawPtrV<FunctorParamType>;
1330
1331       static constexpr bool kCanBeForwardedToBoundFunctor =
1332           std::is_convertible_v<ForwardingType, FunctorParamType>;
1333
1334       // If the bound type can't be forwarded then test if `FunctorParamType` is
1335       // a non-const lvalue reference and a reference to the unwrapped type
1336       // *could* have been successfully forwarded.
1337       static constexpr bool kNonConstRefParamMustBeWrapped =
1338           kCanBeForwardedToBoundFunctor ||
1339           !(std::is_lvalue_reference_v<FunctorParamType> &&
1340             !std::is_const_v<std::remove_reference_t<FunctorParamType>> &&
1341             std::is_convertible_v<std::decay_t<ForwardingType>&,
1342                                   FunctorParamType>);
1343
1344       // Note that this intentionally drops the const qualifier from
1345       // `ForwardingType`, to test if it *could* have been successfully
1346       // forwarded if `Passed()` had been used.
1347       static constexpr bool kMoveOnlyTypeMustUseBasePassed =
1348           kCanBeForwardedToBoundFunctor ||
1349           !std::is_convertible_v<std::decay_t<ForwardingType>&&,
1350                                  FunctorParamType>;
1351     };
1352   };
1353
1354   template <typename BoundAsType>
1355   struct BoundAs {
1356     template <typename StorageType>
1357     struct StoredAs {
1358       static constexpr bool kBindArgumentCanBeCaptured =
1359           std::is_constructible_v<StorageType, BoundAsType>;
1360       // Note that this intentionally drops the const qualifier from
1361       // `BoundAsType`, to test if it *could* have been successfully bound if
1362       // `std::move()` had been used.
1363       static constexpr bool kMoveOnlyTypeMustUseStdMove =
1364           kBindArgumentCanBeCaptured ||
1365           !std::is_constructible_v<StorageType, std::decay_t<BoundAsType>&&>;
1366     };
1367   };
1368
1369   template <typename FunctionParamType>
1370   struct ToParamWithType {
1371     template <typename StorageType>
1372     struct StoredAs {
1373       template <bool is_method>
1374       // true if we are handling `this` parameter.
1375       static constexpr bool kParamIsThisPointer = is_method && i == 0;
1376       // true if the current parameter is of type `raw_ptr<T>` with
1377       // `RawPtrTraits::kMayDangle` trait (e.g. `MayBeDangling<T>`).
1378       static constexpr bool kParamIsDanglingRawPtr =
1379           IsRawPtrMayDangleV<FunctionParamType>;
1380       // true if the bound parameter is of type
1381       // `UnretainedWrapper<T, unretained_traits::MayDangle, PtrTraits>`.
1382       static constexpr bool kBoundPtrMayDangle =
1383           IsUnretainedMayDangle<StorageType>;
1384       // true if bound parameter of type `UnretainedWrapper` and parameter of
1385       // type `raw_ptr` have compatible `RawPtrTraits`.
1386       static constexpr bool kMayBeDanglingTraitsCorrectness =
1387           UnretainedAndRawPtrHaveCompatibleTraits<StorageType,
1388                                                   FunctionParamType>;
1389       // true if the receiver argument **must** be of type `MayBeDangling<T>`.
1390       static constexpr bool kMayBeDanglingMustBeUsed =
1391           kBoundPtrMayDangle && kParamIsDanglingRawPtr;
1392
1393       // true iff:
1394       // - bound parameter is of type
1395       //   `UnretainedWrapper<T, unretained_traits::MayDangle, PtrTraits>`
1396       // - the receiving argument is of type `MayBeDangling<T>`
1397       template <bool is_method>
1398       static constexpr bool kMayBeDanglingPtrPassedCorrectly =
1399           kParamIsThisPointer<is_method> ||
1400           kBoundPtrMayDangle == kParamIsDanglingRawPtr;
1401
1402       // true if:
1403       // - MayBeDangling<T> must not be used as receiver parameter.
1404       // OR
1405       // - MayBeDangling<T> must be used as receiver parameter and its traits
1406       // are matching Unretained traits.
1407       static constexpr bool kUnsafeDanglingAndMayBeDanglingHaveMatchingTraits =
1408           !kMayBeDanglingMustBeUsed || kMayBeDanglingTraitsCorrectness;
1409     };
1410   };
1411 };
1412
1413 // Helper to assert that parameter |i| of type |Arg| can be bound, which means:
1414 // - |Arg| can be retained internally as |Storage|.
1415 // - |Arg| can be forwarded as |Unwrapped| to |Param|.
1416 template <int i,
1417           bool is_method,
1418           typename Arg,
1419           typename Storage,
1420           typename Unwrapped,
1421           typename Param>
1422 struct AssertConstructible {
1423  private:
1424   // We forbid callbacks to use raw_ptr as a parameter. However, we allow
1425   // MayBeDangling<T> iff the callback argument was created using
1426   // `base::UnsafeDangling`.
1427   static_assert(
1428       BindArgument<i>::template ForwardedAs<
1429           Unwrapped>::template ToParamWithType<Param>::kNotARawPtr ||
1430           BindArgument<i>::template ToParamWithType<Param>::template StoredAs<
1431               Storage>::kMayBeDanglingMustBeUsed,
1432       "base::Bind() target functor has a parameter of type raw_ptr<T>. "
1433       "raw_ptr<T> should not be used for function parameters, please use T* or "
1434       "T& instead.");
1435
1436   // A bound functor must take a dangling pointer argument (e.g. bound using the
1437   // UnsafeDangling helper) as a MayBeDangling<T>, to make it clear that the
1438   // pointee's lifetime must be externally validated before using it. For
1439   // methods, exempt a bound receiver (i.e. the this pointer) as it is not
1440   // passed as a regular function argument.
1441   static_assert(
1442       BindArgument<i>::template ToParamWithType<Param>::template StoredAs<
1443           Storage>::template kMayBeDanglingPtrPassedCorrectly<is_method>,
1444       "base::UnsafeDangling() pointers must be received by functors with "
1445       "MayBeDangling<T> as parameter.");
1446
1447   static_assert(
1448       BindArgument<i>::template ToParamWithType<Param>::template StoredAs<
1449           Storage>::kUnsafeDanglingAndMayBeDanglingHaveMatchingTraits,
1450       "MayBeDangling<T> parameter must receive the same RawPtrTraits as the "
1451       "one passed to the corresponding base::UnsafeDangling() call.");
1452
1453   // With `BindRepeating`, there are two decision points for how to handle a
1454   // move-only type:
1455   //
1456   // 1. Whether the move-only argument should be moved into the internal
1457   //    `BindState`. Either `std::move()` or `Passed` is sufficient to trigger
1458   //    move-only semantics.
1459   // 2. Whether or not the bound, move-only argument should be moved to the
1460   //    bound functor when invoked. When the argument is bound with `Passed`,
1461   //    invoking the callback will destructively move the bound, move-only
1462   //    argument to the bound functor. In contrast, if the argument is bound
1463   //    with `std::move()`, `RepeatingCallback` will attempt to call the bound
1464   //    functor with a constant reference to the bound, move-only argument. This
1465   //    will fail if the bound functor accepts that argument by value, since the
1466   //    argument cannot be copied. It is this latter case that this
1467   //    static_assert aims to catch.
1468   //
1469   // In contrast, `BindOnce()` only has one decision point. Once a move-only
1470   // type is captured by value into the internal `BindState`, the bound,
1471   // move-only argument will always be moved to the functor when invoked.
1472   // Failure to use std::move will simply fail the `kMoveOnlyTypeMustUseStdMove`
1473   // assert below instead.
1474   //
1475   // Note: `Passed()` is a legacy of supporting move-only types when repeating
1476   // callbacks were the only callback type. A `RepeatingCallback` with a
1477   // `Passed()` argument is really a `OnceCallback` and should eventually be
1478   // migrated.
1479   static_assert(
1480       BindArgument<i>::template ForwardedAs<Unwrapped>::
1481           template ToParamWithType<Param>::kMoveOnlyTypeMustUseBasePassed,
1482       "base::BindRepeating() argument is a move-only type. Use base::Passed() "
1483       "instead of std::move() to transfer ownership from the callback to the "
1484       "bound functor.");
1485   static_assert(
1486       BindArgument<i>::template ForwardedAs<Unwrapped>::
1487           template ToParamWithType<Param>::kNonConstRefParamMustBeWrapped,
1488       "Bound argument for non-const reference parameter must be wrapped in "
1489       "std::ref() or base::OwnedRef().");
1490   static_assert(
1491       BindArgument<i>::template ForwardedAs<Unwrapped>::
1492           template ToParamWithType<Param>::kCanBeForwardedToBoundFunctor,
1493       "Type mismatch between bound argument and bound functor's parameter.");
1494
1495   static_assert(BindArgument<i>::template BoundAs<Arg>::template StoredAs<
1496                     Storage>::kMoveOnlyTypeMustUseStdMove,
1497                 "Attempting to bind a move-only type. Use std::move() to "
1498                 "transfer ownership to the created callback.");
1499   // In practice, this static_assert should be quite rare as the storage type
1500   // is deduced from the arguments passed to `BindOnce()`/`BindRepeating()`.
1501   static_assert(
1502       BindArgument<i>::template BoundAs<Arg>::template StoredAs<
1503           Storage>::kBindArgumentCanBeCaptured,
1504       "Cannot capture argument: is the argument copyable or movable?");
1505 };
1506
1507 // Takes three same-length TypeLists, and applies AssertConstructible for each
1508 // triples.
1509 template <bool is_method,
1510           typename Index,
1511           typename Args,
1512           typename UnwrappedTypeList,
1513           typename ParamsList>
1514 struct AssertBindArgsValidity;
1515
1516 template <bool is_method,
1517           size_t... Ns,
1518           typename... Args,
1519           typename... Unwrapped,
1520           typename... Params>
1521 struct AssertBindArgsValidity<is_method,
1522                               std::index_sequence<Ns...>,
1523                               TypeList<Args...>,
1524                               TypeList<Unwrapped...>,
1525                               TypeList<Params...>>
1526     : AssertConstructible<Ns,
1527                           is_method,
1528                           Args,
1529                           std::decay_t<Args>,
1530                           Unwrapped,
1531                           Params>... {
1532   static constexpr bool ok = true;
1533 };
1534
1535 template <typename T>
1536 struct AssertBindArgIsNotBasePassed : public std::true_type {};
1537
1538 template <typename T>
1539 struct AssertBindArgIsNotBasePassed<PassedWrapper<T>> : public std::false_type {
1540 };
1541
1542 template <template <typename> class CallbackT,
1543           typename Functor,
1544           typename... Args>
1545 decltype(auto) BindImpl(Functor&& functor, Args&&... args) {
1546   // This block checks if each |args| matches to the corresponding params of the
1547   // target function. This check does not affect the behavior of Bind, but its
1548   // error message should be more readable.
1549   static constexpr bool kIsOnce = IsOnceCallback<CallbackT<void()>>::value;
1550   using Helper = BindTypeHelper<Functor, Args...>;
1551   using FunctorTraits = typename Helper::FunctorTraits;
1552   using BoundArgsList = typename Helper::BoundArgsList;
1553   using UnwrappedArgsList =
1554       MakeUnwrappedTypeList<kIsOnce, FunctorTraits::is_method, Args&&...>;
1555   using BoundParamsList = typename Helper::BoundParamsList;
1556   static_assert(
1557       MakeFunctorTraits<Functor>::is_stateless,
1558       "Capturing lambdas and stateful lambdas are intentionally not supported. "
1559       "Please use base::Bind{Once,Repeating} directly to bind arguments.");
1560   static_assert(
1561       AssertBindArgsValidity<FunctorTraits::is_method,
1562                              std::make_index_sequence<Helper::num_bounds>,
1563                              BoundArgsList, UnwrappedArgsList,
1564                              BoundParamsList>::ok,
1565       "The bound args need to be convertible to the target params.");
1566
1567   using BindState = MakeBindStateType<Functor, Args...>;
1568   using UnboundRunType = MakeUnboundRunType<Functor, Args...>;
1569   using Invoker = Invoker<BindState, UnboundRunType>;
1570   using CallbackType = CallbackT<UnboundRunType>;
1571
1572   // Store the invoke func into PolymorphicInvoke before casting it to
1573   // InvokeFuncStorage, so that we can ensure its type matches to
1574   // PolymorphicInvoke, to which CallbackType will cast back.
1575   using PolymorphicInvoke = typename CallbackType::PolymorphicInvoke;
1576   PolymorphicInvoke invoke_func;
1577   if constexpr (kIsOnce) {
1578     invoke_func = Invoker::RunOnce;
1579   } else {
1580     invoke_func = Invoker::Run;
1581   }
1582
1583   using InvokeFuncStorage = BindStateBase::InvokeFuncStorage;
1584   return CallbackType(BindState::Create(
1585       reinterpret_cast<InvokeFuncStorage>(invoke_func),
1586       std::forward<Functor>(functor), std::forward<Args>(args)...));
1587 }
1588
1589 // Special cases for binding to a base::{Once, Repeating}Callback without extra
1590 // bound arguments. We CHECK() the validity of callback to guard against null
1591 // pointers accidentally ending up in posted tasks, causing hard-to-debug
1592 // crashes.
1593 template <template <typename> class CallbackT,
1594           typename Signature,
1595           std::enable_if_t<std::is_same_v<CallbackT<Signature>,
1596                                           OnceCallback<Signature>>>* = nullptr>
1597 OnceCallback<Signature> BindImpl(OnceCallback<Signature> callback) {
1598   CHECK(callback);
1599   return callback;
1600 }
1601
1602 template <template <typename> class CallbackT,
1603           typename Signature,
1604           std::enable_if_t<std::is_same_v<CallbackT<Signature>,
1605                                           OnceCallback<Signature>>>* = nullptr>
1606 OnceCallback<Signature> BindImpl(RepeatingCallback<Signature> callback) {
1607   CHECK(callback);
1608   return callback;
1609 }
1610
1611 template <template <typename> class CallbackT,
1612           typename Signature,
1613           std::enable_if_t<std::is_same_v<CallbackT<Signature>,
1614                                           RepeatingCallback<Signature>>>* =
1615               nullptr>
1616 RepeatingCallback<Signature> BindImpl(RepeatingCallback<Signature> callback) {
1617   CHECK(callback);
1618   return callback;
1619 }
1620
1621 template <template <typename> class CallbackT, typename Signature>
1622 auto BindImpl(absl::FunctionRef<Signature>, ...) {
1623   static_assert(
1624       AlwaysFalse<Signature>,
1625       "base::Bind{Once,Repeating} require strong ownership: non-owning "
1626       "function references may not bound as the functor due to potential "
1627       "lifetime issues.");
1628   return nullptr;
1629 }
1630
1631 template <template <typename> class CallbackT, typename Signature>
1632 auto BindImpl(FunctionRef<Signature>, ...) {
1633   static_assert(
1634       AlwaysFalse<Signature>,
1635       "base::Bind{Once,Repeating} require strong ownership: non-owning "
1636       "function references may not bound as the functor due to potential "
1637       "lifetime issues.");
1638   return nullptr;
1639 }
1640
1641 }  // namespace internal
1642
1643 // An injection point to control |this| pointer behavior on a method invocation.
1644 // If IsWeakReceiver<> is true_type for |T| and |T| is used for a receiver of a
1645 // method, base::Bind cancels the method invocation if the receiver is tested as
1646 // false.
1647 // E.g. Foo::bar() is not called:
1648 //   struct Foo : base::SupportsWeakPtr<Foo> {
1649 //     void bar() {}
1650 //   };
1651 //
1652 //   WeakPtr<Foo> oo = nullptr;
1653 //   base::BindOnce(&Foo::bar, oo).Run();
1654 template <typename T>
1655 struct IsWeakReceiver : std::false_type {};
1656
1657 template <typename T>
1658 struct IsWeakReceiver<std::reference_wrapper<T>> : IsWeakReceiver<T> {};
1659
1660 template <typename T>
1661 struct IsWeakReceiver<WeakPtr<T>> : std::true_type {};
1662
1663 // An injection point to control how objects are checked for maybe validity,
1664 // which is an optimistic thread-safe check for full validity.
1665 template <typename>
1666 struct MaybeValidTraits {
1667   template <typename T>
1668   static bool MaybeValid(const T& o) {
1669     return o.MaybeValid();
1670   }
1671 };
1672
1673 // An injection point to control how bound objects passed to the target
1674 // function. BindUnwrapTraits<>::Unwrap() is called for each bound objects right
1675 // before the target function is invoked.
1676 template <typename>
1677 struct BindUnwrapTraits {
1678   template <typename T>
1679   static T&& Unwrap(T&& o) {
1680     return std::forward<T>(o);
1681   }
1682 };
1683
1684 template <typename T, typename UnretainedTrait, RawPtrTraits PtrTraits>
1685 struct BindUnwrapTraits<
1686     internal::UnretainedWrapper<T, UnretainedTrait, PtrTraits>> {
1687   static auto Unwrap(
1688       const internal::UnretainedWrapper<T, UnretainedTrait, PtrTraits>& o) {
1689     return o.get();
1690   }
1691 };
1692
1693 template <typename T, typename UnretainedTrait, RawPtrTraits PtrTraits>
1694 struct BindUnwrapTraits<
1695     internal::UnretainedRefWrapper<T, UnretainedTrait, PtrTraits>> {
1696   static T& Unwrap(
1697       const internal::UnretainedRefWrapper<T, UnretainedTrait, PtrTraits>& o) {
1698     return o.get();
1699   }
1700 };
1701
1702 template <typename T>
1703 struct BindUnwrapTraits<internal::RetainedRefWrapper<T>> {
1704   static T* Unwrap(const internal::RetainedRefWrapper<T>& o) { return o.get(); }
1705 };
1706
1707 template <typename T, typename Deleter>
1708 struct BindUnwrapTraits<internal::OwnedWrapper<T, Deleter>> {
1709   static T* Unwrap(const internal::OwnedWrapper<T, Deleter>& o) {
1710     return o.get();
1711   }
1712 };
1713
1714 template <typename T>
1715 struct BindUnwrapTraits<internal::OwnedRefWrapper<T>> {
1716   static T& Unwrap(const internal::OwnedRefWrapper<T>& o) { return o.get(); }
1717 };
1718
1719 template <typename T>
1720 struct BindUnwrapTraits<internal::PassedWrapper<T>> {
1721   static T Unwrap(const internal::PassedWrapper<T>& o) { return o.Take(); }
1722 };
1723
1724 #if BUILDFLAG(IS_WIN)
1725 template <typename T>
1726 struct BindUnwrapTraits<Microsoft::WRL::ComPtr<T>> {
1727   static T* Unwrap(const Microsoft::WRL::ComPtr<T>& ptr) { return ptr.Get(); }
1728 };
1729 #endif
1730
1731 // CallbackCancellationTraits allows customization of Callback's cancellation
1732 // semantics. By default, callbacks are not cancellable. A specialization should
1733 // set is_cancellable = true and implement an IsCancelled() that returns if the
1734 // callback should be cancelled.
1735 template <typename Functor, typename BoundArgsTuple, typename SFINAE>
1736 struct CallbackCancellationTraits {
1737   static constexpr bool is_cancellable = false;
1738 };
1739
1740 // Specialization for method bound to weak pointer receiver.
1741 template <typename Functor, typename... BoundArgs>
1742 struct CallbackCancellationTraits<
1743     Functor,
1744     std::tuple<BoundArgs...>,
1745     std::enable_if_t<
1746         internal::IsWeakMethod<internal::FunctorTraits<Functor>::is_method,
1747                                BoundArgs...>::value>> {
1748   static constexpr bool is_cancellable = true;
1749
1750   template <typename Receiver, typename... Args>
1751   static bool IsCancelled(const Functor&,
1752                           const Receiver& receiver,
1753                           const Args&...) {
1754     return !receiver;
1755   }
1756
1757   template <typename Receiver, typename... Args>
1758   static bool MaybeValid(const Functor&,
1759                          const Receiver& receiver,
1760                          const Args&...) {
1761     return MaybeValidTraits<Receiver>::MaybeValid(receiver);
1762   }
1763 };
1764
1765 // Specialization for a nested bind.
1766 template <typename Signature, typename... BoundArgs>
1767 struct CallbackCancellationTraits<OnceCallback<Signature>,
1768                                   std::tuple<BoundArgs...>> {
1769   static constexpr bool is_cancellable = true;
1770
1771   template <typename Functor>
1772   static bool IsCancelled(const Functor& functor, const BoundArgs&...) {
1773     return functor.IsCancelled();
1774   }
1775
1776   template <typename Functor>
1777   static bool MaybeValid(const Functor& functor, const BoundArgs&...) {
1778     return MaybeValidTraits<Functor>::MaybeValid(functor);
1779   }
1780 };
1781
1782 template <typename Signature, typename... BoundArgs>
1783 struct CallbackCancellationTraits<RepeatingCallback<Signature>,
1784                                   std::tuple<BoundArgs...>> {
1785   static constexpr bool is_cancellable = true;
1786
1787   template <typename Functor>
1788   static bool IsCancelled(const Functor& functor, const BoundArgs&...) {
1789     return functor.IsCancelled();
1790   }
1791
1792   template <typename Functor>
1793   static bool MaybeValid(const Functor& functor, const BoundArgs&...) {
1794     return MaybeValidTraits<Functor>::MaybeValid(functor);
1795   }
1796 };
1797
1798 }  // namespace base
1799
1800 #endif  // BASE_FUNCTIONAL_BIND_INTERNAL_H_