mirror of
https://github.com/MichaelGrafnetter/DSInternals
synced 2024-12-12 17:37:31 +00:00
55 lines
1.0 KiB
C++
55 lines
1.0 KiB
C++
#pragma once
|
|
|
|
#include <rpc.h>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"{
|
|
#endif
|
|
|
|
void* __RPC_USER midl_user_allocate(size_t size);
|
|
void __RPC_USER midl_user_free(void* p);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/// <summary>
|
|
/// Custom deleter for unique_ptr, that calls midl_user_free instead of delete.
|
|
/// </summary>
|
|
template <typename T>
|
|
struct midl_delete {
|
|
// Empty constructor
|
|
midl_delete();
|
|
// Deletion functor
|
|
void operator()(T* ptr) const;
|
|
};
|
|
|
|
template <typename T>
|
|
midl_delete<T>::midl_delete() {}
|
|
|
|
template<typename T>
|
|
void midl_delete<T>::operator()(T* ptr) const
|
|
{
|
|
midl_user_free(ptr);
|
|
}
|
|
|
|
// Define the midl_ptr as parametrized unique_ptr.
|
|
template <typename T>
|
|
using midl_ptr = std::unique_ptr<T, midl_delete<T>>;
|
|
|
|
// Allocators:
|
|
|
|
template <typename T>
|
|
midl_ptr<T> make_midl_ptr()
|
|
{
|
|
return midl_ptr<T>((T*)midl_user_allocate(sizeof(T)));
|
|
}
|
|
|
|
template <typename T>
|
|
midl_ptr<T> make_midl_ptr(ULONG count)
|
|
{
|
|
size_t totalSize = count * sizeof(T);
|
|
return midl_ptr<T>((T*)midl_user_allocate(totalSize));
|
|
} |