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_ |