#pragma once #include #include #include #include #include namespace DB { /** Реализует часть интерфейса IDataType, общую для знаковых и беззнаковых чисел переменной длины * - ввод и вывод в текстовом и бинарном виде. * Остаётся лишь чисто виртуальный метод getName(). * * Параметры: FieldType - тип единичного значения, ColumnType - тип столбца со значениями. * (см. Core/Field.h, Columns/IColumn.h) */ template class IDataTypeNumberVariable : public IDataTypeNumber { public: void serializeBinary(const Field & field, WriteBuffer & ostr) const { writeVarT(static_cast(boost::get(field)), ostr); } void deserializeBinary(Field & field, ReadBuffer & istr) const { readVarT(static_cast(boost::get(field)), istr); } void serializeBinary(const IColumn & column, WriteBuffer & ostr) const { const typename ColumnType::Container_t & x = dynamic_cast(column).getData(); size_t size = x.size(); for (size_t i = 0; i < size; ++i) writeVarT(x[i], ostr); } void deserializeBinary(IColumn & column, ReadBuffer & istr, size_t limit) const { typename ColumnType::Container_t & x = dynamic_cast(column).getData(); x.resize(limit); size_t i = 0; while (i < limit && !istr.eof()) { readVarT(x[i], istr); ++i; } x.resize(i); } ColumnPtr createColumn() const { return new ColumnType; } ColumnPtr createConstColumn(size_t size, const Field & field) const { return new ColumnConst(size, boost::get(field)); } }; }