1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_WIN_REFERENCE_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_REFERENCE_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <windows.foundation.collections.h> 9*6777b538SAndroid Build Coastguard Worker #include <wrl/implements.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <type_traits> 12*6777b538SAndroid Build Coastguard Worker #include <utility> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker namespace base { 15*6777b538SAndroid Build Coastguard Worker namespace win { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker // Implementation of the UWP's IReference interface. 18*6777b538SAndroid Build Coastguard Worker template <typename T> 19*6777b538SAndroid Build Coastguard Worker class Reference 20*6777b538SAndroid Build Coastguard Worker : public Microsoft::WRL::RuntimeClass< 21*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::RuntimeClassFlags< 22*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::WinRt | Microsoft::WRL::InhibitRoOriginateError>, 23*6777b538SAndroid Build Coastguard Worker ABI::Windows::Foundation::IReference<T>> { 24*6777b538SAndroid Build Coastguard Worker public: 25*6777b538SAndroid Build Coastguard Worker using AbiT = typename ABI::Windows::Foundation::Internal::GetAbiType< 26*6777b538SAndroid Build Coastguard Worker typename ABI::Windows::Foundation::IReference<T>::T_complex>::type; 27*6777b538SAndroid Build Coastguard Worker Reference(const AbiT & value)28*6777b538SAndroid Build Coastguard Worker explicit Reference(const AbiT& value) : value_(value) {} Reference(AbiT && value)29*6777b538SAndroid Build Coastguard Worker explicit Reference(AbiT&& value) : value_(std::move(value)) {} 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker Reference(const Reference&) = delete; 32*6777b538SAndroid Build Coastguard Worker Reference& operator=(const Reference&) = delete; 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker // ABI::Windows::Foundation::IReference: get_Value(AbiT * value)35*6777b538SAndroid Build Coastguard Worker IFACEMETHODIMP get_Value(AbiT* value) override { 36*6777b538SAndroid Build Coastguard Worker *value = value_; 37*6777b538SAndroid Build Coastguard Worker return S_OK; 38*6777b538SAndroid Build Coastguard Worker } 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker private: 41*6777b538SAndroid Build Coastguard Worker ~Reference() override = default; 42*6777b538SAndroid Build Coastguard Worker AbiT value_; 43*6777b538SAndroid Build Coastguard Worker }; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker } // namespace win 46*6777b538SAndroid Build Coastguard Worker } // namespace base 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker #endif // BASE_WIN_REFERENCE_H_ 49