summaryrefslogtreecommitdiffstats
path: root/mojo/public/cpp/bindings/weak_interface_ptr_set.h
diff options
context:
space:
mode:
Diffstat (limited to 'mojo/public/cpp/bindings/weak_interface_ptr_set.h')
-rw-r--r--mojo/public/cpp/bindings/weak_interface_ptr_set.h88
1 files changed, 88 insertions, 0 deletions
diff --git a/mojo/public/cpp/bindings/weak_interface_ptr_set.h b/mojo/public/cpp/bindings/weak_interface_ptr_set.h
new file mode 100644
index 0000000..f92a5ed
--- /dev/null
+++ b/mojo/public/cpp/bindings/weak_interface_ptr_set.h
@@ -0,0 +1,88 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MOJO_PUBLIC_CPP_BINDINGS_WEAK_INTERFACE_PTR_SET_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_WEAK_INTERFACE_PTR_SET_H_
+
+#include <utility>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "mojo/public/cpp/bindings/interface_ptr.h"
+
+namespace mojo {
+
+template <typename Interface>
+class WeakInterfacePtr;
+
+template <typename Interface>
+class WeakInterfacePtrSet {
+ public:
+ WeakInterfacePtrSet() {}
+ ~WeakInterfacePtrSet() { CloseAll(); }
+
+ void AddInterfacePtr(InterfacePtr<Interface> ptr) {
+ auto weak_interface_ptr = new WeakInterfacePtr<Interface>(std::move(ptr));
+ ptrs_.push_back(weak_interface_ptr->GetWeakPtr());
+ ClearNullInterfacePtrs();
+ }
+
+ template <typename FunctionType>
+ void ForAllPtrs(FunctionType function) {
+ for (const auto& it : ptrs_) {
+ if (it)
+ function(it->get());
+ }
+ ClearNullInterfacePtrs();
+ }
+
+ void CloseAll() {
+ for (const auto& it : ptrs_) {
+ if (it)
+ it->Close();
+ }
+ ptrs_.clear();
+ }
+
+ private:
+ using WPWIPI = base::WeakPtr<WeakInterfacePtr<Interface>>;
+
+ void ClearNullInterfacePtrs() {
+ ptrs_.erase(
+ std::remove_if(ptrs_.begin(), ptrs_.end(),
+ [](const WPWIPI& p) { return p.get() == nullptr; }),
+ ptrs_.end());
+ }
+
+ std::vector<WPWIPI> ptrs_;
+};
+
+template <typename Interface>
+class WeakInterfacePtr {
+ public:
+ explicit WeakInterfacePtr(InterfacePtr<Interface> ptr)
+ : ptr_(std::move(ptr)), weak_ptr_factory_(this) {
+ ptr_.set_connection_error_handler([this]() { delete this; });
+ }
+ ~WeakInterfacePtr() {}
+
+ void Close() { ptr_.reset(); }
+
+ Interface* get() { return ptr_.get(); }
+
+ base::WeakPtr<WeakInterfacePtr> GetWeakPtr() {
+ return weak_ptr_factory_.GetWeakPtr();
+ }
+
+ private:
+ InterfacePtr<Interface> ptr_;
+ base::WeakPtrFactory<WeakInterfacePtr> weak_ptr_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(WeakInterfacePtr);
+};
+
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_CPP_BINDINGS_WEAK_INTERFACE_PTR_SET_H_