system: add safearray_accessor_with_size

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2024-10-18 23:47:10 +02:00
parent bfda0e962b
commit 16e2384419
2 changed files with 28 additions and 6 deletions

View File

@ -547,12 +547,8 @@ namespace stdex
///
size_t write_sa(_In_ LPSAFEARRAY sa)
{
long ubound, lbound;
if (FAILED(SafeArrayGetUBound(sa, 1, &ubound)) ||
FAILED(SafeArrayGetLBound(sa, 1, &lbound)))
throw std::invalid_argument("SafeArrayGet[UL]Bound failed");
safearray_accessor<void> a(sa);
return write(a.data(), static_cast<size_t>(ubound) - lbound + 1);
safearray_accessor_with_size<uint8_t> a(sa);
return write(a.data(), a.size());
}
#endif

View File

@ -231,6 +231,32 @@ namespace stdex
T* m_data;
};
template <class T>
class safearray_accessor_with_size : public safearray_accessor<T>
{
public:
safearray_accessor_with_size(_In_ LPSAFEARRAY sa) : safearray_accessor<T>(sa)
{
m_size = SafeArrayGetElemsize(sa);
for (UINT d = 1, dim = SafeArrayGetDim(sa); d <= dim; ++d) {
long ubound, lbound;
if (FAILED(SafeArrayGetUBound(sa, d, &ubound)) ||
FAILED(SafeArrayGetLBound(sa, d, &lbound)))
throw std::invalid_argument("SafeArrayGet[UL]Bound failed");
m_size *= static_cast<size_t>(ubound) - lbound + 1;
}
m_size /= sizeof(T);
}
///
/// Return size in number of elements
///
size_t size() const { return m_size; }
protected:
size_t m_size;
};
///
/// Deleter for unique_ptr using SafeArrayDestroy
///