#ifndef MOJO_PUBLIC_CPP_BINDINGS_GENERIC_PENDING_ASSOCIATED_RECEIVER_H_
#define MOJO_PUBLIC_CPP_BINDINGS_GENERIC_PENDING_ASSOCIATED_RECEIVER_H_
#include <optional>
#include <string>
#include <string_view>
#include "base/component_export.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/runtime_features.h"
#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
namespace mojo {
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS) GenericPendingAssociatedReceiver {
public:
GenericPendingAssociatedReceiver();
GenericPendingAssociatedReceiver(std::string_view interface_name,
mojo::ScopedInterfaceEndpointHandle handle);
template <typename Interface>
GenericPendingAssociatedReceiver(
mojo::PendingAssociatedReceiver<Interface> receiver)
: GenericPendingAssociatedReceiver(Interface::Name_,
receiver.PassHandle()) {}
GenericPendingAssociatedReceiver(const GenericPendingAssociatedReceiver&) =
delete;
GenericPendingAssociatedReceiver(GenericPendingAssociatedReceiver&&);
GenericPendingAssociatedReceiver& operator=(
const GenericPendingAssociatedReceiver&) = delete;
GenericPendingAssociatedReceiver& operator=(
GenericPendingAssociatedReceiver&&);
~GenericPendingAssociatedReceiver();
bool is_valid() const { return handle_.is_valid(); }
explicit operator bool() const { return is_valid(); }
void reset();
const std::optional<std::string>& interface_name() const {
return interface_name_;
}
mojo::ScopedInterfaceEndpointHandle PassHandle();
template <typename Interface>
mojo::PendingAssociatedReceiver<Interface> As() {
if (!internal::GetRuntimeFeature_ExpectEnabled<Interface>()) {
return mojo::PendingAssociatedReceiver<Interface>();
}
return mojo::PendingAssociatedReceiver<Interface>(
PassHandleIfNameIs(Interface::Name_));
}
private:
mojo::ScopedInterfaceEndpointHandle PassHandleIfNameIs(
const char* interface_name);
std::optional<std::string> interface_name_;
mojo::ScopedInterfaceEndpointHandle handle_;
};
}
#endif