diff options
author | Cronet Mainline Eng <cronet-mainline-eng+copybara@google.com> | 2023-03-22 02:58:49 -0800 |
---|---|---|
committer | Patrick Rohr <prohr@google.com> | 2023-03-22 04:40:18 -0700 |
commit | c175721cfcc03e339122be17d569239df9762b2b (patch) | |
tree | 64fed42a909067904ef77b573e554a172241bdfe /base/scoped_observation_traits.h | |
parent | 26b17131b27be4b84fc089d96dcc1998e686ecf9 (diff) | |
download | cronet-c175721cfcc03e339122be17d569239df9762b2b.tar.gz |
Import Cronet version 110.0.5481.154
Project import generated by Copybara.
FolderOrigin-RevId: /tmp/copybara-origin/src
Test: none
Change-Id: I534a69efa61b40fdc95613bce5bc5dd9a432f646
Diffstat (limited to 'base/scoped_observation_traits.h')
-rw-r--r-- | base/scoped_observation_traits.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/base/scoped_observation_traits.h b/base/scoped_observation_traits.h new file mode 100644 index 000000000..7201f2658 --- /dev/null +++ b/base/scoped_observation_traits.h @@ -0,0 +1,78 @@ +// 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_SCOPED_OBSERVATION_TRAITS_H_ +#define BASE_SCOPED_OBSERVATION_TRAITS_H_ + +#include "base/scoped_observation_traits_internal.h" + +namespace base { + +// `ScopedObservationTraits` is used to control the behavior of +// `ScopedObservation` on sources without AddObserver()/RemoveObserver() +// methods. +// +// The implementation of `ScopedObservation<Source, Observer>` will look up the +// most specialized version of `ScopedObservationTraits<Source, Observer>` and +// use the corresponding `Traits::AddObserver` and `Traits::RemoveObserver`. +// +// The default specialization takes care of any Source that exposes +// `AddObserver(Observer*)` and `RemoveObserver(Observer*)` methods -- if that's +// the case, then `ScopedObservation<Source, Observer>` will work out of the +// box. +// +// However, if your `CustomSource` features custom method names -- say, +// `AddFoo(FooObserver*)` and `RemoveFoo(FooObserver*)`, then you'll have to +// define a new traits specialization like this: +// +// `custom_source.h`: +// #include "base/scoped_observation_traits.h" +// +// class FooObserver; +// class CustomSource { +// public: +// void AddFoo(FooObserver*); +// void RemoveFoo(FooObserver*); +// }; +// +// namespace base { +// +// template<> +// struct ScopedObservationTraits<CustomSource, FooObserver> { +// static void AddObserver(CustomSource* source, +// FooObserver* observer) { +// source->AddFoo(observer); +// } +// static void RemoveObserver(CustomSource* source, +// FooObserver* observer) { +// source->RemoveFoo(observer); +// } +// }; +// +// } // namespace base +// +// `some_important_file.cc`: +// // Now this works out of the box. +// base::ScopedObservation<CustomSource, FooObserver> obs... +// + +template <class Source, class Observer> +struct ScopedObservationTraits { + static_assert(internal::HasAddAndRemoveObserverMethods<Source, Observer>, + "The given Source is missing " + "AddObserver(Observer*) and/or RemoveObserver(Observer*) " + "methods. Please provide a custom specialization of " + "ScopedObservationTraits<> for this Source/Observer pair."); + + static void AddObserver(Source* source, Observer* observer) { + source->AddObserver(observer); + } + static void RemoveObserver(Source* source, Observer* observer) { + source->RemoveObserver(observer); + } +}; + +} // namespace base + +#endif // BASE_SCOPED_OBSERVATION_TRAITS_H_ |