• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //     __ _____ _____ _____
2 //  __|  |   __|     |   | |  JSON for Modern C++
3 // |  |  |__   |  |  | | | |  version 3.11.2
4 // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5 //
6 // SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
7 // SPDX-License-Identifier: MIT
8 
9 #pragma once
10 
11 #include <algorithm> // copy
12 #include <cstddef> // size_t
13 #include <iterator> // back_inserter
14 #include <memory> // shared_ptr, make_shared
15 #include <string> // basic_string
16 #include <vector> // vector
17 
18 #ifndef JSON_NO_IO
19     #include <ios>      // streamsize
20     #include <ostream>  // basic_ostream
21 #endif  // JSON_NO_IO
22 
23 #include <nlohmann/detail/macro_scope.hpp>
24 
25 NLOHMANN_JSON_NAMESPACE_BEGIN
26 namespace detail
27 {
28 
29 /// abstract output adapter interface
30 template<typename CharType> struct output_adapter_protocol
31 {
32     virtual void write_character(CharType c) = 0;
33     virtual void write_characters(const CharType* s, std::size_t length) = 0;
34     virtual ~output_adapter_protocol() = default;
35 
36     output_adapter_protocol() = default;
37     output_adapter_protocol(const output_adapter_protocol&) = default;
38     output_adapter_protocol(output_adapter_protocol&&) noexcept = default;
39     output_adapter_protocol& operator=(const output_adapter_protocol&) = default;
40     output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = default;
41 };
42 
43 /// a type to simplify interfaces
44 template<typename CharType>
45 using output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>;
46 
47 /// output adapter for byte vectors
48 template<typename CharType, typename AllocatorType = std::allocator<CharType>>
49 class output_vector_adapter : public output_adapter_protocol<CharType>
50 {
51   public:
output_vector_adapter(std::vector<CharType,AllocatorType> & vec)52     explicit output_vector_adapter(std::vector<CharType, AllocatorType>& vec) noexcept
53         : v(vec)
54     {}
55 
write_character(CharType c)56     void write_character(CharType c) override
57     {
58         v.push_back(c);
59     }
60 
61     JSON_HEDLEY_NON_NULL(2)
write_characters(const CharType * s,std::size_t length)62     void write_characters(const CharType* s, std::size_t length) override
63     {
64         v.insert(v.end(), s, s + length);
65     }
66 
67   private:
68     std::vector<CharType, AllocatorType>& v;
69 };
70 
71 #ifndef JSON_NO_IO
72 /// output adapter for output streams
73 template<typename CharType>
74 class output_stream_adapter : public output_adapter_protocol<CharType>
75 {
76   public:
output_stream_adapter(std::basic_ostream<CharType> & s)77     explicit output_stream_adapter(std::basic_ostream<CharType>& s) noexcept
78         : stream(s)
79     {}
80 
write_character(CharType c)81     void write_character(CharType c) override
82     {
83         stream.put(c);
84     }
85 
86     JSON_HEDLEY_NON_NULL(2)
write_characters(const CharType * s,std::size_t length)87     void write_characters(const CharType* s, std::size_t length) override
88     {
89         stream.write(s, static_cast<std::streamsize>(length));
90     }
91 
92   private:
93     std::basic_ostream<CharType>& stream;
94 };
95 #endif  // JSON_NO_IO
96 
97 /// output adapter for basic_string
98 template<typename CharType, typename StringType = std::basic_string<CharType>>
99 class output_string_adapter : public output_adapter_protocol<CharType>
100 {
101   public:
output_string_adapter(StringType & s)102     explicit output_string_adapter(StringType& s) noexcept
103         : str(s)
104     {}
105 
write_character(CharType c)106     void write_character(CharType c) override
107     {
108         str.push_back(c);
109     }
110 
111     JSON_HEDLEY_NON_NULL(2)
write_characters(const CharType * s,std::size_t length)112     void write_characters(const CharType* s, std::size_t length) override
113     {
114         str.append(s, length);
115     }
116 
117   private:
118     StringType& str;
119 };
120 
121 template<typename CharType, typename StringType = std::basic_string<CharType>>
122 class output_adapter
123 {
124   public:
125     template<typename AllocatorType = std::allocator<CharType>>
output_adapter(std::vector<CharType,AllocatorType> & vec)126     output_adapter(std::vector<CharType, AllocatorType>& vec)
127         : oa(std::make_shared<output_vector_adapter<CharType, AllocatorType>>(vec)) {}
128 
129 #ifndef JSON_NO_IO
output_adapter(std::basic_ostream<CharType> & s)130     output_adapter(std::basic_ostream<CharType>& s)
131         : oa(std::make_shared<output_stream_adapter<CharType>>(s)) {}
132 #endif  // JSON_NO_IO
133 
output_adapter(StringType & s)134     output_adapter(StringType& s)
135         : oa(std::make_shared<output_string_adapter<CharType, StringType>>(s)) {}
136 
operator output_adapter_t<CharType>()137     operator output_adapter_t<CharType>()
138     {
139         return oa;
140     }
141 
142   private:
143     output_adapter_t<CharType> oa = nullptr;
144 };
145 
146 }  // namespace detail
147 NLOHMANN_JSON_NAMESPACE_END
148