Line data Source code
1 : #ifndef OSTREAM_WRAPPER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 2 : #define OSTREAM_WRAPPER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 3 : 4 : #if defined(_MSC_VER) || \ 5 : (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \ 6 : (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 7 : #pragma once 8 : #endif 9 : 10 : #include <string> 11 : #include <vector> 12 : 13 : #include "yaml-cpp/dll.h" 14 : 15 : namespace YAML { 16 : class YAML_CPP_API ostream_wrapper { 17 : public: 18 : ostream_wrapper(); 19 : explicit ostream_wrapper(std::ostream& stream); 20 : ostream_wrapper(const ostream_wrapper&) = delete; 21 : ostream_wrapper(ostream_wrapper&&) = delete; 22 : ostream_wrapper& operator=(const ostream_wrapper&) = delete; 23 : ostream_wrapper& operator=(ostream_wrapper&&) = delete; 24 : ~ostream_wrapper(); 25 : 26 : void write(const std::string& str); 27 : void write(const char* str, std::size_t size); 28 : 29 : void set_comment() { m_comment = true; } 30 : 31 : const char* str() const { 32 : if (m_pStream) { 33 : return nullptr; 34 : } else { 35 : m_buffer[m_pos] = '\0'; 36 : return &m_buffer[0]; 37 : } 38 : } 39 : 40 : std::size_t row() const { return m_row; } 41 : std::size_t col() const { return m_col; } 42 : std::size_t pos() const { return m_pos; } 43 : bool comment() const { return m_comment; } 44 : 45 : private: 46 : void update_pos(char ch); 47 : 48 : private: 49 : mutable std::vector<char> m_buffer; 50 : std::ostream* const m_pStream; 51 : 52 : std::size_t m_pos; 53 : std::size_t m_row, m_col; 54 : bool m_comment; 55 : }; 56 : 57 : template <std::size_t N> 58 : inline ostream_wrapper& operator<<(ostream_wrapper& stream, 59 : const char (&str)[N]) { 60 : stream.write(str, N - 1); 61 : return stream; 62 : } 63 : 64 18426 : inline ostream_wrapper& operator<<(ostream_wrapper& stream, 65 : const std::string& str) { 66 18426 : stream.write(str); 67 18426 : return stream; 68 : } 69 : 70 : inline ostream_wrapper& operator<<(ostream_wrapper& stream, char ch) { 71 : stream.write(&ch, 1); 72 : return stream; 73 : } 74 : } // namespace YAML 75 : 76 : #endif // OSTREAM_WRAPPER_H_62B23520_7C8E_11DE_8A39_0800200C9A66