Take the output adapter by reference at the serializer ctor

Per review: the serializer still holds the adapter as a non-owning
pointer, but the constructor now takes output_adapter_protocol<char>&
and takes its address internally, so every call site passes a
reference. A reference cannot be null and reads as a borrow, which
makes the lifetime contract harder to get wrong than handing over a
raw pointer. The stored member and the write path are unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XAYM1qhSA2FDaDcGfPW3fG
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
Niels Lohmann
2026-09-10 19:01:02 +02:00
co-authored by Claude
parent c5e2a95ff1
commit 07f1b20e26
4 changed files with 11 additions and 11 deletions
+5 -5
View File
@@ -21425,12 +21425,12 @@ class serializer
being threaded through every call to @ref dump, @ref dump_internal and
@ref dump_iteratively.
*/
serializer(output_adapter_protocol<char>* s, const char ichar,
serializer(output_adapter_protocol<char>& s, const char ichar,
const bool pretty_print_ = false,
const bool ensure_ascii_ = false,
const std::size_t indent_step_ = 0,
error_handler_t error_handler_ = error_handler_t::strict)
: o(s)
: o(&s)
, locale(std::localeconv())
, indent_char(ichar)
, pretty_print(pretty_print_)
@@ -24743,13 +24743,13 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
if (indent >= 0)
{
serializer s(&string_adapter, indent_char,
serializer s(string_adapter, indent_char,
true, ensure_ascii, static_cast<std::size_t>(indent), error_handler);
s.dump(*this);
}
else
{
serializer s(&string_adapter, indent_char,
serializer s(string_adapter, indent_char,
false, ensure_ascii, 0, error_handler);
s.dump(*this);
}
@@ -27481,7 +27481,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
// do the actual serialization
detail::output_stream_adapter<char> stream_adapter(o);
serializer s(&stream_adapter, o.fill(),
serializer s(stream_adapter, o.fill(),
pretty_print, false, static_cast<std::size_t>(indentation));
s.dump(j);
return o;