all: more assorted cleanups

This commit is contained in:
Markus F.X.J. Oberhumer
2024-02-09 14:48:47 +01:00
parent 25aa0e2e46
commit ae6d3b9bff
12 changed files with 98 additions and 36 deletions
+32
View File
@@ -179,6 +179,38 @@ forceinline Result ptr_static_cast(const From *ptr) noexcept {
return static_cast<Result>(static_cast<const void *>(ptr));
}
// helper classes so we don't leak memory on exceptions
template <class T> // T is "Type **"
struct ObjectDeleter final {
static_assert(std::is_pointer_v<T>);
static_assert(std::is_pointer_v<std::remove_pointer_t<T> >);
T items; // public
size_t count; // public
~ObjectDeleter() noexcept { delete_items(); }
void delete_items() noexcept {
for (size_t i = 0; i < count; i++) {
auto item = items[i];
items[i] = nullptr;
delete item; // single object delete
}
}
};
template <class T> // T is "Type **"
struct ArrayDeleter final {
static_assert(std::is_pointer_v<T>);
static_assert(std::is_pointer_v<std::remove_pointer_t<T> >);
T items; // public
size_t count; // public
~ArrayDeleter() noexcept { delete_items(); }
void delete_items() noexcept {
for (size_t i = 0; i < count; i++) {
auto item = items[i];
items[i] = nullptr;
delete[] item; // array delete
}
}
};
class noncopyable {
protected:
forceinline constexpr noncopyable() noexcept {}
+1 -1
View File
@@ -457,7 +457,7 @@ public: // raw access
// like C++20 std::span
pointer data() const noexcept { return ptr; }
pointer data(size_t bytes) const { return raw_bytes(bytes); } // UPX extra
size_type size() const noexcept { return size_bytes() / sizeof(element_type); }
size_type size() const { return size_bytes() / sizeof(element_type); }
size_type size_bytes() const {
assertInvariants();
if __acc_cte (!configRequirePtr && ptr == nullptr)