46 lines
780 B
C
46 lines
780 B
C
|
#pragma once
|
||
|
|
||
|
#include <objbase.h>
|
||
|
|
||
|
#include "util/logging.h"
|
||
|
|
||
|
template<typename T>
|
||
|
class CoTaskMemPtr {
|
||
|
public:
|
||
|
explicit CoTaskMemPtr() {
|
||
|
}
|
||
|
|
||
|
explicit CoTaskMemPtr(T *value) : _ptr(value) {
|
||
|
}
|
||
|
|
||
|
CoTaskMemPtr(const CoTaskMemPtr &) = delete;
|
||
|
CoTaskMemPtr &operator=(const CoTaskMemPtr &) = delete;
|
||
|
|
||
|
~CoTaskMemPtr() {
|
||
|
this->drop();
|
||
|
}
|
||
|
|
||
|
void drop() const noexcept {
|
||
|
if (_ptr) {
|
||
|
log_misc("co_task_mem_ptr", "dropping {}", fmt::ptr(_ptr));
|
||
|
CoTaskMemFree(_ptr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
T *data() const noexcept {
|
||
|
return _ptr;
|
||
|
}
|
||
|
|
||
|
T **ppv() noexcept {
|
||
|
this->drop();
|
||
|
|
||
|
return &_ptr;
|
||
|
}
|
||
|
|
||
|
T *operator->() const noexcept {
|
||
|
return _ptr;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
T *_ptr = nullptr;
|
||
|
};
|