Line data Source code
1 : /********************************************************************** 2 : * 3 : * Name: cpl_auto_close.h 4 : * Project: CPL - Common Portability Library 5 : * Purpose: CPL Auto Close handling 6 : * Author: Liu Yimin, ymwh@foxmail.com 7 : * 8 : ********************************************************************** 9 : * Copyright (c) 2018, Liu Yimin 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : #ifndef CPL_AUTO_CLOSE_H_INCLUDED 15 : #define CPL_AUTO_CLOSE_H_INCLUDED 16 : 17 : #if defined(__cplusplus) 18 : #include <type_traits> 19 : 20 : /************************************************************************/ 21 : /* CPLAutoClose */ 22 : /************************************************************************/ 23 : 24 : /** 25 : * The class use the destructor to automatically close the resource. 26 : * Example: 27 : * GDALDatasetH hDset = GDALOpen(path,GA_ReadOnly); 28 : * CPLAutoClose<GDALDatasetH,void(*)(void*)> 29 : * autoclosehDset(hDset,GDALClose); Or: GDALDatasetH hDset = 30 : * GDALOpen(path,GA_ReadOnly); CPL_AUTO_CLOSE_WARP(hDset,GDALClose); 31 : */ 32 : template <typename _Ty, typename _Dx> class CPLAutoClose 33 : { 34 : static_assert(!std::is_const<_Ty>::value && std::is_pointer<_Ty>::value, 35 : "_Ty must is pointer type,_Dx must is function type"); 36 : 37 : private: 38 : _Ty &m_ResourcePtr; 39 : _Dx m_CloseFunc; 40 : 41 : private: 42 : CPLAutoClose(const CPLAutoClose &) = delete; 43 : void operator=(const CPLAutoClose &) = delete; 44 : 45 : public: 46 : /** 47 : * @brief Constructor. 48 : * @param ptr Pointer to the resource object. 49 : * @param dt Resource release(close) function. 50 : */ 51 2 : explicit CPLAutoClose(_Ty &ptr, _Dx dt) 52 2 : : m_ResourcePtr(ptr), m_CloseFunc(dt) 53 : { 54 2 : } 55 : 56 : /** 57 : * @brief Destructor. 58 : */ 59 2 : ~CPLAutoClose() 60 : { 61 2 : if (m_ResourcePtr && m_CloseFunc) 62 2 : m_CloseFunc(m_ResourcePtr); 63 2 : } 64 : }; 65 : 66 : #define CPL_AUTO_CLOSE_WARP(hObject, closeFunc) \ 67 : CPLAutoClose<decltype(hObject), decltype(closeFunc) *> \ 68 : tAutoClose##hObject(hObject, closeFunc) 69 : 70 : #endif /* __cplusplus */ 71 : 72 : #endif /* CPL_AUTO_CLOSE_H_INCLUDED */