1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MOJO_APPLICATION_PUBLIC_CPP_LAZY_INTERFACE_PTR_H_
6 #define MOJO_APPLICATION_PUBLIC_CPP_LAZY_INTERFACE_PTR_H_
8 #include "mojo/application/public/cpp/connect.h"
9 #include "mojo/application/public/interfaces/service_provider.mojom.h"
13 // An InterfacePtr that will request an implementation from a specified
14 // ServiceProvider when it is first accessed with the get() method.
15 template <typename Interface
>
16 class LazyInterfacePtr
: public InterfacePtr
<Interface
> {
18 LazyInterfacePtr() : service_provider_(nullptr) {}
20 explicit LazyInterfacePtr(ServiceProvider
* service_provider
)
21 : service_provider_(service_provider
) {}
23 void set_service_provider(ServiceProvider
* service_provider
) {
24 if (service_provider
!= service_provider_
) {
25 InterfacePtr
<Interface
>::reset();
27 service_provider_
= service_provider
;
30 Interface
* get() const {
31 if (!InterfacePtr
<Interface
>::get() && service_provider_
) {
32 mojo::ConnectToService
<Interface
>(
33 service_provider_
, const_cast<LazyInterfacePtr
<Interface
>*>(this));
35 return InterfacePtr
<Interface
>::get();
37 Interface
* operator->() const { return get(); }
38 Interface
& operator*() const { return *get(); }
41 ServiceProvider
* service_provider_
;
46 #endif // MOJO_APPLICATION_PUBLIC_CPP_LAZY_INTERFACE_PTR_H_