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