| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 | //// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)//// Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//// Official repository: https://github.com/boostorg/json//#ifndef BOOST_JSON_IMPL_PARSER_IPP#define BOOST_JSON_IMPL_PARSER_IPP#include <boost/json/parser.hpp>#include <boost/json/basic_parser_impl.hpp>#include <boost/json/error.hpp>#include <cstring>#include <stdexcept>#include <utility>BOOST_JSON_NS_BEGINparser::parser(    storage_ptr sp,    parse_options const& opt,    unsigned char* buffer,    std::size_t size) noexcept    : p_(        opt,        std::move(sp),        buffer,        size){    reset();}parser::parser(    storage_ptr sp,    parse_options const& opt) noexcept    : p_(        opt,        std::move(sp),        nullptr,        0){    reset();}voidparser::reset(storage_ptr sp) noexcept{    p_.reset();    p_.handler().st.reset(sp);}std::size_tparser::write_some(    char const* data,    std::size_t size,    error_code& ec){    auto const n = p_.write_some(        false, data, size, ec);    BOOST_ASSERT(ec || p_.done());    return n;}std::size_tparser::write_some(    char const* data,    std::size_t size){    error_code ec;    auto const n = write_some(        data, size, ec);    if(ec)        detail::throw_system_error(ec,            BOOST_JSON_SOURCE_POS);    return n;}std::size_tparser::write(    char const* data,    std::size_t size,    error_code& ec){    auto const n = write_some(        data, size, ec);    if(! ec && n < size)    {        ec = error::extra_data;        p_.fail(ec);    }    return n;}std::size_tparser::write(    char const* data,    std::size_t size){    error_code ec;    auto const n = write(        data, size, ec);    if(ec)        detail::throw_system_error(ec,            BOOST_JSON_SOURCE_POS);    return n;}valueparser::release(){    if( ! p_.done())    {        // prevent undefined behavior        if(! p_.last_error())            p_.fail(error::incomplete);        detail::throw_system_error(            p_.last_error(),            BOOST_JSON_SOURCE_POS);    }    return p_.handler().st.release();}BOOST_JSON_NS_END#endif
 |