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)26static ReleaseableObjectPtr<T> clUniquePtr(T *object) { 27 return ReleaseableObjectPtr<T>{object}; 28 } 29 30 template <class _Ty, class... _Types> make_releaseable(_Types &&...args)31inline ReleaseableObjectPtr<_Ty> make_releaseable(_Types &&...args) { 32 return (ReleaseableObjectPtr<_Ty>(new _Ty(std::forward<_Types>(args)...))); 33 } 34 } // namespace NEO 35