blob: 8a5f6d7fd151a7d82953ffba7c304e6979f50cce [file] [log] [blame]
/*
* Copyright 2024-present Alibaba Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "paimon/memory/bytes.h"
#include <cassert>
#include <cstring>
#include <memory>
#include <new>
#include <string_view>
#include <utility>
namespace paimon {
PAIMON_UNIQUE_PTR<Bytes> Bytes::AllocateBytes(int32_t length, MemoryPool* pool) {
return pool->AllocateUnique<Bytes>(length, pool);
}
PAIMON_UNIQUE_PTR<Bytes> Bytes::AllocateBytes(const std::string& str, MemoryPool* pool) {
return pool->AllocateUnique<Bytes>(str, pool);
}
Bytes::Bytes(size_t size, MemoryPool* pool) : pool_(pool), size_(size) {
if (size > 0) {
assert(pool_);
data_ = reinterpret_cast<char*>(pool_->Malloc(size_));
assert(data_);
std::memset(data_, 0, size_ * sizeof(char));
}
}
Bytes::Bytes(const std::string& str, MemoryPool* pool) : pool_(pool), size_(str.size()) {
if (str.size() > 0) {
assert(pool_);
data_ = reinterpret_cast<char*>(pool_->Malloc(size_));
assert(data_);
std::memcpy(data_, str.data(), size_ * sizeof(char));
}
}
Bytes::Bytes(Bytes&& other) noexcept {
*this = std::move(other);
}
Bytes& Bytes::operator=(Bytes&& other) noexcept {
if (&other == this) {
return *this;
}
if (data_ != nullptr) {
assert(pool_);
pool_->Free(data_, size_);
}
pool_ = other.pool_;
data_ = other.data_;
size_ = other.size_;
other.pool_ = nullptr;
other.data_ = nullptr;
other.size_ = 0;
return *this;
}
Bytes::~Bytes() {
if (data_ != nullptr) {
assert(pool_);
pool_->Free(data_, size_);
data_ = nullptr;
}
}
bool Bytes::operator==(const Bytes& other) const {
if (this == &other) {
return true;
}
return size_ == other.size_ &&
((data_ == other.data_) || (std::memcmp(data_, other.data_, size_) == 0));
}
bool Bytes::operator<(const Bytes& other) const {
std::string_view v1(data_, size_);
std::string_view v2(other.data_, other.size_);
return v1 < v2;
}
int32_t Bytes::compare(const Bytes& other) const {
std::string_view v1(data_, size_);
std::string_view v2(other.data_, other.size_);
return v1.compare(v2);
}
char& Bytes::operator[](size_t idx) const {
assert(idx < size());
return data_[idx];
}
PAIMON_UNIQUE_PTR<Bytes> Bytes::CopyOf(const Bytes& other, size_t len, MemoryPool* pool) {
assert(len >= other.size_);
assert(pool);
auto bytes = Bytes::AllocateBytes(len, pool);
if (bytes && bytes->data_ && other.size_ > 0) {
std::memcpy(bytes->data_, other.data_, other.size_);
}
return bytes;
}
} // namespace paimon