#include "enum.h" #include "utils.h" #include "../base/input.h" #include "../base/output.h" #include "../base/wire_format.h" namespace clickhouse { template ColumnEnum::ColumnEnum(TypeRef type) : Column(type) { } template ColumnEnum::ColumnEnum(TypeRef type, const std::vector& data) : Column(type) , data_(data) { } template ColumnEnum::ColumnEnum(TypeRef type, std::vector&& data) : Column(type) , data_(std::move(data)) { } template void ColumnEnum::Append(const T& value, bool checkValue) { if (checkValue) { // TODO: type_->HasEnumValue(value), "Enum type doesn't have value " + std::to_string(value); } data_.push_back(value); } template void ColumnEnum::Append(const std::string& name) { data_.push_back(static_cast(type_->As()->GetEnumValue(name))); } template void ColumnEnum::Clear() { data_.clear(); } template const T& ColumnEnum::At(size_t n) const { return data_.at(n); } template std::string_view ColumnEnum::NameAt(size_t n) const { return type_->As()->GetEnumName(data_.at(n)); } template void ColumnEnum::SetAt(size_t n, const T& value, bool checkValue) { if (checkValue) { // TODO: type_->HasEnumValue(value), "Enum type doesn't have value " + std::to_string(value); } data_.at(n) = value; } template void ColumnEnum::SetNameAt(size_t n, const std::string& name) { data_.at(n) = static_cast(type_->As()->GetEnumValue(name)); } template void ColumnEnum::Reserve(size_t new_cap) { data_.reserve(new_cap); } template void ColumnEnum::Append(ColumnRef column) { if (auto col = column->As>()) { data_.insert(data_.end(), col->data_.begin(), col->data_.end()); } } template bool ColumnEnum::LoadBody(InputStream* input, size_t rows) { data_.resize(rows); return WireFormat::ReadBytes(*input, data_.data(), data_.size() * sizeof(T)); } template void ColumnEnum::SaveBody(OutputStream* output) { WireFormat::WriteBytes(*output, data_.data(), data_.size() * sizeof(T)); } template size_t ColumnEnum::Size() const { return data_.size(); } template ColumnRef ColumnEnum::Slice(size_t begin, size_t len) const { return std::make_shared>(type_, SliceVector(data_, begin, len)); } template ColumnRef ColumnEnum::CloneEmpty() const { return std::make_shared>(type_); } template void ColumnEnum::Swap(Column& other) { auto & col = dynamic_cast &>(other); data_.swap(col.data_); } template ItemView ColumnEnum::GetItem(size_t index) const { return ItemView{type_->GetCode(), data_[index]}; } template class ColumnEnum; template class ColumnEnum; }