summaryrefslogtreecommitdiff
path: root/base/scoped_observation_traits.h
diff options
context:
space:
mode:
authorCronet Mainline Eng <cronet-mainline-eng+copybara@google.com>2023-03-22 02:58:49 -0800
committerPatrick Rohr <prohr@google.com>2023-03-22 04:40:18 -0700
commitc175721cfcc03e339122be17d569239df9762b2b (patch)
tree64fed42a909067904ef77b573e554a172241bdfe /base/scoped_observation_traits.h
parent26b17131b27be4b84fc089d96dcc1998e686ecf9 (diff)
downloadcronet-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.h78
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_