ClickHouse/dbms/include/DB/IO/HexWriteBuffer.h

46 lines
1021 B
C
Raw Normal View History

#pragma once
#include <DB/IO/BufferWithOwnMemory.h>
#include <DB/IO/WriteBuffer.h>
2011-11-29 18:53:44 +00:00
/// Так как HexWriteBuffer часто создаётся во внутреннем цикле, сделаем у него размер буфера маленьким.
2011-11-29 17:23:30 +00:00
#define DBMS_HEX_WRITE_BUFFER_SIZE 32
namespace DB
{
/** Всё что в него пишут, переводит в HEX (большими буквами) и пишет в другой WriteBuffer.
*/
2011-11-29 17:23:30 +00:00
class HexWriteBuffer : public WriteBuffer
{
protected:
2011-11-29 17:23:30 +00:00
char buf[DBMS_HEX_WRITE_BUFFER_SIZE];
WriteBuffer & out;
void nextImpl()
{
if (!offset())
return;
2011-11-29 17:23:30 +00:00
for (Position p = working_buffer.begin(); p != pos; ++p)
{
2011-11-29 17:23:30 +00:00
out.write("0123456789ABCDEF"[static_cast<unsigned char>(*p) >> 4]);
out.write("0123456789ABCDEF"[static_cast<unsigned char>(*p) & 0xF]);
}
}
public:
2011-11-29 17:23:30 +00:00
HexWriteBuffer(WriteBuffer & out_) : WriteBuffer(buf, sizeof(buf)), out(out_) {}
~HexWriteBuffer()
{
if (!std::uncaught_exception())
nextImpl();
}
};
}