Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1597)

Unified Diff: mojo/common/interface_ptr_set.h

Issue 1841863002: Update monet. (Closed) Base URL: https://github.com/domokit/monet.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/common/handle_watcher_unittest.cc ('k') | mojo/common/interface_ptr_set_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/common/interface_ptr_set.h
diff --git a/mojo/common/interface_ptr_set.h b/mojo/common/interface_ptr_set.h
new file mode 100644
index 0000000000000000000000000000000000000000..a08a7289696c4d0812f1d98d6471c404a38e0e4c
--- /dev/null
+++ b/mojo/common/interface_ptr_set.h
@@ -0,0 +1,72 @@
+// 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_COMMON_INTERFACE_PTR_SET_H_
+#define MOJO_COMMON_INTERFACE_PTR_SET_H_
+
+#include <vector>
+
+#include "base/logging.h"
+#include "mojo/public/cpp/bindings/interface_ptr.h"
+
+namespace mojo {
+
+// An InterfacePtrSet contains a collection of InterfacePtrs
+// that are automatically removed from the collection and destroyed
+// when their associated MessagePipe experiences a connection error.
+// When the set is destroyed all of the MessagePipes will be closed.
+template <typename Interface>
+class InterfacePtrSet {
+ public:
+ InterfacePtrSet() {}
+ ~InterfacePtrSet() { CloseAll(); }
+
+ // |ptr| must be bound to a message pipe.
+ void AddInterfacePtr(InterfacePtr<Interface> ptr) {
+ DCHECK(ptr.is_bound());
+ ptrs_.emplace_back(ptr.Pass());
+ InterfacePtr<Interface>& intrfc_ptr = ptrs_.back();
+ Interface* pointer = intrfc_ptr.get();
+ // Set the connection error handler for the newly added InterfacePtr to be a
+ // function that will erase it from the vector.
+ intrfc_ptr.set_connection_error_handler([pointer, this]() {
+ // Since InterfacePtr itself is a movable type, the thing that uniquely
+ // identifies the InterfacePtr we wish to erase is its Interface*.
+ auto it = std::find_if(ptrs_.begin(), ptrs_.end(),
+ [pointer](const InterfacePtr<Interface>& p) {
+ return (p.get() == pointer);
+ });
+ DCHECK(it != ptrs_.end());
+ ptrs_.erase(it);
+ });
+ }
+
+ // Applies |function| to each of the InterfacePtrs in the set.
+ template <typename FunctionType>
+ void ForAllPtrs(FunctionType function) {
+ for (const auto& it : ptrs_) {
+ if (it)
+ function(it.get());
+ }
+ }
+
+ // Closes the MessagePipe associated with each of the InterfacePtrs in
+ // this set and clears the set.
+ void CloseAll() {
+ for (auto& it : ptrs_) {
+ if (it)
+ it.reset();
+ }
+ ptrs_.clear();
+ }
+
+ size_t size() const { return ptrs_.size(); }
+
+ private:
+ std::vector<InterfacePtr<Interface>> ptrs_;
+};
+
+} // namespace mojo
+
+#endif // MOJO_COMMON_INTERFACE_PTR_SET_H_
« no previous file with comments | « mojo/common/handle_watcher_unittest.cc ('k') | mojo/common/interface_ptr_set_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698