diff --git a/include/yaml-cpp/emitter.h b/include/yaml-cpp/emitter.h index 28ece0a..754192d 100644 --- a/include/yaml-cpp/emitter.h +++ b/include/yaml-cpp/emitter.h @@ -25,6 +25,7 @@ namespace YAML { public: Emitter(); + explicit Emitter(std::ostream& stream); ~Emitter(); // output @@ -114,8 +115,8 @@ namespace YAML bool CanEmitNewline() const; private: - ostream_wrapper m_stream; std::auto_ptr m_pState; + ostream_wrapper m_stream; }; template diff --git a/include/yaml-cpp/ostream_wrapper.h b/include/yaml-cpp/ostream_wrapper.h index 2e5deb6..f2446a5 100644 --- a/include/yaml-cpp/ostream_wrapper.h +++ b/include/yaml-cpp/ostream_wrapper.h @@ -15,6 +15,7 @@ namespace YAML { public: ostream_wrapper(); + explicit ostream_wrapper(std::ostream& stream); ~ostream_wrapper(); void write(const std::string& str); @@ -23,8 +24,12 @@ namespace YAML void set_comment() { m_comment = true; } const char *str() const { - m_buffer[m_pos] = NULL; - return &m_buffer[0]; + if(m_pStream) { + return NULL; + } else { + m_buffer[m_pos] = NULL; + return &m_buffer[0]; + } } std::size_t row() const { return m_row; } @@ -37,6 +42,7 @@ namespace YAML private: mutable std::vector m_buffer; + std::ostream *m_pStream; std::size_t m_pos; std::size_t m_row, m_col; diff --git a/src/emitter.cpp b/src/emitter.cpp index ed5993a..7e0067a 100644 --- a/src/emitter.cpp +++ b/src/emitter.cpp @@ -11,6 +11,10 @@ namespace YAML { } + Emitter::Emitter(std::ostream& stream): m_pState(new EmitterState), m_stream(stream) + { + } + Emitter::~Emitter() { } diff --git a/src/ostream_wrapper.cpp b/src/ostream_wrapper.cpp index fe319e1..e30ac59 100644 --- a/src/ostream_wrapper.cpp +++ b/src/ostream_wrapper.cpp @@ -4,18 +4,26 @@ namespace YAML { - ostream_wrapper::ostream_wrapper(): m_pos(0), m_row(0), m_col(0), m_comment(false) + ostream_wrapper::ostream_wrapper(): m_pStream(0), m_pos(0), m_row(0), m_col(0), m_comment(false) { } + ostream_wrapper::ostream_wrapper(std::ostream& stream): m_pStream(&stream), m_pos(0), m_row(0), m_col(0), m_comment(false) + { + } + ostream_wrapper::~ostream_wrapper() { } void ostream_wrapper::write(const std::string& str) { - m_buffer.resize(std::max(m_buffer.size(), m_pos + str.size() + 1)); - std::copy(str.begin(), str.end(), &m_buffer[m_pos]); + if(m_pStream) { + m_pStream->write(str.c_str(), str.size()); + } else { + 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;iwrite(str, size); + } else { + 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