148 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			148 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| 
								 | 
							
								//     __ _____ _____ _____
							 | 
						||
| 
								 | 
							
								//  __|  |   __|     |   | |  JSON for Modern C++
							 | 
						||
| 
								 | 
							
								// |  |  |__   |  |  | | | |  version 3.11.3
							 | 
						||
| 
								 | 
							
								// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
							 | 
						||
| 
								 | 
							
								// SPDX-License-Identifier: MIT
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <algorithm> // copy
							 | 
						||
| 
								 | 
							
								#include <cstddef> // size_t
							 | 
						||
| 
								 | 
							
								#include <iterator> // back_inserter
							 | 
						||
| 
								 | 
							
								#include <memory> // shared_ptr, make_shared
							 | 
						||
| 
								 | 
							
								#include <string> // basic_string
							 | 
						||
| 
								 | 
							
								#include <vector> // vector
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef JSON_NO_IO
							 | 
						||
| 
								 | 
							
								    #include <ios>      // streamsize
							 | 
						||
| 
								 | 
							
								    #include <ostream>  // basic_ostream
							 | 
						||
| 
								 | 
							
								#endif  // JSON_NO_IO
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <nlohmann/detail/macro_scope.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								NLOHMANN_JSON_NAMESPACE_BEGIN
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    output_adapter_protocol() = default;
							 | 
						||
| 
								 | 
							
								    output_adapter_protocol(const output_adapter_protocol&) = default;
							 | 
						||
| 
								 | 
							
								    output_adapter_protocol(output_adapter_protocol&&) noexcept = default;
							 | 
						||
| 
								 | 
							
								    output_adapter_protocol& operator=(const output_adapter_protocol&) = default;
							 | 
						||
| 
								 | 
							
								    output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = 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, typename AllocatorType = std::allocator<CharType>>
							 | 
						||
| 
								 | 
							
								class output_vector_adapter : public output_adapter_protocol<CharType>
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  public:
							 | 
						||
| 
								 | 
							
								    explicit output_vector_adapter(std::vector<CharType, AllocatorType>& 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
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        v.insert(v.end(), s, s + length);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  private:
							 | 
						||
| 
								 | 
							
								    std::vector<CharType, AllocatorType>& v;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef JSON_NO_IO
							 | 
						||
| 
								 | 
							
								/// 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;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								#endif  // JSON_NO_IO
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// 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:
							 | 
						||
| 
								 | 
							
								    template<typename AllocatorType = std::allocator<CharType>>
							 | 
						||
| 
								 | 
							
								    output_adapter(std::vector<CharType, AllocatorType>& vec)
							 | 
						||
| 
								 | 
							
								        : oa(std::make_shared<output_vector_adapter<CharType, AllocatorType>>(vec)) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef JSON_NO_IO
							 | 
						||
| 
								 | 
							
								    output_adapter(std::basic_ostream<CharType>& s)
							 | 
						||
| 
								 | 
							
								        : oa(std::make_shared<output_stream_adapter<CharType>>(s)) {}
							 | 
						||
| 
								 | 
							
								#endif  // JSON_NO_IO
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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
							 | 
						||
| 
								 | 
							
								NLOHMANN_JSON_NAMESPACE_END
							 |