xref: /aosp_15_r20/external/cronet/base/win/reference.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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