From e6d4a915dcd41b9c90b9fb64128f32c1d39dfc22 Mon Sep 17 00:00:00 2001 From: Jesse Beder Date: Fri, 25 May 2012 18:17:14 -0500 Subject: [PATCH] Switched the ostream wrapper to wrap a std::vector instead of our manually managed memory --- include/yaml-cpp/ostream_wrapper.h | 14 +++++----- src/ostream_wrapper.cpp | 41 +++++------------------------- util/sandbox.cpp | 3 ++- 3 files changed, 17 insertions(+), 41 deletions(-) diff --git a/include/yaml-cpp/ostream_wrapper.h b/include/yaml-cpp/ostream_wrapper.h index fb40f18..2e5deb6 100644 --- a/include/yaml-cpp/ostream_wrapper.h +++ b/include/yaml-cpp/ostream_wrapper.h @@ -7,6 +7,7 @@ #include +#include namespace YAML { @@ -16,13 +17,15 @@ namespace YAML ostream_wrapper(); ~ostream_wrapper(); - void reserve(std::size_t size); void write(const std::string& str); void write(const char *str, std::size_t size); - void put(char ch); void set_comment() { m_comment = true; } - const char *str() const { return m_buffer; } + + const char *str() const { + m_buffer[m_pos] = NULL; + return &m_buffer[0]; + } std::size_t row() const { return m_row; } std::size_t col() const { return m_col; } @@ -33,10 +36,9 @@ namespace YAML void update_pos(char ch); private: - char *m_buffer; + mutable std::vector m_buffer; + std::size_t m_pos; - std::size_t m_size; - std::size_t m_row, m_col; bool m_comment; }; diff --git a/src/ostream_wrapper.cpp b/src/ostream_wrapper.cpp index 58432ae..fe319e1 100644 --- a/src/ostream_wrapper.cpp +++ b/src/ostream_wrapper.cpp @@ -1,37 +1,21 @@ #include "yaml-cpp/ostream_wrapper.h" #include +#include namespace YAML { - ostream_wrapper::ostream_wrapper(): m_buffer(0), m_pos(0), m_size(0), m_row(0), m_col(0), m_comment(false) + ostream_wrapper::ostream_wrapper(): m_pos(0), m_row(0), m_col(0), m_comment(false) { - reserve(1024); } ostream_wrapper::~ostream_wrapper() { - delete [] m_buffer; } - void ostream_wrapper::reserve(std::size_t size) - { - if(size <= m_size) - return; - - char *newBuffer = new char[size]; - std::memset(newBuffer, 0, size * sizeof(char)); - std::memcpy(newBuffer, m_buffer, m_size * sizeof(char)); - delete [] m_buffer; - m_buffer = newBuffer; - m_size = size; - } - void ostream_wrapper::write(const std::string& str) { - while(m_pos + str.size() + 1 >= m_size) - reserve(m_size * 2); - - std::copy(str.begin(), str.end(), m_buffer + m_pos); + m_buffer.resize(std::max(m_buffer.size(), m_pos + str.size() + 1)); + std::copy(str.begin(), str.end(), &m_buffer[m_pos]); for(std::size_t i=0;i= m_size) - reserve(m_size * 2); - - std::copy(str, str + size, m_buffer + m_pos); + m_buffer.resize(std::max(m_buffer.size(), m_pos + size + 1)); + std::copy(str, str + size, &m_buffer[m_pos]); for(std::size_t i=0;i= m_size - 1) // an extra space for the NULL terminator - reserve(m_size * 2); - - m_buffer[m_pos] = ch; - update_pos(ch); - } - void ostream_wrapper::update_pos(char ch) { m_pos++; @@ -83,7 +56,7 @@ namespace YAML ostream_wrapper& operator << (ostream_wrapper& out, char ch) { - out.put(ch); + out.write(&ch, 1); return out; } } diff --git a/util/sandbox.cpp b/util/sandbox.cpp index be24ae1..63b0146 100644 --- a/util/sandbox.cpp +++ b/util/sandbox.cpp @@ -5,7 +5,8 @@ int main() { YAML::Emitter out; out << YAML::BeginSeq; - out << ':'; + out << "item 1"; + out << YAML::BeginSeq << "foo 1" << "bar 2" << YAML::EndSeq; out << YAML::EndSeq; std::cout << out.c_str() << "\n";