|
1 | 1 |
|
| 2 | +WINRT_EXPORT namespace winrt |
| 3 | +{ |
| 4 | + template <typename T> |
| 5 | + struct com_ptr; |
| 6 | +} |
| 7 | + |
| 8 | +namespace winrt::impl |
| 9 | +{ |
| 10 | + template <typename T, typename F, typename...Args> |
| 11 | + int32_t capture_to(void**result, F function, Args&& ...args) |
| 12 | + { |
| 13 | + return function(args..., guid_of<T>(), result); |
| 14 | + } |
| 15 | + |
| 16 | + template <typename T, typename O, typename M, typename...Args, std::enable_if_t<std::is_class_v<O> || std::is_union_v<O>, int> = 0> |
| 17 | + int32_t capture_to(void** result, O* object, M method, Args&& ...args) |
| 18 | + { |
| 19 | + return (object->*method)(args..., guid_of<T>(), result); |
| 20 | + } |
| 21 | + |
| 22 | + template <typename T, typename O, typename M, typename...Args> |
| 23 | + int32_t capture_to(void** result, com_ptr<O> const& object, M method, Args&& ...args); |
| 24 | +} |
| 25 | + |
2 | 26 | WINRT_EXPORT namespace winrt |
3 | 27 | { |
4 | 28 | template <typename T> |
@@ -162,28 +186,16 @@ WINRT_EXPORT namespace winrt |
162 | 186 | *other = m_ptr; |
163 | 187 | } |
164 | 188 |
|
165 | | - template <typename F, typename...Args> |
166 | | - bool try_capture(F function, Args&&...args) |
167 | | - { |
168 | | - return function(args..., guid_of<T>(), put_void()) >= 0; |
169 | | - } |
170 | | - |
171 | | - template <typename O, typename M, typename...Args> |
172 | | - bool try_capture(com_ptr<O> const& object, M method, Args&&...args) |
173 | | - { |
174 | | - return (object.get()->*(method))(args..., guid_of<T>(), put_void()) >= 0; |
175 | | - } |
176 | | - |
177 | | - template <typename F, typename...Args> |
178 | | - void capture(F function, Args&&...args) |
| 189 | + template <typename...Args> |
| 190 | + bool try_capture(Args&&...args) |
179 | 191 | { |
180 | | - check_hresult(function(args..., guid_of<T>(), put_void())); |
| 192 | + return impl::capture_to<T>(put_void(), std::forward<Args>(args)...) >= 0; |
181 | 193 | } |
182 | 194 |
|
183 | | - template <typename O, typename M, typename...Args> |
184 | | - void capture(com_ptr<O> const& object, M method, Args&&...args) |
| 195 | + template <typename...Args> |
| 196 | + void capture(Args&&...args) |
185 | 197 | { |
186 | | - check_hresult((object.get()->*(method))(args..., guid_of<T>(), put_void())); |
| 198 | + check_hresult(impl::capture_to<T>(put_void(), std::forward<Args>(args)...)); |
187 | 199 | } |
188 | 200 |
|
189 | 201 | private: |
@@ -225,33 +237,19 @@ WINRT_EXPORT namespace winrt |
225 | 237 | type* m_ptr{}; |
226 | 238 | }; |
227 | 239 |
|
228 | | - template <typename T, typename F, typename...Args> |
229 | | - impl::com_ref<T> try_capture(F function, Args&& ...args) |
| 240 | + template <typename T, typename...Args> |
| 241 | + impl::com_ref<T> try_capture(Args&& ...args) |
230 | 242 | { |
231 | 243 | void* result{}; |
232 | | - function(args..., guid_of<T>(), &result); |
| 244 | + impl::capture_to<T>(&result, std::forward<Args>(args)...); |
233 | 245 | return { result, take_ownership_from_abi }; |
234 | 246 | } |
235 | 247 |
|
236 | | - template <typename T, typename O, typename M, typename...Args> |
237 | | - impl::com_ref<T> try_capture(com_ptr<O> const& object, M method, Args&& ...args) |
238 | | - { |
239 | | - void* result{}; |
240 | | - (object.get()->*(method))(args..., guid_of<T>(), &result); |
241 | | - return { result, take_ownership_from_abi }; |
242 | | - } |
243 | | - template <typename T, typename F, typename...Args> |
244 | | - impl::com_ref<T> capture(F function, Args&& ...args) |
245 | | - { |
246 | | - void* result{}; |
247 | | - check_hresult(function(args..., guid_of<T>(), &result)); |
248 | | - return { result, take_ownership_from_abi }; |
249 | | - } |
250 | | - template <typename T, typename O, typename M, typename...Args> |
251 | | - impl::com_ref<T> capture(com_ptr<O> const& object, M method, Args && ...args) |
| 248 | + template <typename T, typename...Args> |
| 249 | + impl::com_ref<T> capture(Args&& ...args) |
252 | 250 | { |
253 | 251 | void* result{}; |
254 | | - check_hresult((object.get()->*(method))(args..., guid_of<T>(), &result)); |
| 252 | + check_hresult(impl::capture_to<T>(&result, std::forward<Args>(args)...)); |
255 | 253 | return { result, take_ownership_from_abi }; |
256 | 254 | } |
257 | 255 |
|
@@ -340,6 +338,15 @@ WINRT_EXPORT namespace winrt |
340 | 338 | } |
341 | 339 | } |
342 | 340 |
|
| 341 | +namespace winrt::impl |
| 342 | +{ |
| 343 | + template <typename T, typename O, typename M, typename...Args> |
| 344 | + int32_t capture_to(void** result, com_ptr<O> const& object, M method, Args&& ...args) |
| 345 | + { |
| 346 | + return (object.get()->*(method))(args..., guid_of<T>(), result); |
| 347 | + } |
| 348 | +} |
| 349 | + |
343 | 350 | template <typename T> |
344 | 351 | void** IID_PPV_ARGS_Helper(winrt::com_ptr<T>* ptr) noexcept |
345 | 352 | { |
|
0 commit comments