2011-12-30 17:57:02 +00:00
|
|
|
|
#pragma once
|
2011-06-27 18:22:14 +00:00
|
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
#define DBMS_DEFAULT_BUFFER_SIZE 1048576ULL
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
2012-06-21 18:43:29 +00:00
|
|
|
|
namespace detail
|
|
|
|
|
{
|
|
|
|
|
/** Замена std::vector<char> для использования в буферах.
|
|
|
|
|
* Отличается тем, что не делает лишний memset. (И почти ничего не делает.)
|
|
|
|
|
*/
|
|
|
|
|
struct Memory
|
|
|
|
|
{
|
|
|
|
|
size_t m_size;
|
|
|
|
|
char * m_data;
|
|
|
|
|
|
|
|
|
|
Memory() : m_size(0), m_data(NULL) {}
|
|
|
|
|
Memory(size_t size_) : m_size(size_), m_data(new char[m_size]) {}
|
|
|
|
|
|
|
|
|
|
~Memory()
|
|
|
|
|
{
|
|
|
|
|
if (m_data)
|
|
|
|
|
{
|
|
|
|
|
delete[] m_data;
|
|
|
|
|
m_data = NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t size() const { return m_size; }
|
|
|
|
|
const char & operator[](size_t i) const { return m_data[i]; }
|
|
|
|
|
char & operator[](size_t i) { return m_data[i]; }
|
|
|
|
|
|
|
|
|
|
/// Вызывают только чтобы увеличить размер буфера.
|
|
|
|
|
void resize(size_t new_size)
|
|
|
|
|
{
|
|
|
|
|
if (m_data)
|
|
|
|
|
delete[] m_data;
|
|
|
|
|
|
|
|
|
|
m_size = new_size;
|
|
|
|
|
m_data = new char[m_size];
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2011-06-27 18:22:14 +00:00
|
|
|
|
/** Буфер, который сам владеет своим куском памяти для работы.
|
|
|
|
|
* Аргумент шаблона - ReadBuffer или WriteBuffer
|
|
|
|
|
*/
|
|
|
|
|
template <typename Base>
|
|
|
|
|
class BufferWithOwnMemory : public Base
|
|
|
|
|
{
|
|
|
|
|
protected:
|
2012-06-21 18:43:29 +00:00
|
|
|
|
detail::Memory memory;
|
2011-06-27 18:22:14 +00:00
|
|
|
|
public:
|
2011-06-27 18:33:23 +00:00
|
|
|
|
BufferWithOwnMemory(size_t size = DBMS_DEFAULT_BUFFER_SIZE) : Base(NULL, 0), memory(size)
|
2011-06-27 18:22:14 +00:00
|
|
|
|
{
|
|
|
|
|
Base::set(&memory[0], size);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|