blob: 6e81e766217479fc6282128f1f59a24a6a087105 [file] [log] [blame]
// 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 <algorithm>
#include <vector>
#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 <typename Interface>
class BindingSet {
public:
BindingSet() {}
~BindingSet() { CloseAllBindings(); }
void AddBinding(Interface* impl, InterfaceRequest<Interface> request) {
bindings_.emplace_back(new Binding<Interface>(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<Binding<Interface>>& 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<std::unique_ptr<Binding<Interface>>> bindings_;
DISALLOW_COPY_AND_ASSIGN(BindingSet);
};
} // namespace mojo
#endif // MOJO_COMMON_BINDING_SET_H_