// 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_BINDING_SET_H_ #define MOJO_COMMON_BINDING_SET_H_ #include #include #include "base/memory/weak_ptr.h" #include "mojo/public/cpp/bindings/binding.h" namespace mojo { // Use this class to manage a set of bindings each of which is // owned by the pipe it is bound to. template class BindingSet { public: BindingSet() {} ~BindingSet() { CloseAllBindings(); } void AddBinding(Interface* impl, InterfaceRequest request) { bindings_.emplace_back(new Binding(impl, request.Pass())); auto* binding = bindings_.back().get(); // Set the connection error handler for the newly added Binding to be a // function that will erase it from the vector. binding->set_connection_error_handler([this, binding]() { auto it = std::find_if(bindings_.begin(), bindings_.end(), [binding](const std::unique_ptr>& b) { return (b.get() == binding); }); DCHECK(it != bindings_.end()); bindings_.erase(it); }); } void CloseAllBindings() { bindings_.clear(); } size_t size() const { return bindings_.size(); } private: std::vector>> bindings_; DISALLOW_COPY_AND_ASSIGN(BindingSet); }; } // namespace mojo #endif // MOJO_COMMON_BINDING_SET_H_