ClickHouse/dbms/include/DB/DataTypes/IDataTypeNumberFixed.h

64 lines
2.2 KiB
C
Raw Normal View History

2010-03-05 17:38:01 +00:00
#ifndef DBMS_DATA_TYPES_IDATATYPE_NUMBER_FIXED_H
#define DBMS_DATA_TYPES_IDATATYPE_NUMBER_FIXED_H
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
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
typename ColumnType::value_type x = boost::get<FieldType>(field);
2011-07-04 18:22:37 +00:00
writeIntBinary(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-07-04 18:22:37 +00:00
readIntBinary(x, istr);
2010-03-18 19:32:14 +00:00
field = typename NearestFieldType<FieldType>::Type(x);
2010-03-03 19:48:02 +00:00
}
2010-06-04 18:25:25 +00:00
void serializeBinary(const IColumn & column, WriteBuffer & ostr) 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();
2010-03-03 19:48:02 +00:00
ostr.write(reinterpret_cast<const char *>(&x[0]), sizeof(typename ColumnType::value_type) * x.size());
}
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
SharedPtr<IColumn> createColumn() const
{
return new ColumnType;
}
2010-03-03 19:48:02 +00:00
};
}
#endif