- auto buf = IOBuf::create(elementSize_);
- memset(buf->writableTail(), 'x', elementSize_);
- buf->append(elementSize_);
+ unique_ptr<IOBuf> buf;
+ switch (type_) {
+ case CREATE:
+ buf = IOBuf::create(elementSize_);
+ buf->append(elementSize_);
+ break;
+ case TAKE_OWNERSHIP_MALLOC: {
+ void* data = malloc(elementSize_);
+ if (!data) {
+ throw std::bad_alloc();
+ }
+ buf = IOBuf::takeOwnership(data, elementSize_);
+ break;
+ }
+ case TAKE_OWNERSHIP_CUSTOM: {
+ uint8_t* data = new uint8_t[elementSize_];
+ buf = IOBuf::takeOwnership(data, elementSize_, testFreeFn);
+ break;
+ }
+ case USER_OWNED: {
+ unique_ptr<uint8_t[]> data(new uint8_t[elementSize_]);
+ buf = IOBuf::wrapBuffer(data.get(), elementSize_);
+ ownedBuffers_.emplace_back(std::move(data));
+ break;
+ }
+ default:
+ throw std::invalid_argument("unexpected buffer type parameter");
+ break;
+ }
+ memset(buf->writableData(), 'x', elementSize_);