DSInternals/Src/DSInternals.Replication.Interop/midl_alloc.h
2015-12-26 23:44:43 +01:00

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));
}