Line data Source code
1 : // 2 : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.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/CPPAlliance/http_proto 8 : // 9 : 10 : #ifndef BOOST_HTTP_PROTO_DETAIL_MOVE_CHARS_HPP 11 : #define BOOST_HTTP_PROTO_DETAIL_MOVE_CHARS_HPP 12 : 13 : #include <boost/core/detail/string_view.hpp> 14 : #include <cstring> 15 : #include <functional> 16 : 17 : namespace boost { 18 : namespace http_proto { 19 : namespace detail { 20 : 21 : // Moves characters, and adjusts any passed 22 : // views if they point to any moved characters. 23 : 24 : // true if s completely overlapped by buf 25 : inline 26 : bool 27 62 : is_overlapping( 28 : core::string_view buf, 29 : core::string_view s) noexcept 30 : { 31 62 : auto const b0 = buf.data(); 32 62 : auto const e0 = b0 + buf.size(); 33 62 : auto const b1 = s.data(); 34 62 : auto const e1 = b1 + s.size(); 35 : auto const less_equal = 36 : std::less_equal<char const*>(); 37 62 : if(less_equal(e0, b1)) 38 16 : return false; 39 46 : if(less_equal(e1, b0)) 40 40 : return false; 41 : // partial overlap is undefined 42 6 : BOOST_ASSERT(less_equal(e1, e0)); 43 6 : BOOST_ASSERT(less_equal(b0, b1)); 44 6 : return true; 45 : } 46 : 47 : inline 48 : void 49 38 : move_chars_impl( 50 : std::ptrdiff_t, 51 : core::string_view const&) noexcept 52 : { 53 38 : } 54 : 55 : template<class... Sn> 56 : void 57 76 : move_chars_impl( 58 : std::ptrdiff_t d, 59 : core::string_view const& buf, 60 : core::string_view* s, 61 : Sn&&... sn) noexcept 62 : { 63 138 : if( s != nullptr && 64 62 : is_overlapping(buf, *s)) 65 : { 66 6 : *s = { s->data() + d, s->size() }; 67 : } 68 76 : move_chars_impl(d, buf, sn...); 69 76 : } 70 : 71 : template<class... Args> 72 : void 73 38 : move_chars( 74 : char* dest, 75 : char const* src, 76 : std::size_t n, 77 : Args&&... args) noexcept 78 : { 79 38 : move_chars_impl( 80 : dest - src, 81 : core::string_view(src, n), 82 : args...); 83 38 : std::memmove( 84 : dest, src, n); 85 38 : } 86 : 87 : } // detail 88 : } // http_proto 89 : } // boost 90 : 91 : #endif