ostream_wrapper.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "yaml-cpp/ostream_wrapper.h"
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <iostream>
  5. namespace YAML {
  6. ostream_wrapper::ostream_wrapper()
  7. : m_buffer(1, '\0'),
  8. m_pStream(nullptr),
  9. m_pos(0),
  10. m_row(0),
  11. m_col(0),
  12. m_comment(false) {}
  13. ostream_wrapper::ostream_wrapper(std::ostream& stream)
  14. : m_buffer{},
  15. m_pStream(&stream),
  16. m_pos(0),
  17. m_row(0),
  18. m_col(0),
  19. m_comment(false) {}
  20. ostream_wrapper::~ostream_wrapper() = default;
  21. void ostream_wrapper::write(const std::string& str) {
  22. if (m_pStream) {
  23. m_pStream->write(str.c_str(), str.size());
  24. } else {
  25. m_buffer.resize(std::max(m_buffer.size(), m_pos + str.size() + 1));
  26. std::copy(str.begin(), str.end(), m_buffer.begin() + m_pos);
  27. }
  28. for (char ch : str) {
  29. update_pos(ch);
  30. }
  31. }
  32. void ostream_wrapper::write(const char* str, std::size_t size) {
  33. if (m_pStream) {
  34. m_pStream->write(str, size);
  35. } else {
  36. m_buffer.resize(std::max(m_buffer.size(), m_pos + size + 1));
  37. std::copy(str, str + size, m_buffer.begin() + m_pos);
  38. }
  39. for (std::size_t i = 0; i < size; i++) {
  40. update_pos(str[i]);
  41. }
  42. }
  43. void ostream_wrapper::update_pos(char ch) {
  44. m_pos++;
  45. m_col++;
  46. if (ch == '\n') {
  47. m_row++;
  48. m_col = 0;
  49. m_comment = false;
  50. }
  51. }
  52. } // namespace YAML