1 /*
2  * Copyright (C) 2018-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #pragma once
9 #include <memory>
10 
11 namespace NEO {
12 
13 template <typename T>
14 struct ReleaseObject {
operatorReleaseObject15     void operator()(T *t) {
16         if (t != nullptr) {
17             t->release();
18         }
19     }
20 };
21 
22 template <typename T>
23 using ReleaseableObjectPtr = std::unique_ptr<T, ReleaseObject<T>>;
24 
25 template <typename T>
clUniquePtr(T * object)26 static ReleaseableObjectPtr<T> clUniquePtr(T *object) {
27     return ReleaseableObjectPtr<T>{object};
28 }
29 
30 template <class _Ty, class... _Types>
make_releaseable(_Types &&...args)31 inline ReleaseableObjectPtr<_Ty> make_releaseable(_Types &&...args) {
32     return (ReleaseableObjectPtr<_Ty>(new _Ty(std::forward<_Types>(args)...)));
33 }
34 } // namespace NEO
35