Use lambdas for template specialization

This commit is contained in:
Kovid Goyal 2023-01-27 13:54:03 +05:30
parent e145f42fdc
commit 65885f505e
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 6 additions and 11 deletions

View File

@ -17,7 +17,7 @@
#define arraysz(x) (sizeof(x)/sizeof(x[0])) #define arraysz(x) (sizeof(x)/sizeof(x[0]))
template<typename T, void free_T(void*), T null=static_cast<T>(NULL)> template<typename T, void free_T(T), T null=static_cast<T>(NULL)>
class generic_raii { class generic_raii {
private: private:
generic_raii( const generic_raii & ) noexcept; generic_raii( const generic_raii & ) noexcept;
@ -45,8 +45,8 @@ class generic_raii {
explicit operator bool() const noexcept { return handle != null; } explicit operator bool() const noexcept { return handle != null; }
}; };
class wchar_raii : public generic_raii<wchar_t*, [](wchar_t* x){PyMem_Free(x);}> {
#if __cplusplus >= 201703L #if __cplusplus >= 201703L
class wchar_raii : public generic_raii<wchar_t*, PyMem_Free> {
private: private:
Py_ssize_t sz; Py_ssize_t sz;
public: public:
@ -58,13 +58,10 @@ class wchar_raii : public generic_raii<wchar_t*, PyMem_Free> {
} }
std::wstring_view as_view() const { return std::wstring_view(handle, sz); } std::wstring_view as_view() const { return std::wstring_view(handle, sz); }
std::wstring as_copy() const { return std::wstring(handle, sz); } std::wstring as_copy() const { return std::wstring(handle, sz); }
};
#else
typedef generic_raii<wchar_t*, PyMem_Free> wchar_raii;
#endif #endif
};
static inline void python_object_destructor(void *p) { PyObject *x = reinterpret_cast<PyObject*>(p); Py_XDECREF(x); } typedef generic_raii<PyObject*, Py_DecRef> pyobject_raii;
typedef generic_raii<PyObject*, python_object_destructor> pyobject_raii;
template<typename T, void free_T(void*), size_t sz, T null=static_cast<T>(NULL)> template<typename T, void free_T(void*), size_t sz, T null=static_cast<T>(NULL)>
class generic_raii_array { class generic_raii_array {

View File

@ -58,10 +58,8 @@ class scoped_com_initializer { // {{{
#define INITIALIZE_COM_IN_FUNCTION scoped_com_initializer com; if (!com) return com.set_python_error(); #define INITIALIZE_COM_IN_FUNCTION scoped_com_initializer com; if (!com) return com.set_python_error();
static inline void co_task_mem_free(void* m) { CoTaskMemFree(m); } typedef generic_raii<wchar_t*, [](wchar_t *x) { CoTaskMemFree(x); }> com_wchar_raii;
typedef generic_raii<wchar_t*, co_task_mem_free> com_wchar_raii; typedef generic_raii<void*, [](void* x) { UnmapViewOfFile(x);}> mapping_raii;
static inline void mapping_destructor(void *p) { UnmapViewOfFile(p); }
typedef generic_raii<void*, mapping_destructor> mapping_raii;
class handle_raii { class handle_raii {
private: private: