APCHandle::Pair APCArray::MakeHash(ArrayData* arr, bool unserializeObj) { auto num = arr->size(); auto cap = num > 2 ? folly::nextPowTwo(num) : 2; auto size = sizeof(APCArray) + sizeof(int) * cap + sizeof(Bucket) * num; auto p = malloc(size); APCArray* ret = new (p) APCArray(static_cast<unsigned int>(cap)); for (int i = 0; i < cap; i++) ret->hash()[i] = -1; try { for (ArrayIter it(arr); !it.end(); it.next()) { auto key = APCHandle::Create(it.first(), false, APCHandleLevel::Inner, unserializeObj); size += key.size; auto val = APCHandle::Create(it.secondRef(), false, APCHandleLevel::Inner, unserializeObj); size += val.size; ret->add(key.handle, val.handle); } } catch (...) { delete ret; throw; } return {ret->getHandle(), size}; }
APCHandle* APCArray::MakeShared(ArrayData* arr, size_t& size, bool unserializeObj) { auto num = arr->size(); auto cap = num > 2 ? folly::nextPowTwo(num) : 2; size = sizeof(APCArray) + sizeof(int) * cap + sizeof(Bucket) * num; void* p = malloc(size); APCArray* ret = new (p) APCArray(static_cast<unsigned int>(cap)); for (int i = 0; i < cap; i++) ret->hash()[i] = -1; try { for (ArrayIter it(arr); !it.end(); it.next()) { size_t s = 0; auto key = APCHandle::Create(it.first(), s, false, true, unserializeObj); size += s; s = 0; auto val = APCHandle::Create(it.secondRef(), s, false, true, unserializeObj); size += s; ret->add(key, val); } } catch (...) { delete ret; throw; } return ret->getHandle(); }