.. _program_listing_file_zeep_streambuf.hpp: Program Listing for File streambuf.hpp ====================================== |exhale_lsh| :ref:`Return to documentation for file ` (``zeep/streambuf.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp // Copyright Maarten L. Hekkelman, 2020 // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #pragma once #include #include #include #include namespace zeep { // -------------------------------------------------------------------- class char_streambuf : public std::streambuf { public: char_streambuf(const char* buffer, size_t length) : m_begin(buffer), m_end(buffer + length), m_current(buffer) { assert(std::less_equal()(m_begin, m_end)); } char_streambuf(const char* buffer) : m_begin(buffer), m_end(buffer + strlen(buffer)), m_current(buffer) { } char_streambuf(const char_streambuf&) = delete; char_streambuf &operator=(const char_streambuf&) = delete; private: int_type underflow() { if (m_current == m_end) return traits_type::eof(); return traits_type::to_int_type(*m_current); } int_type uflow() { if (m_current == m_end) return traits_type::eof(); return traits_type::to_int_type(*m_current++); } int_type pbackfail(int_type ch) { if (m_current == m_begin or (ch != traits_type::eof() and ch != m_current[-1])) return traits_type::eof(); return traits_type::to_int_type(*--m_current); } std::streamsize showmanyc() { assert(std::less_equal()(m_current, m_end)); return m_end - m_current; } pos_type seekoff(std::streambuf::off_type off, std::ios_base::seekdir dir, std::ios_base::openmode /*which*/) { switch (dir) { case std::ios_base::beg: m_current = m_begin + off; break; case std::ios_base::end: m_current = m_end + off; break; case std::ios_base::cur: m_current += off; break; default: break; } if (m_current < m_begin) m_current = m_begin; if (m_current > m_end) m_current = m_end; return m_current - m_begin; } pos_type seekpos(std::streambuf::pos_type pos, std::ios_base::openmode /*which*/) { m_current = m_begin + pos; if (m_current < m_begin) m_current = m_begin; if (m_current > m_end) m_current = m_end; return m_current - m_begin; } private: const char* const m_begin; const char* const m_end; const char* m_current; }; } // namespace zeep