Coverage Report

Created: 2025-06-13 06:26

/src/boost/boost/json/serializer.hpp
Line
Count
Source (jump to first uncovered line)
1
//
2
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3
//
4
// Distributed under the Boost Software License, Version 1.0. (See accompanying
5
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
//
7
// Official repository: https://github.com/boostorg/json
8
//
9
10
#ifndef BOOST_JSON_SERIALIZER_HPP
11
#define BOOST_JSON_SERIALIZER_HPP
12
13
#include <boost/json/detail/config.hpp>
14
#include <boost/json/detail/format.hpp>
15
#include <boost/json/detail/stream.hpp>
16
#include <boost/json/detail/writer.hpp>
17
#include <boost/json/serialize_options.hpp>
18
#include <boost/json/value.hpp>
19
20
namespace boost {
21
namespace json {
22
23
/** A serializer for JSON.
24
25
    This class traverses an instance of a library
26
    type and emits serialized JSON text by filling
27
    in one or more caller-provided buffers. To use,
28
    declare a variable and call @ref reset with
29
    a pointer to the variable you want to serialize.
30
    Then call @ref read over and over until
31
    @ref done returns `true`.
32
33
    @par Example
34
35
    This demonstrates how the serializer may
36
    be used to print a JSON value to an output
37
    stream.
38
39
    @code
40
41
    void print( std::ostream& os, value const& jv)
42
    {
43
        serializer sr;
44
        sr.reset( &jv );
45
        while( ! sr.done() )
46
        {
47
            char buf[ 4000 ];
48
            os << sr.read( buf );
49
        }
50
    }
51
52
    @endcode
53
54
    @par Thread Safety
55
56
    The same instance may not be accessed concurrently.
57
*/
58
class serializer
59
    : detail::writer
60
{
61
    using fn_t = bool (*)(writer&, detail::stream&);
62
63
    fn_t fn0_ = nullptr;
64
    fn_t fn1_ = nullptr;
65
    bool done_ = false;
66
67
public:
68
    /// Move constructor (deleted)
69
    serializer(serializer&&) = delete;
70
71
    /** Destructor
72
73
        All temporary storage is deallocated.
74
75
        @par Complexity
76
        Constant
77
78
        @par Exception Safety
79
        No-throw guarantee.
80
    */
81
#ifdef BOOST_JSON_DOCS
82
    BOOST_JSON_DECL
83
    ~serializer() noexcept;
84
#endif // BOOST_JSON_DOCS
85
86
    /** Constructor
87
88
        This constructs a serializer with no value.
89
        The value may be set later by calling @ref reset.
90
        If serialization is attempted with no value,
91
        the output is as if a null value is serialized.
92
93
        @par Complexity
94
        Constant.
95
96
        @par Exception Safety
97
        No-throw guarantee.
98
99
        @param opts The options for the serializer. If this parameter
100
        is omitted, the serializer will output only standard JSON.
101
    */
102
    BOOST_JSON_DECL
103
    serializer( serialize_options const& opts = {} ) noexcept;
104
105
    /** Constructor
106
107
        This constructs a serializer with no value.
108
        The value may be set later by calling @ref reset.
109
        If serialization is attempted with no value,
110
        the output is as if a null value is serialized.
111
112
        @par Complexity
113
        Constant.
114
115
        @par Exception Safety
116
        No-throw guarantee.
117
118
        @param sp A pointer to the `boost::container::pmr::memory_resource` to
119
        use when producing partial output. Shared ownership of the memory
120
        resource is retained until the serializer is destroyed.
121
122
        @param buf An optional static buffer to
123
        use for temporary storage when producing
124
        partial output.
125
126
        @param buf_size The number of bytes of
127
        valid memory pointed to by `buf`.
128
129
        @param opts The options for the serializer. If this parameter
130
        is omitted, the serializer will output only standard JSON.
131
    */
132
    BOOST_JSON_DECL
133
    serializer(
134
        storage_ptr sp,
135
        unsigned char* buf = nullptr,
136
        std::size_t buf_size = 0,
137
        serialize_options const& opts = {}) noexcept;
138
139
    /** Returns `true` if the serialization is complete
140
141
        This function returns `true` when all of the
142
        characters in the serialized representation of
143
        the value have been read.
144
145
        @par Complexity
146
        Constant.
147
148
        @par Exception Safety
149
        No-throw guarantee.
150
    */
151
    bool
152
    done() const noexcept
153
0
    {
154
0
        return done_;
155
0
    }
156
157
    /** Reset the serializer for a new element
158
159
        This function prepares the serializer to emit
160
        a new serialized JSON representing `*p`.
161
        Any internally allocated memory is
162
        preserved and re-used for the new output.
163
164
        @param p A pointer to the element to serialize.
165
        Ownership is not transferred; The caller is
166
        responsible for ensuring that the lifetime of
167
        `*p` extends until it is no longer needed.
168
    */
169
    /** @{ */
170
    BOOST_JSON_DECL
171
    void
172
    reset(value const* p) noexcept;
173
174
    BOOST_JSON_DECL
175
    void
176
    reset(array const* p) noexcept;
177
178
    BOOST_JSON_DECL
179
    void
180
    reset(object const* p) noexcept;
181
182
    BOOST_JSON_DECL
183
    void
184
    reset(string const* p) noexcept;
185
186
    template<class T>
187
    void
188
    reset(T const* p) noexcept;
189
    /** @} */
190
191
    /** Reset the serializer for a new string
192
193
        This function prepares the serializer to emit
194
        a new serialized JSON representing the string.
195
        Any internally allocated memory is
196
        preserved and re-used for the new output.
197
198
        @param sv The characters representing the string.
199
        Ownership is not transferred; The caller is
200
        responsible for ensuring that the lifetime of
201
        the characters reference by `sv` extends
202
        until it is no longer needed.
203
    */
204
    BOOST_JSON_DECL
205
    void
206
    reset(string_view sv) noexcept;
207
208
    /** Reset the serializer for std::nullptr_t
209
210
        This function prepares the serializer to emit
211
        a new serialized JSON representing null.
212
        Any internally allocated memory is
213
        preserved and re-used for the new output.
214
    */
215
    BOOST_JSON_DECL
216
    void
217
    reset(std::nullptr_t) noexcept;
218
219
    /** Read the next buffer of serialized JSON
220
221
        This function attempts to fill the caller
222
        provided buffer starting at `dest` with
223
        up to `size` characters of the serialized
224
        JSON that represents the value. If the
225
        buffer is not large enough, multiple calls
226
        may be required.
227
\n
228
        If serialization completes during this call;
229
        that is, that all of the characters belonging
230
        to the serialized value have been written to
231
        caller-provided buffers, the function
232
        @ref done will return `true`.
233
234
        @par Preconditions
235
        @code
236
        this->done() == false
237
        @endcode
238
239
        @par Complexity
240
        Linear in `size`.
241
242
        @par Exception Safety
243
        Basic guarantee.
244
        Calls to `memory_resource::allocate` may throw.
245
246
        @return A @ref string_view containing the
247
        characters written, which may be less than
248
        `size`.
249
250
        @param dest A pointer to valid memory of at
251
        least `size` bytes.
252
253
        @param size The maximum number of characters
254
        to write to the memory pointed to by `dest`.
255
    */
256
    BOOST_JSON_DECL
257
    string_view
258
    read(char* dest, std::size_t size);
259
260
    /** Read the next buffer of serialized JSON
261
262
        This function allows reading into a
263
        character array, with a deduced maximum size.
264
265
        @par Preconditions
266
        @code
267
        this->done() == false
268
        @endcode
269
270
        @par Effects
271
        @code
272
        return this->read( dest, N );
273
        @endcode
274
275
        @par Complexity
276
        Linear in `N`.
277
278
        @par Exception Safety
279
        Basic guarantee.
280
        Calls to `memory_resource::allocate` may throw.
281
282
        @return A @ref string_view containing the
283
        characters written, which may be less than
284
        `size`.
285
286
        @param dest The character array to write to.
287
    */
288
    template<std::size_t N>
289
    string_view
290
    read(char(&dest)[N])
291
0
    {
292
0
        return read(dest, N);
293
0
    }
294
295
#ifndef BOOST_JSON_DOCS
296
    // Safety net for accidental buffer overflows
297
    template<std::size_t N>
298
    string_view
299
    read(char(&dest)[N], std::size_t n)
300
    {
301
        // If this goes off, check your parameters
302
        // closely, chances are you passed an array
303
        // thinking it was a pointer.
304
        BOOST_ASSERT(n <= N);
305
        return read(dest, n);
306
    }
307
#endif
308
};
309
310
} // namespace json
311
} // namespace boost
312
313
#include <boost/json/impl/serializer.hpp>
314
315
#endif