LCOV - code coverage report
Current view: top level - boost/url/impl - decode_view.hpp (source / functions) Hit Total Coverage
Test: coverage_filtered.info Lines: 43 43 100.0 %
Date: 2024-03-12 19:37:18 Functions: 13 13 100.0 %

          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             :         , pos_(str)
      32             :         , space_as_plus_(
      33        6356 :             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 1.15