template <typename T> // T is either uint8_t, uint16_t or uint32_t
size_t PackedIndices::unpackIndices(const uint8_t*& buffer,
T* indices,
size_t cnt) const
{
__try
{
// read first index
uint32_t index = static_cast<uint32_t>(indexPacker_.unpack(buffer));
T* p = indices;
(*p++) = static_cast<T>(index);
for (size_t i = 1; i < cnt; ++i)
{
int64_t delta = indexPacker_.unpack(buffer);
index = (uint32_t)(delta + index);
(*p++) = static_cast<T>(index);
}
return p - indices;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
DebugBreak();
}
}
//------------------------------------------------------------------------------
size_t PackedIndices::unpack(const uint8_t*& buffer,
void* indices,
size_t byteCount) const
{
// get stored index count
size_t cnt = SizePacker().unpack(buffer);
if (cnt == 0)
return 0;
uint8_t width = WidthPacker().unpack(buffer);
if (cnt * width > byteCount)
throw std::invalid_argument("Incorrect buffer size");
// get data width
switch (width)
{
case 1: return unpackIndices(buffer, static_cast<uint8_t*>(indices), cnt);
case 2: return unpackIndices(buffer, static_cast<uint16_t*>(indices), cnt);
case 4: return unpackIndices(buffer, static_cast<uint32_t*>(indices), cnt);
default: return 0;
}
}
dGVtcGxhdGUgPHR5cGVuYW1lIFQ+IC8vIFQgaXMgZWl0aGVyIHVpbnQ4X3QsIHVpbnQxNl90IG9yIHVpbnQzMl90CnNpemVfdCBQYWNrZWRJbmRpY2VzOjp1bnBhY2tJbmRpY2VzKGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQqIGluZGljZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjbnQpIGNvbnN0CnsKICAgIF9fdHJ5CiAgICB7CiAgICAgICAgLy8gcmVhZCBmaXJzdCBpbmRleAogICAgICAgIHVpbnQzMl90IGluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4UGFja2VyXy51bnBhY2soYnVmZmVyKSk7CiAgICAgICAgVCogcCA9IGluZGljZXM7CgogICAgICAgICgqcCsrKSA9IHN0YXRpY19jYXN0PFQ+KGluZGV4KTsKCiAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBjbnQ7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGludDY0X3QgZGVsdGEgPSBpbmRleFBhY2tlcl8udW5wYWNrKGJ1ZmZlcik7CiAgICAgICAgICAgIGluZGV4ID0gKHVpbnQzMl90KShkZWx0YSArIGluZGV4KTsKICAgICAgICAgICAgKCpwKyspID0gc3RhdGljX2Nhc3Q8VD4oaW5kZXgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHAgLSBpbmRpY2VzOyAKICAgIH0KICAgIF9fZXhjZXB0KEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIpCiAgICB7CiAgICAgICAgRGVidWdCcmVhaygpOwogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzaXplX3QgUGFja2VkSW5kaWNlczo6dW5wYWNrKGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGluZGljZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlQ291bnQpIGNvbnN0CnsKICAgIC8vIGdldCBzdG9yZWQgaW5kZXggY291bnQKICAgIHNpemVfdCBjbnQgPSBTaXplUGFja2VyKCkudW5wYWNrKGJ1ZmZlcik7CiAgICBpZiAoY250ID09IDApCiAgICAgICAgcmV0dXJuIDA7CgogICAgdWludDhfdCB3aWR0aCA9IFdpZHRoUGFja2VyKCkudW5wYWNrKGJ1ZmZlcik7CiAgICBpZiAoY250ICogd2lkdGggPiBieXRlQ291bnQpCiAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJJbmNvcnJlY3QgYnVmZmVyIHNpemUiKTsKCiAgICAvLyBnZXQgZGF0YSB3aWR0aAogICAgc3dpdGNoICh3aWR0aCkKICAgIHsKICAgIGNhc2UgMTogcmV0dXJuIHVucGFja0luZGljZXMoYnVmZmVyLCBzdGF0aWNfY2FzdDx1aW50OF90Kj4oaW5kaWNlcyksIGNudCk7CiAgICBjYXNlIDI6IHJldHVybiB1bnBhY2tJbmRpY2VzKGJ1ZmZlciwgc3RhdGljX2Nhc3Q8dWludDE2X3QqPihpbmRpY2VzKSwgY250KTsKICAgIGNhc2UgNDogcmV0dXJuIHVucGFja0luZGljZXMoYnVmZmVyLCBzdGF0aWNfY2FzdDx1aW50MzJfdCo+KGluZGljZXMpLCBjbnQpOwogICAgZGVmYXVsdDogcmV0dXJuIDA7CiAgICB9Cn0=
prog.cpp:2:1: error: 'size_t' does not name a type
prog.cpp:30:8: error: expected constructor, destructor, or type conversion before 'PackedIndices'