#pragma once #include /// std::isfinite #include #include #include namespace DB { /** Реализует часть интерфейса IDataType, общую для всяких чисел * - ввод и вывод в текстовом виде. */ template class IDataTypeNumber : public IDataType { public: typedef FType FieldType; bool isNumeric() const { return true; } bool behavesAsNumber() const { return true; } void serializeText(const Field & field, WriteBuffer & ostr) const { writeText(get::Type>(field), ostr); } inline void deserializeText(Field & field, ReadBuffer & istr) const; void serializeTextEscaped(const Field & field, WriteBuffer & ostr) const { serializeText(field, ostr); } void deserializeTextEscaped(Field & field, ReadBuffer & istr) const { deserializeText(field, istr); } void serializeTextQuoted(const Field & field, WriteBuffer & ostr) const { serializeText(field, ostr); } void deserializeTextQuoted(Field & field, ReadBuffer & istr) const { deserializeText(field, istr); } inline void serializeTextJSON(const Field & field, WriteBuffer & ostr) const; size_t getSizeOfField() const { return sizeof(FieldType); } Field getDefault() const { return typename NearestFieldType::Type(); } }; template inline void IDataTypeNumber::serializeTextJSON(const Field & field, WriteBuffer & ostr) const { serializeText(field, ostr); } template <> inline void IDataTypeNumber::serializeTextJSON(const Field & field, WriteBuffer & ostr) const { writeChar('"', ostr); serializeText(field, ostr); writeChar('"', ostr); } template <> inline void IDataTypeNumber::serializeTextJSON(const Field & field, WriteBuffer & ostr) const { writeChar('"', ostr); serializeText(field, ostr); writeChar('"', ostr); } template <> inline void IDataTypeNumber::serializeTextJSON(const Field & field, WriteBuffer & ostr) const { if (likely(std::isfinite(get(field)))) serializeText(field, ostr); else writeCString("null", ostr); } template <> inline void IDataTypeNumber::serializeTextJSON(const Field & field, WriteBuffer & ostr) const { if (likely(std::isfinite(get(field)))) serializeText(field, ostr); else writeCString("null", ostr); } template inline void IDataTypeNumber::deserializeText(Field & field, ReadBuffer & istr) const { typename NearestFieldType::Type x; readIntTextUnsafe(x, istr); field = x; } template <> inline void IDataTypeNumber::deserializeText(Field & field, ReadBuffer & istr) const { Float64 x; readText(x, istr); field = x; } template <> inline void IDataTypeNumber::deserializeText(Field & field, ReadBuffer & istr) const { Float64 x; readText(x, istr); field = x; } }