#ifndef DBMS_DATA_TYPES_IDATATYPE_NUMBER_VARIABLE_H #define DBMS_DATA_TYPES_IDATATYPE_NUMBER_VARIABLE_H #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, std::ostream & ostr) const { writeVarT(boost::get(field), ostr); } void deserializeBinary(Field & field, std::istream & istr) const { readVarT(boost::get(field), istr); } void serializeBinary(const IColumn & column, std::ostream & 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, std::istream & istr, size_t limit) const { typename ColumnType::Container_t & x = dynamic_cast(column).getData(); x.resize(limit); for (size_t i = 0; i < limit; ++i) { readVarT(x[i], istr); if (istr.eof()) { x.resize(i); break; } else if (!istr.good()) throw Exception("Cannot read data from istream", ErrorCodes::CANNOT_READ_DATA_FROM_ISTREAM); } } SharedPtr createColumn() const { return new ColumnType; } }; } #endif