mirror of
https://github.com/Z3Prover/z3
synced 2025-04-22 00:26:38 +00:00
Migrate string_buffer
to use C++ smart pointer.
string_buffer class is now migrated to use smart pointers instead of manually allocated and deallocated memory. The `buffer` function decides and returns if the buffer is currently using initial buffer or the allocated buffer.
This commit is contained in:
parent
c1454dc31c
commit
c56a7dff1f
1 changed files with 21 additions and 28 deletions
|
@ -27,33 +27,32 @@
|
|||
// This string buffer will not use the heap if the data consumes less than INITIAL_SIZE bytes.
|
||||
template<unsigned INITIAL_SIZE=64>
|
||||
class string_buffer {
|
||||
char m_initial_buffer[INITIAL_SIZE];
|
||||
char * m_buffer;
|
||||
char m_initial_buffer[INITIAL_SIZE];
|
||||
std::unique_ptr<char[]> m_buffer = nullptr;
|
||||
size_t m_pos;
|
||||
size_t m_capacity;
|
||||
|
||||
void expand() {
|
||||
size_t new_capacity = m_capacity << 1;
|
||||
char * new_buffer = alloc_svect(char, new_capacity);
|
||||
memcpy(new_buffer, m_buffer, m_pos);
|
||||
if (m_capacity > INITIAL_SIZE) {
|
||||
dealloc_svect(m_buffer);
|
||||
}
|
||||
std::unique_ptr<char[]> new_buffer = std::make_unique<char[]>(new_capacity);
|
||||
memcpy(new_buffer.get(), buffer(), m_pos);
|
||||
m_buffer = std::move(new_buffer);
|
||||
m_capacity = new_capacity;
|
||||
m_buffer = new_buffer;
|
||||
}
|
||||
|
||||
char* buffer() {
|
||||
return m_buffer ? m_buffer.get() : m_initial_buffer;
|
||||
}
|
||||
|
||||
const char* buffer() const {
|
||||
return m_buffer ? m_buffer.get() : m_initial_buffer;
|
||||
}
|
||||
|
||||
public:
|
||||
string_buffer():
|
||||
m_buffer(m_initial_buffer),
|
||||
m_pos(0),
|
||||
m_capacity(INITIAL_SIZE) {
|
||||
}
|
||||
|
||||
~string_buffer() {
|
||||
if (m_capacity > INITIAL_SIZE) {
|
||||
dealloc_svect(m_buffer);
|
||||
}
|
||||
// Initially, no dynamic allocation, so m_buffer is null.
|
||||
}
|
||||
|
||||
void reset() {
|
||||
|
@ -64,28 +63,22 @@ public:
|
|||
if (m_pos >= m_capacity) {
|
||||
expand();
|
||||
}
|
||||
m_buffer[m_pos] = c;
|
||||
buffer()[m_pos] = c;
|
||||
m_pos++;
|
||||
}
|
||||
|
||||
void append(const char * str) {
|
||||
size_t len = strlen(str);
|
||||
size_t len = strlen(str);
|
||||
size_t new_pos = m_pos + len;
|
||||
while (new_pos > m_capacity) {
|
||||
expand();
|
||||
}
|
||||
memcpy(m_buffer + m_pos, str, len);
|
||||
memcpy(buffer() + m_pos, str, len);
|
||||
m_pos += len;
|
||||
}
|
||||
|
||||
void append(const std::string &str) {
|
||||
size_t len = str.size();
|
||||
size_t new_pos = m_pos + len;
|
||||
while (new_pos > m_capacity) {
|
||||
expand();
|
||||
}
|
||||
memcpy(m_buffer + m_pos, str.c_str(), len);
|
||||
m_pos += len;
|
||||
append(str.c_str());
|
||||
}
|
||||
|
||||
void append(int n) {
|
||||
|
@ -117,10 +110,10 @@ public:
|
|||
|
||||
const char * c_str() const {
|
||||
if (m_pos >= m_capacity) {
|
||||
const_cast<string_buffer * const>(this)->expand();
|
||||
const_cast<string_buffer*>(this)->expand();
|
||||
}
|
||||
const_cast<string_buffer * const>(this)->m_buffer[m_pos] = 0;
|
||||
return m_buffer;
|
||||
const_cast<string_buffer*>(this)->buffer()[m_pos] = 0;
|
||||
return buffer();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue