Index: mojo/public/cpp/bindings/interface_handle.h |
diff --git a/mojo/public/cpp/bindings/interface_handle.h b/mojo/public/cpp/bindings/interface_handle.h |
index e03fad5203b4b37ff27b9e9c906090142675a833..9bb7746b1f01986f6a3521d89a4e738d82dda89c 100644 |
--- a/mojo/public/cpp/bindings/interface_handle.h |
+++ b/mojo/public/cpp/bindings/interface_handle.h |
@@ -5,17 +5,23 @@ |
#ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_INFO_H_ |
#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_INFO_H_ |
+#include <cstddef> |
+ |
#include "mojo/public/cpp/system/macros.h" |
#include "mojo/public/cpp/system/message_pipe.h" |
namespace mojo { |
+template <typename Interface> |
+class InterfacePtr; |
+ |
// InterfaceHandle stores necessary information to communicate with a remote |
// interface implementation, which could be used to construct an InterfacePtr. |
template <typename Interface> |
class InterfaceHandle { |
public: |
InterfaceHandle() : version_(0u) {} |
+ InterfaceHandle(std::nullptr_t) : version_(0u) {} |
InterfaceHandle(ScopedMessagePipeHandle handle, uint32_t version) |
: handle_(handle.Pass()), version_(version) {} |
@@ -25,6 +31,14 @@ class InterfaceHandle { |
other.version_ = 0u; |
} |
+ // Making this constructor templated ensures that it is not type-instantiated |
+ // unless it is used, making the InterfacePtr<->InterfaceHandle codependency |
+ // less fragile. |
+ template <typename SameInterfaceAsAbove = Interface> |
+ InterfaceHandle(InterfacePtr<SameInterfaceAsAbove>&& ptr) { |
+ *this = ptr.PassInterfaceHandle(); |
+ } |
+ |
~InterfaceHandle() {} |
InterfaceHandle& operator=(InterfaceHandle&& other) { |
@@ -37,6 +51,8 @@ class InterfaceHandle { |
return *this; |
} |
+ // Tests as true if we have a valid handle. |
+ explicit operator bool() const { return is_valid(); } |
bool is_valid() const { return handle_.is_valid(); } |
ScopedMessagePipeHandle PassHandle() { return handle_.Pass(); } |