// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_FUNCTIONAL_UNRETAINED_TRAITS_H_ #define BASE_FUNCTIONAL_UNRETAINED_TRAITS_H_ #include <concepts> #include <type_traits> #include "base/types/is_complete.h" #include "build/build_config.h" // Various opaque system types that should still be usable with the base // callback system. Please keep sorted. #define BASE_INTERNAL_LIST_OF_SAFE_FOR_UNRETAINED … #define BASE_INTERNAL_SAFE_FOR_UNRETAINED … BASE_INTERNAL_LIST_OF_SAFE_FOR_UNRETAINED #undef BASE_INTERNAL_SAFE_FOR_UNRETAINED namespace base::internal { SameAsAny; // Determining whether a type can be used with `Unretained()` requires that `T` // be completely defined. Some system types have an intentionally opaque and // incomplete representation, but should still be usable with `Unretained()`. SafeIncompleteTypeForUnretained; // Customization point. Specialize this to be `false` for types as needed. In // general, you should not need this; types that do not support `Unretained()` // should use `DISALLOW_UNRETAINED()`. However, this is necessary when // disallowing `Unretained()` for types that do not (or cannot) use //base. kCustomizeSupportsUnretained; DisallowsUnretained; template <typename T> struct SupportsUnretainedImpl { … }; // Not meant for general use: merely checking this concept will // `static_assert()` if the type does not support unretained. This is meant only // for use inside the `Bind()` machinery, which wants that assertion. // // If we ever want to use this concept outside that machinery, we'll need to not // only move the "allows unretained" assertion from above to the `Bind()` side, // we'll also need to hoist or duplicate the incomplete type check there (and // not assert in that case) so it does not fire multiple `static_assert()`s for // incomplete types. SupportsUnretained; } // namespace base::internal #endif // BASE_FUNCTIONAL_UNRETAINED_TRAITS_H_