#ifndef SIMDJSON_CONVERT_INL_H #define SIMDJSON_CONVERT_INL_H #include "simdjson/convert.h" #if SIMDJSON_SUPPORTS_CONCEPTS namespace simdjson { namespace convert { namespace internal { // auto_parser method definitions template inline auto_parser::auto_parser(parser_type &&parser, ondemand::document &&doc) noexcept requires(!std::is_pointer_v) : m_parser{std::move(parser)}, m_doc{std::move(doc)} {} template inline auto_parser::auto_parser(parser_type &&parser, padded_string_view const str) noexcept requires(!std::is_pointer_v) : m_parser{std::move(parser)}, m_doc{}, m_error{SUCCESS} { m_error = m_parser.iterate(str).get(m_doc); } template inline auto_parser::auto_parser(std::remove_pointer_t &parser, ondemand::document &&doc) noexcept requires(std::is_pointer_v) : m_parser{&parser}, m_doc{std::move(doc)} {} template inline auto_parser::auto_parser(std::remove_pointer_t &parser, padded_string_view const str) noexcept requires(std::is_pointer_v) : m_parser{&parser}, m_doc{}, m_error{SUCCESS} { m_error = m_parser->iterate(str).get(m_doc); } template inline auto_parser::auto_parser(padded_string_view const str) noexcept requires(std::is_pointer_v) : auto_parser{ondemand::parser::get_parser(), str} {} template inline auto_parser::auto_parser(parser_type parser, ondemand::document &&doc) noexcept requires(std::is_pointer_v) : auto_parser{*parser, std::move(doc)} {} template inline std::remove_pointer_t &auto_parser::parser() noexcept { if constexpr (std::is_pointer_v) { return *m_parser; } else { return m_parser; } } template template inline simdjson_result auto_parser::result() noexcept(is_nothrow_gettable) { if (m_error != SUCCESS) { return m_error; } return m_doc.get(); } template template simdjson_warn_unused simdjson_inline error_code auto_parser::get(T &value) && noexcept(is_nothrow_gettable) { return result().get(value); } template inline simdjson_result auto_parser::array() noexcept { return result(); } template inline simdjson_result auto_parser::object() noexcept { return result(); } template inline simdjson_result auto_parser::number() noexcept { return result(); } #if SIMDJSON_EXCEPTIONS template template inline auto_parser::operator T() noexcept(false) { if (m_error != SUCCESS) { throw simdjson_error(m_error); } return m_doc.get(); } #endif // SIMDJSON_EXCEPTIONS template template inline std::optional auto_parser::optional() noexcept(is_nothrow_gettable) { if (m_error != SUCCESS) { return std::nullopt; } T value; if (m_doc.get().get(value)) [[unlikely]] { return std::nullopt; } return {std::move(value)}; } // to_adaptor method definitions template inline T to_adaptor::operator()(simdjson_result &val) const noexcept { return val.get(); } template inline auto to_adaptor::operator()(padded_string_view const str) const noexcept { return auto_parser{str}; } template inline auto to_adaptor::operator()(ondemand::parser &parser, padded_string_view const str) const noexcept { return auto_parser{parser, str}; } } // namespace internal } // namespace convert } // namespace simdjson #endif // SIMDJSON_SUPPORTS_CONCEPTS #endif // SIMDJSON_CONVERT_INL_H