LCOV - code coverage report
Current view: top level - boost/url/impl/decode_view.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 44 44
Test Date: 2024-09-08 09:46:47 Functions: 100.0 % 13 13

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2022 Alan de Freitas (alandefreitas@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/boostorg/url
       8              : //
       9              : 
      10              : #ifndef BOOST_URL_IMPL_PCT_ENCODED_VIEW_HPP
      11              : #define BOOST_URL_IMPL_PCT_ENCODED_VIEW_HPP
      12              : 
      13              : #include <boost/url/grammar/type_traits.hpp>
      14              : #include <boost/static_assert.hpp>
      15              : 
      16              : namespace boost {
      17              : namespace urls {
      18              : 
      19              : class decode_view::iterator
      20              : {
      21              :     char const* begin_ = nullptr;
      22              :     char const* pos_ = nullptr;
      23              :     bool space_as_plus_ = true;
      24              : 
      25              :     friend decode_view;
      26              : 
      27         6356 :     iterator(
      28              :         char const* str,
      29              :         bool space_as_plus) noexcept
      30         6356 :         : begin_(str)
      31         6356 :         , pos_(str)
      32         6356 :         , space_as_plus_(
      33              :             space_as_plus)
      34              :     {
      35         6356 :     }
      36              : 
      37              :     // end ctor
      38          885 :     iterator(
      39              :         char const* str,
      40              :         size_type n,
      41              :         bool space_as_plus) noexcept
      42          885 :         : begin_(str)
      43          885 :         , pos_(str + n)
      44          885 :         , space_as_plus_(space_as_plus)
      45              :     {
      46          885 :     }
      47              : 
      48              : public:
      49              :     using value_type = char;
      50              :     using reference = char;
      51              :     using pointer = void const*;
      52              :     using const_reference = char;
      53              :     using size_type = std::size_t;
      54              :     using difference_type = std::ptrdiff_t;
      55              :     using iterator_category =
      56              :         std::bidirectional_iterator_tag;
      57              : 
      58            2 :     iterator() = default;
      59              : 
      60              :     iterator(iterator const&) = default;
      61              : 
      62              :     iterator&
      63              :     operator=(iterator const&) = default;
      64              : 
      65              :     BOOST_URL_DECL
      66              :     reference
      67              :     operator*() const noexcept;
      68              : 
      69              :     iterator&
      70         4835 :     operator++() noexcept
      71              :     {
      72         4835 :         BOOST_ASSERT(pos_ != nullptr);
      73         4835 :         if (*pos_ != '%')
      74         4538 :             ++pos_;
      75              :         else
      76          297 :             pos_ += 3;
      77         4835 :         return *this;
      78              :     }
      79              : 
      80              :     iterator&
      81         1182 :     operator--() noexcept
      82              :     {
      83         1182 :         BOOST_ASSERT(pos_ != begin_);
      84         1182 :         if (pos_ - begin_ < 3 ||
      85          679 :                 pos_[-3] != '%')
      86         1130 :             --pos_;
      87              :         else
      88           52 :             pos_ -= 3;
      89         1182 :         return *this;
      90              :     }
      91              : 
      92              :     iterator
      93         4668 :     operator++(int) noexcept
      94              :     {
      95         4668 :         auto tmp = *this;
      96         4668 :         ++*this;
      97         4668 :         return tmp;
      98              :     }
      99              : 
     100              :     iterator
     101              :     operator--(int) noexcept
     102              :     {
     103              :         auto tmp = *this;
     104              :         --*this;
     105              :         return tmp;
     106              :     }
     107              : 
     108              :     char const*
     109            7 :     base()
     110              :     {
     111            7 :         return pos_;
     112              :     }
     113              : 
     114              :     bool
     115         2992 :     operator==(
     116              :         iterator const& other) const noexcept
     117              :     {
     118         2992 :         return pos_ == other.pos_;
     119              :     }
     120              : 
     121              :     bool
     122         1962 :     operator!=(
     123              :         iterator const& other) const noexcept
     124              :     {
     125         1962 :         return !(*this == other);
     126              :     }
     127              : };
     128              : 
     129              : //------------------------------------------------
     130              : 
     131              : inline
     132              : auto
     133         6356 : decode_view::
     134              : begin() const noexcept ->
     135              :     const_iterator
     136              : {
     137         6356 :     return {p_, space_as_plus_};
     138              : }
     139              : 
     140              : inline
     141              : auto
     142          885 : decode_view::
     143              : end() const noexcept ->
     144              :     const_iterator
     145              : {
     146          885 :     return {p_, n_, space_as_plus_};
     147              : }
     148              : 
     149              : inline
     150              : auto
     151            3 : decode_view::
     152              : front() const noexcept ->
     153              :     const_reference
     154              : {
     155            3 :     BOOST_ASSERT( !empty() );
     156            3 :     return *begin();
     157              : }
     158              : 
     159              : inline
     160              : auto
     161            3 : decode_view::
     162              : back() const noexcept ->
     163              :     const_reference
     164              : {
     165            3 :     BOOST_ASSERT( !empty() );
     166            3 :     return *--end();
     167              : }
     168              : 
     169              : } // urls
     170              : } // boost
     171              : 
     172              : #endif
        

Generated by: LCOV version 2.1