blob: 84d1214e6870f86e3cd2cef8da68fb96713e4a91 [file] [log] [blame]
#include "quiche/common/quiche_mem_slice.h"
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <memory>
#include <utility>
#include "absl/strings/string_view.h"
#include "quiche/common/quiche_buffer_allocator.h"
#include "quiche/common/quiche_callbacks.h"
namespace quiche {
QuicheMemSlice::QuicheMemSlice(QuicheBuffer buffer)
: data_(buffer.data()), size_(buffer.size()) {
QuicheUniqueBufferPtr owned = buffer.Release();
QuicheBufferAllocator* allocator = owned.get_deleter().allocator();
owned.release();
done_callback_ = [allocator](absl::string_view ptr) {
allocator->Delete(const_cast<char*>(ptr.data()));
};
}
QuicheMemSlice::QuicheMemSlice(std::unique_ptr<char[]> buffer, size_t length)
: data_(buffer.release()),
size_(length),
done_callback_(+[](absl::string_view ptr) { delete[] ptr.data(); }) {}
QuicheMemSlice::QuicheMemSlice(
const char* buffer, size_t length,
SingleUseCallback<void(absl::string_view)> done_callback)
: data_(buffer), size_(length), done_callback_(std::move(done_callback)) {}
// Move constructors. |other| will not hold a reference to the data buffer
// after this call completes.
QuicheMemSlice::QuicheMemSlice(QuicheMemSlice&& other) {
data_ = other.data_;
size_ = other.size_;
done_callback_ = std::move(other.done_callback_);
other.data_ = nullptr;
other.size_ = 0;
other.done_callback_ = nullptr;
}
QuicheMemSlice& QuicheMemSlice::operator=(QuicheMemSlice&& other) {
Reset();
data_ = other.data_;
size_ = other.size_;
done_callback_ = std::move(other.done_callback_);
other.data_ = nullptr;
other.size_ = 0;
other.done_callback_ = nullptr;
return *this;
}
QuicheMemSlice::~QuicheMemSlice() { Reset(); }
void QuicheMemSlice::Reset() {
if (done_callback_ && data_ != nullptr) {
std::move(done_callback_)(AsStringView());
}
data_ = nullptr;
size_ = 0;
done_callback_ = nullptr;
}
QuicheMemSlice QuicheMemSlice::Copy(absl::string_view data) {
if (data.empty()) {
return QuicheMemSlice();
}
auto buffer = std::make_unique<char[]>(data.size());
memcpy(buffer.get(), data.data(), data.size());
return QuicheMemSlice(std::move(buffer), data.size());
}
} // namespace quiche