1//
2// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot 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/beast
8//
9
10#ifndef BOOST_BEAST_CORE_DETAIL_BUFFER_HPP
11#define BOOST_BEAST_CORE_DETAIL_BUFFER_HPP
12
13#include <boost/beast/core/error.hpp>
14#include <boost/asio/buffer.hpp>
15#include <boost/optional.hpp>
16#include <stdexcept>
17
18namespace boost {
19namespace beast {
20namespace detail {
21
22template<
23 class DynamicBuffer,
24 class ErrorValue>
25auto
26dynamic_buffer_prepare_noexcept(
27 DynamicBuffer& buffer,
28 std::size_t size,
29 error_code& ec,
30 ErrorValue ev) ->
31 boost::optional<typename
32 DynamicBuffer::mutable_buffers_type>
33{
34 if(buffer.max_size() - buffer.size() < size)
35 {
36 // length error
37 BOOST_BEAST_ASSIGN_EC(ec, ev);
38 return boost::none;
39 }
40 boost::optional<typename
41 DynamicBuffer::mutable_buffers_type> result;
42 result.emplace(buffer.prepare(size));
43 ec = {};
44 return result;
45}
46
47template<
48 class DynamicBuffer,
49 class ErrorValue>
50auto
51dynamic_buffer_prepare(
52 DynamicBuffer& buffer,
53 std::size_t size,
54 error_code& ec,
55 ErrorValue ev) ->
56 boost::optional<typename
57 DynamicBuffer::mutable_buffers_type>
58{
59#ifndef BOOST_NO_EXCEPTIONS
60 try
61 {
62 boost::optional<typename
63 DynamicBuffer::mutable_buffers_type> result;
64 result.emplace(buffer.prepare(size));
65 ec = {};
66 return result;
67 }
68 catch(std::length_error const&)
69 {
70 BOOST_BEAST_ASSIGN_EC(ec, ev);
71 }
72 return boost::none;
73
74#else
75 return dynamic_buffer_prepare_noexcept(
76 buffer, size, ec, ev);
77#endif
78}
79
80} // detail
81} // beast
82} // boost
83
84#endif
85

source code of boost/libs/beast/include/boost/beast/core/detail/buffer.hpp