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
|
|
|
|
* - ввод и вывод в текстовом и бинарном виде.
|
|
|
|
|
* Остаётся лишь чисто виртуальный метод getName().
|
|
|
|
|
*
|
|
|
|
|
* Параметры: FieldType - тип единичного значения, ColumnType - тип столбца со значениями.
|
|
|
|
|
* (см. Field.h, Column.h)
|
|
|
|
|
*/
|
|
|
|
|
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:
|
|
|
|
|
/** Формат платформозависимый (зависит от представления данных в памяти).
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
void serializeBinary(const Field & field, std::ostream & ostr) const
|
|
|
|
|
{
|
|
|
|
|
/// ColumnType::value_type - более узкий тип. Например, UInt8, когда тип Field - UInt64
|
|
|
|
|
typename ColumnType::value_type x = boost::get<FieldType>(field);
|
|
|
|
|
ostr.write(reinterpret_cast<const char *>(&x), sizeof(x));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void deserializeBinary(Field & field, std::istream & istr) const
|
|
|
|
|
{
|
|
|
|
|
typename ColumnType::value_type x;
|
|
|
|
|
istr.read(reinterpret_cast<char *>(&x), sizeof(x));
|
|
|
|
|
field = x;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void serializeBinary(const Column & column, std::ostream & ostr) const
|
|
|
|
|
{
|
|
|
|
|
const ColumnType & x = boost::get<ColumnType>(column);
|
|
|
|
|
ostr.write(reinterpret_cast<const char *>(&x[0]), sizeof(typename ColumnType::value_type) * x.size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void deserializeBinary(Column & column, std::istream & istr, size_t limit) const
|
|
|
|
|
{
|
|
|
|
|
ColumnType & x = boost::get<ColumnType>(column);
|
|
|
|
|
x.resize(limit);
|
|
|
|
|
istr.read(reinterpret_cast<char*>(&x[0]), sizeof(typename ColumnType::value_type) * limit);
|
|
|
|
|
x.resize(istr.gcount());
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|