| #pragma once |
| |
| #include <algorithm> // copy |
| #include <cstddef> // size_t |
| #include <ios> // streamsize |
| #include <iterator> // back_inserter |
| #include <memory> // shared_ptr, make_shared |
| #include <ostream> // basic_ostream |
| #include <string> // basic_string |
| #include <vector> // vector |
| #include <nlohmann/detail/macro_scope.hpp> |
| |
| namespace nlohmann |
| { |
| namespace detail |
| { |
| /// abstract output adapter interface |
| template<typename CharType> struct output_adapter_protocol |
| { |
| virtual void write_character(CharType c) = 0; |
| virtual void write_characters(const CharType* s, std::size_t length) = 0; |
| virtual ~output_adapter_protocol() = default; |
| }; |
| |
| /// a type to simplify interfaces |
| template<typename CharType> |
| using output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>; |
| |
| /// output adapter for byte vectors |
| template<typename CharType> |
| class output_vector_adapter : public output_adapter_protocol<CharType> |
| { |
| public: |
| explicit output_vector_adapter(std::vector<CharType>& vec) noexcept |
| : v(vec) |
| {} |
| |
| void write_character(CharType c) override |
| { |
| v.push_back(c); |
| } |
| |
| JSON_HEDLEY_NON_NULL(2) |
| void write_characters(const CharType* s, std::size_t length) override |
| { |
| std::copy(s, s + length, std::back_inserter(v)); |
| } |
| |
| private: |
| std::vector<CharType>& v; |
| }; |
| |
| /// output adapter for output streams |
| template<typename CharType> |
| class output_stream_adapter : public output_adapter_protocol<CharType> |
| { |
| public: |
| explicit output_stream_adapter(std::basic_ostream<CharType>& s) noexcept |
| : stream(s) |
| {} |
| |
| void write_character(CharType c) override |
| { |
| stream.put(c); |
| } |
| |
| JSON_HEDLEY_NON_NULL(2) |
| void write_characters(const CharType* s, std::size_t length) override |
| { |
| stream.write(s, static_cast<std::streamsize>(length)); |
| } |
| |
| private: |
| std::basic_ostream<CharType>& stream; |
| }; |
| |
| /// output adapter for basic_string |
| template<typename CharType, typename StringType = std::basic_string<CharType>> |
| class output_string_adapter : public output_adapter_protocol<CharType> |
| { |
| public: |
| explicit output_string_adapter(StringType& s) noexcept |
| : str(s) |
| {} |
| |
| void write_character(CharType c) override |
| { |
| str.push_back(c); |
| } |
| |
| JSON_HEDLEY_NON_NULL(2) |
| void write_characters(const CharType* s, std::size_t length) override |
| { |
| str.append(s, length); |
| } |
| |
| private: |
| StringType& str; |
| }; |
| |
| template<typename CharType, typename StringType = std::basic_string<CharType>> |
| class output_adapter |
| { |
| public: |
| output_adapter(std::vector<CharType>& vec) |
| : oa(std::make_shared<output_vector_adapter<CharType>>(vec)) {} |
| |
| output_adapter(std::basic_ostream<CharType>& s) |
| : oa(std::make_shared<output_stream_adapter<CharType>>(s)) {} |
| |
| output_adapter(StringType& s) |
| : oa(std::make_shared<output_string_adapter<CharType, StringType>>(s)) {} |
| |
| operator output_adapter_t<CharType>() |
| { |
| return oa; |
| } |
| |
| private: |
| output_adapter_t<CharType> oa = nullptr; |
| }; |
| } // namespace detail |
| } // namespace nlohmann |