dbms: IO: modified count() and next() methods. [#CONV-2546].

This commit is contained in:
Alexey Milovidov 2011-06-24 21:08:26 +00:00
parent 61149dd093
commit 36e74d86b3
6 changed files with 37 additions and 23 deletions

View File

@ -33,7 +33,7 @@ public:
{
}
bool next()
bool nextImpl()
{
if (in.eof())
return false;
@ -59,7 +59,6 @@ public:
qlz_decompress(&compressed_buffer[0], &internal_buffer[0], scratch);
pos = working_buffer.begin();
working_buffer = Buffer(working_buffer.begin(), working_buffer.begin() + size_decompressed);
return true;

View File

@ -26,7 +26,7 @@ private:
public:
CompressedWriteBuffer(WriteBuffer & out_) : out(out_), compressed_bytes(0) {}
void next()
void nextImpl()
{
size_t uncompressed_size = pos - working_buffer.begin();
compressed_buffer.resize(uncompressed_size + QUICKLZ_ADDITIONAL_SPACE);
@ -41,11 +41,10 @@ public:
out.write(reinterpret_cast<const char *>(&checksum), sizeof(checksum));
out.write(&compressed_buffer[0], compressed_size);
pos = working_buffer.begin();
compressed_bytes += compressed_size;
}
/// Объём данных, которые были сжаты
/// Объём сжатых данных
size_t getCompressedBytes()
{
nextIfAtEnd();

View File

@ -18,7 +18,7 @@ namespace DB
* В отличие от std::istream, предоставляет доступ к внутреннему буферу,
* а также позволяет вручную управлять позицией внутри буфера.
*
* Наследники должны реализовать метод next().
* Наследники должны реализовать метод nextImpl().
*/
class ReadBuffer
{
@ -53,7 +53,13 @@ public:
/** прочитать следующие данные и заполнить ими буфер; переместить позицию в начало;
* вернуть false в случае конца, true иначе; кинуть исключение, если что-то не так
*/
virtual bool next() { return false; }
inline bool next()
{
bytes_read += pos - working_buffer.begin();
bool res = nextImpl();
pos = working_buffer.begin();
return res;
}
virtual ~ReadBuffer() {}
@ -73,10 +79,7 @@ public:
void ignore()
{
if (!eof())
{
++pos;
++bytes_read;
}
else
throw Exception("Attempt to read after eof", ErrorCodes::ATTEMPT_TO_READ_AFTER_EOF);
}
@ -88,7 +91,6 @@ public:
size_t bytes_to_ignore = std::min(static_cast<size_t>(working_buffer.end() - pos), n);
pos += bytes_to_ignore;
n -= bytes_to_ignore;
bytes_read += bytes_to_ignore;
}
if (n)
@ -108,7 +110,6 @@ public:
bytes_copied += bytes_to_copy;
}
bytes_read += bytes_copied;
return bytes_copied;
}
@ -120,9 +121,10 @@ public:
}
/** Сколько байт было прочитано из буфера. */
size_t count()
{
return bytes_read;
return bytes_read + pos - working_buffer.begin();
}
protected:
@ -132,6 +134,13 @@ protected:
private:
size_t bytes_read;
/** Прочитать следующие данные и заполнить ими буфер.
* Вернуть false в случае конца, true иначе.
* Кинуть исключение, если что-то не так.
*/
virtual bool nextImpl() { return false; };
};

View File

@ -20,11 +20,10 @@ private:
public:
ReadBufferFromIStream(std::istream & istr_) : istr(istr_) {}
bool next()
bool nextImpl()
{
istr.read(working_buffer.begin(), DEFAULT_READ_BUFFER_SIZE);
pos = working_buffer.begin();
working_buffer = Buffer(working_buffer.begin(), working_buffer.begin() + istr.gcount());
if (working_buffer.end() == working_buffer.begin())

View File

@ -15,7 +15,7 @@ namespace DB
* В отличие от std::ostream, предоставляет доступ к внутреннему буферу,
* а также позволяет вручную управлять позицией внутри буфера.
*
* Наследники должны реализовать метод next().
* Наследники должны реализовать метод nextImpl().
*/
class WriteBuffer
{
@ -51,7 +51,12 @@ public:
/** записать данные, находящиеся в буфере (от начала буфера до текущей позиции);
* переместить позицию в начало; кинуть исключение, если что-то не так
*/
virtual void next() {}
inline void next()
{
bytes_written += pos - working_buffer.begin();
nextImpl();
pos = working_buffer.begin();
}
/** желательно в наследниках поместить в деструктор вызов next(),
* чтобы последние данные записались
@ -78,8 +83,6 @@ public:
pos += bytes_to_copy;
bytes_copied += bytes_to_copy;
}
bytes_written += n;
}
@ -88,13 +91,13 @@ public:
nextIfAtEnd();
*pos = x;
++pos;
++bytes_written;
}
/** Сколько байт было записано в буфер. */
size_t count()
{
return bytes_written;
return bytes_written + pos - working_buffer.begin();
}
protected:
@ -104,6 +107,12 @@ protected:
private:
size_t bytes_written;
/** Записать данные, находящиеся в буфере (от начала буфера до текущей позиции).
* Кинуть исключение, если что-то не так.
*/
virtual void nextImpl() = 0;
};

View File

@ -20,11 +20,10 @@ private:
public:
WriteBufferFromOStream(std::ostream & ostr_) : ostr(ostr_) {}
void next()
void nextImpl()
{
ostr.write(working_buffer.begin(), pos - working_buffer.begin());
ostr.flush();
pos = working_buffer.begin();
if (!ostr.good())
throw Exception("Cannot write to ostream", ErrorCodes::CANNOT_WRITE_TO_OSTREAM);