123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- //
- // Copyright (c) 2019 Damian Jarek(damian.jarek93@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/beast
- //
- #ifndef BOOST_BEAST_DETAIL_IMPL_TEMPORARY_BUFFER_IPP
- #define BOOST_BEAST_DETAIL_IMPL_TEMPORARY_BUFFER_IPP
- #include <boost/beast/core/detail/temporary_buffer.hpp>
- #include <boost/beast/core/detail/clamp.hpp>
- #include <boost/core/exchange.hpp>
- #include <boost/assert.hpp>
- #include <memory>
- #include <cstring>
- namespace boost {
- namespace beast {
- namespace detail {
- void
- temporary_buffer::
- append(string_view s)
- {
- grow(s.size());
- unchecked_append(s);
- }
- void
- temporary_buffer::
- append(string_view s1, string_view s2)
- {
- grow(s1.size() + s2.size());
- unchecked_append(s1);
- unchecked_append(s2);
- }
- void
- temporary_buffer::
- unchecked_append(string_view s)
- {
- auto n = s.size();
- std::memcpy(&data_[size_], s.data(), n);
- size_ += n;
- }
- void
- temporary_buffer::
- grow(std::size_t n)
- {
- if (capacity_ - size_ >= n)
- return;
- auto const capacity = (n + size_) * 2u;
- BOOST_ASSERT(! detail::sum_exceeds(
- n, size_, capacity));
- char* const p = new char[capacity];
- std::memcpy(p, data_, size_);
- deallocate(boost::exchange(data_, p));
- capacity_ = capacity;
- }
- } // detail
- } // beast
- } // boost
- #endif
|