LCOV - code coverage report
Current view: top level - url/impl - url.hpp (source / functions) Coverage Total Hit Missed
Test: coverage_remapped.info Lines: 97.4 % 76 74 2
Test Date: 2026-02-25 21:00:01 Functions: 91.7 % 12 11 1

           TLA  Line data    Source code
       1                 : //
       2                 : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
       3                 : // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
       4                 : //
       5                 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       6                 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       7                 : //
       8                 : // Official repository: https://github.com/boostorg/url
       9                 : //
      10                 : 
      11                 : #ifndef BOOST_URL_IMPL_URL_HPP
      12                 : #define BOOST_URL_IMPL_URL_HPP
      13                 : 
      14                 : #include <boost/url/detail/except.hpp>
      15                 : #include <boost/assert.hpp>
      16                 : #include <cstring>
      17                 : 
      18                 : namespace boost {
      19                 : namespace urls {
      20                 : 
      21                 : //------------------------------------------------
      22                 : 
      23                 : inline
      24 HIT        5609 : url::
      25            5609 : ~url()
      26                 : {
      27            5609 :     if(s_)
      28                 :     {
      29            3663 :         BOOST_ASSERT(
      30                 :             cap_ != 0);
      31            3663 :         deallocate(s_);
      32                 :     }
      33            5609 : }
      34                 : 
      35                 : // construct empty
      36                 : inline
      37            1108 : url::
      38                 : url() noexcept = default;
      39                 : 
      40                 : inline
      41             636 : url::
      42             636 : url(core::string_view s)
      43             636 :     : url(parse_uri_reference(s
      44             636 :         ).value(BOOST_URL_POS))
      45                 : {
      46             636 : }
      47                 : 
      48                 : inline
      49            1503 : url::
      50            1503 : url(url&& u) noexcept
      51            1503 :     : url_base(u.impl_)
      52                 : {
      53            1503 :     s_ = u.s_;
      54            1503 :     cap_ = u.cap_;
      55            1503 :     u.s_ = nullptr;
      56            1503 :     u.cap_ = 0;
      57            1503 :     u.impl_ = {from::url};
      58            1503 : }
      59                 : 
      60                 : inline
      61                 : url&
      62             383 : url::
      63                 : operator=(url&& u) noexcept
      64                 : {
      65             383 :     if(s_)
      66               2 :         deallocate(s_);
      67             383 :     impl_ = u.impl_;
      68             383 :     s_ = u.s_;
      69             383 :     cap_ = u.cap_;
      70             383 :     u.s_ = nullptr;
      71             383 :     u.cap_ = 0;
      72             383 :     u.impl_ = {from::url};
      73             383 :     return *this;
      74                 : }
      75                 : 
      76                 : //------------------------------------------------
      77                 : 
      78                 : inline
      79                 : char*
      80            4697 : url::
      81                 : allocate(std::size_t n)
      82                 : {
      83            4697 :     auto s = new char[n + 1];
      84            4697 :     cap_ = n;
      85            4697 :     return s;
      86                 : }
      87                 : 
      88                 : inline
      89                 : void
      90            4697 : url::
      91                 : deallocate(char* s)
      92                 : {
      93            4697 :     delete[] s;
      94            4697 : }
      95                 : 
      96                 : inline
      97                 : void
      98             119 : url::
      99                 : clear_impl() noexcept
     100                 : {
     101             119 :     if(s_)
     102                 :     {
     103                 :         // preserve capacity
     104               2 :         impl_ = {from::url};
     105               2 :         s_[0] = '\0';
     106               2 :         impl_.cs_ = s_;
     107                 :     }
     108                 :     else
     109                 :     {
     110             117 :         BOOST_ASSERT(impl_.cs_[0] == 0);
     111                 :     }
     112             119 : }
     113                 : 
     114                 : inline
     115                 : void
     116            5907 : url::
     117                 : reserve_impl(
     118                 :     std::size_t n,
     119                 :     op_t& op)
     120                 : {
     121            5907 :     if(n > max_size())
     122 MIS           0 :         detail::throw_length_error();
     123 HIT        5907 :     if(n <= cap_)
     124            1210 :         return;
     125                 :     char* s;
     126            4697 :     if(s_ != nullptr)
     127                 :     {
     128                 :         // 50% growth policy
     129            1032 :         auto const h = cap_ / 2;
     130                 :         std::size_t new_cap;
     131            1032 :         if(cap_ <= max_size() - h)
     132            1032 :             new_cap = cap_ + h;
     133                 :         else
     134 MIS           0 :             new_cap = max_size();
     135 HIT        1032 :         if( new_cap < n)
     136             495 :             new_cap = n;
     137            1032 :         s = allocate(new_cap);
     138            1032 :         std::memcpy(s, s_, size() + 1);
     139            1032 :         BOOST_ASSERT(! op.old);
     140            1032 :         op.old = s_;
     141            1032 :         s_ = s;
     142                 :     }
     143                 :     else
     144                 :     {
     145            3665 :         s_ = allocate(n);
     146            3665 :         s_[0] = '\0';
     147                 :     }
     148            4697 :     impl_.cs_ = s_;
     149                 : }
     150                 : 
     151                 : inline
     152                 : void
     153            1032 : url::
     154                 : cleanup(
     155                 :     op_t& op)
     156                 : {
     157            1032 :     if(op.old)
     158            1032 :         deallocate(op.old);
     159            1032 : }
     160                 : 
     161                 : //------------------------------------------------
     162                 : 
     163                 : inline
     164                 : void
     165               2 : url::
     166                 : swap(url& other) noexcept
     167                 : {
     168               2 :     if (this == &other)
     169               1 :         return;
     170               1 :     std::swap(s_, other.s_);
     171               1 :     std::swap(cap_, other.cap_);
     172               1 :     std::swap(impl_, other.impl_);
     173               1 :     std::swap(external_impl_, other.external_impl_);
     174                 : }
     175                 : 
     176                 : } // urls
     177                 : } // boost
     178                 : 
     179                 : #endif
        

Generated by: LCOV version 2.3