mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Use lambdas for template specialization
This commit is contained in:
parent
e145f42fdc
commit
65885f505e
@ -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 {
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user