ClickHouse/dbms/include/DB/DataTypes/IDataTypeNumberVariable.h
2011-11-06 00:59:37 +00:00

71 lines
1.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <DB/Core/Exception.h>
#include <DB/Core/ErrorCodes.h>
#include <DB/IO/VarInt.h>
#include <DB/Columns/ColumnConst.h>
#include <DB/DataTypes/IDataTypeNumber.h>
namespace DB
{
/** Реализует часть интерфейса IDataType, общую для знаковых и беззнаковых чисел переменной длины
* - ввод и вывод в текстовом и бинарном виде.
* Остаётся лишь чисто виртуальный метод getName().
*
* Параметры: FieldType - тип единичного значения, ColumnType - тип столбца со значениями.
* (см. Core/Field.h, Columns/IColumn.h)
*/
template <typename FieldType, typename ColumnType>
class IDataTypeNumberVariable : public IDataTypeNumber<FieldType>
{
public:
void serializeBinary(const Field & field, WriteBuffer & ostr) const
{
writeVarT(static_cast<typename ColumnType::value_type>(boost::get<FieldType>(field)), ostr);
}
void deserializeBinary(Field & field, ReadBuffer & istr) const
{
readVarT(static_cast<typename ColumnType::value_type &>(boost::get<FieldType &>(field)), istr);
}
void serializeBinary(const IColumn & column, WriteBuffer & ostr) const
{
const typename ColumnType::Container_t & x = dynamic_cast<const ColumnType &>(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<ColumnType &>(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<FieldType>(size, boost::get<FieldType>(field));
}
};
}