2011-08-09 17:24:17 +00:00
|
|
|
|
#pragma once
|
2010-03-03 19:48:02 +00:00
|
|
|
|
|
|
|
|
|
#include <Poco/BinaryWriter.h>
|
|
|
|
|
#include <Poco/BinaryReader.h>
|
|
|
|
|
|
2010-03-05 17:38:01 +00:00
|
|
|
|
#include <DB/DataTypes/IDataTypeNumber.h>
|
2010-03-03 19:48:02 +00:00
|
|
|
|
|
2011-08-12 18:27:39 +00:00
|
|
|
|
#include <DB/Columns/ColumnConst.h>
|
|
|
|
|
|
2010-03-03 19:48:02 +00:00
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
2010-03-05 17:38:01 +00:00
|
|
|
|
/** Реализует часть интерфейса IDataType, общую для всяких чисел фиксированной ширины
|
2010-03-03 19:48:02 +00:00
|
|
|
|
* - ввод и вывод в текстовом и бинарном виде.
|
2010-05-21 19:52:50 +00:00
|
|
|
|
* Остаётся лишь чисто виртуальный метод getName() и clone().
|
2010-03-03 19:48:02 +00:00
|
|
|
|
*
|
|
|
|
|
* Параметры: FieldType - тип единичного значения, ColumnType - тип столбца со значениями.
|
2010-03-12 18:25:35 +00:00
|
|
|
|
* (см. Core/Field.h, Columns/IColumn.h)
|
2010-03-03 19:48:02 +00:00
|
|
|
|
*/
|
|
|
|
|
template <typename FieldType, typename ColumnType>
|
2010-03-05 17:38:01 +00:00
|
|
|
|
class IDataTypeNumberFixed : public IDataTypeNumber<FieldType>
|
2010-03-03 19:48:02 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
/** Формат платформозависимый (зависит от представления данных в памяти).
|
|
|
|
|
*/
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
void serializeBinary(const Field & field, WriteBuffer & ostr) const
|
2010-03-03 19:48:02 +00:00
|
|
|
|
{
|
|
|
|
|
/// ColumnType::value_type - более узкий тип. Например, UInt8, когда тип Field - UInt64
|
2011-08-12 18:27:39 +00:00
|
|
|
|
typename ColumnType::value_type x = boost::get<typename NearestFieldType<FieldType>::Type>(field);
|
2011-08-09 17:24:17 +00:00
|
|
|
|
writeBinary(x, ostr);
|
2010-03-03 19:48:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
void deserializeBinary(Field & field, ReadBuffer & istr) const
|
2010-03-03 19:48:02 +00:00
|
|
|
|
{
|
|
|
|
|
typename ColumnType::value_type x;
|
2011-08-09 17:24:17 +00:00
|
|
|
|
readBinary(x, istr);
|
2010-03-18 19:32:14 +00:00
|
|
|
|
field = typename NearestFieldType<FieldType>::Type(x);
|
2010-03-03 19:48:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
2012-12-11 20:31:39 +00:00
|
|
|
|
void serializeBinary(const IColumn & column, WriteBuffer & ostr, size_t offset = 0, size_t limit = 0) const
|
2010-03-03 19:48:02 +00:00
|
|
|
|
{
|
2010-03-12 18:25:35 +00:00
|
|
|
|
const typename ColumnType::Container_t & x = dynamic_cast<const ColumnType &>(column).getData();
|
2012-07-18 18:27:42 +00:00
|
|
|
|
|
|
|
|
|
size_t size = x.size();
|
|
|
|
|
|
2012-12-11 20:31:39 +00:00
|
|
|
|
if (limit == 0 || offset + limit > size)
|
|
|
|
|
limit = size - offset;
|
2012-07-19 18:37:18 +00:00
|
|
|
|
|
2012-12-11 20:31:39 +00:00
|
|
|
|
ostr.write(reinterpret_cast<const char *>(&x[offset]), sizeof(typename ColumnType::value_type) * limit);
|
2010-03-03 19:48:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-06-04 18:25:25 +00:00
|
|
|
|
void deserializeBinary(IColumn & column, ReadBuffer & istr, size_t limit) const
|
2010-03-03 19:48:02 +00:00
|
|
|
|
{
|
2010-03-12 18:25:35 +00:00
|
|
|
|
typename ColumnType::Container_t & x = dynamic_cast<ColumnType &>(column).getData();
|
2010-03-03 19:48:02 +00:00
|
|
|
|
x.resize(limit);
|
2010-06-04 18:25:25 +00:00
|
|
|
|
size_t size = istr.read(reinterpret_cast<char*>(&x[0]), sizeof(typename ColumnType::value_type) * limit);
|
|
|
|
|
x.resize(size / sizeof(typename ColumnType::value_type));
|
2010-03-03 19:48:02 +00:00
|
|
|
|
}
|
2010-03-18 19:32:14 +00:00
|
|
|
|
|
2011-08-09 19:19:00 +00:00
|
|
|
|
ColumnPtr createColumn() const
|
2010-03-18 19:32:14 +00:00
|
|
|
|
{
|
|
|
|
|
return new ColumnType;
|
|
|
|
|
}
|
2011-08-12 18:27:39 +00:00
|
|
|
|
|
|
|
|
|
ColumnPtr createConstColumn(size_t size, const Field & field) const
|
|
|
|
|
{
|
|
|
|
|
return new ColumnConst<FieldType>(size, boost::get<typename NearestFieldType<FieldType>::Type>(field));
|
|
|
|
|
}
|
2010-03-03 19:48:02 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2011-08-09 17:24:17 +00:00
|
|
|
|
}
|