LCOV - code coverage report
Current view: top level - libs/url/src/detail - normalize.hpp (source / functions) Hit Total Coverage
Test: coverage_filtered.info Lines: 13 13 100.0 %
Date: 2024-03-05 20:06:56 Functions: 4 4 100.0 %

          Line data    Source code
       1             : //
       2             : // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot 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_DETAIL_NORMALIZED_HPP
      12             : #define BOOST_URL_DETAIL_NORMALIZED_HPP
      13             : 
      14             : #include <boost/core/detail/string_view.hpp>
      15             : #include "boost/url/segments_encoded_view.hpp"
      16             : 
      17             : namespace boost {
      18             : namespace urls {
      19             : namespace detail {
      20             : 
      21             : class fnv_1a
      22             : {
      23             : public:
      24             :     using digest_type = std::size_t;
      25             : 
      26             : #if BOOST_URL_ARCH == 64
      27             :     static constexpr std::size_t const prime =
      28             :         static_cast<std::size_t>(0x100000001B3ULL);
      29             :     static constexpr std::size_t init_hash  =
      30             :         static_cast<std::size_t>(0xcbf29ce484222325ULL);
      31             : #else
      32             :     static constexpr std::size_t const prime =
      33             :         static_cast<std::size_t>(0x01000193UL);
      34             :     static constexpr std::size_t init_hash  =
      35             :         static_cast<std::size_t>(0x811C9DC5UL);
      36             : #endif
      37             : 
      38             :     explicit
      39         276 :     fnv_1a(std::size_t salt) noexcept
      40         276 :     : h_(init_hash + salt)
      41             :     {
      42         276 :     }
      43             : 
      44             :     void
      45        3840 :     put(char c) noexcept
      46             :     {
      47        3840 :         h_ ^= c;
      48        3840 :         h_ *= prime;
      49        3840 :     }
      50             : 
      51             :     void
      52         276 :     put(core::string_view s) noexcept
      53             :     {
      54         294 :         for (char c: s)
      55             :         {
      56          18 :             put(c);
      57             :         }
      58         276 :     }
      59             : 
      60             :     digest_type
      61         276 :     digest() const noexcept
      62             :     {
      63         276 :         return h_;
      64             :     }
      65             : 
      66             : private:
      67             :     std::size_t h_;
      68             : };
      69             : 
      70             : void
      71             : pop_encoded_front(
      72             :     core::string_view& s,
      73             :     char& c,
      74             :     std::size_t& n) noexcept;
      75             : 
      76             : // compare two core::string_views as if they are both
      77             : // percent-decoded
      78             : int
      79             : compare_encoded(
      80             :     core::string_view lhs,
      81             :     core::string_view rhs) noexcept;
      82             : 
      83             : // digest a core::string_view as if it were
      84             : // percent-decoded
      85             : void
      86             : digest_encoded(
      87             :     core::string_view s,
      88             :     fnv_1a& hasher) noexcept;
      89             : 
      90             : void
      91             : digest(
      92             :     core::string_view s,
      93             :     fnv_1a& hasher) noexcept;
      94             : 
      95             : // check if core::string_view lhs starts with core::string_view
      96             : // rhs as if they are both percent-decoded. If
      97             : // lhs starts with rhs, return number of chars
      98             : // matched in the encoded core::string_view
      99             : std::size_t
     100             : path_starts_with(
     101             :     core::string_view lhs,
     102             :     core::string_view rhs) noexcept;
     103             : 
     104             : // check if core::string_view lhs ends with core::string_view
     105             : // rhs as if they are both percent-decoded. If
     106             : // lhs ends with rhs, return number of chars
     107             : // matched in the encoded core::string_view
     108             : std::size_t
     109             : path_ends_with(
     110             :     core::string_view lhs,
     111             :     core::string_view rhs) noexcept;
     112             : 
     113             : // compare two core::string_views as if they are both
     114             : // percent-decoded and lowercase
     115             : int
     116             : ci_compare_encoded(
     117             :     core::string_view lhs,
     118             :     core::string_view rhs) noexcept;
     119             : 
     120             : // digest a core::string_view as if it were decoded
     121             : // and lowercase
     122             : void
     123             : ci_digest_encoded(
     124             :     core::string_view s,
     125             :     fnv_1a& hasher) noexcept;
     126             : 
     127             : // compare two ascii core::string_views
     128             : int
     129             : compare(
     130             :     core::string_view lhs,
     131             :     core::string_view rhs) noexcept;
     132             : 
     133             : // compare two core::string_views as if they are both
     134             : // lowercase
     135             : int
     136             : ci_compare(
     137             :     core::string_view lhs,
     138             :     core::string_view rhs) noexcept;
     139             : 
     140             : // digest a core::string_view as if it were lowercase
     141             : void
     142             : ci_digest(
     143             :     core::string_view s,
     144             :     fnv_1a& hasher) noexcept;
     145             : 
     146             : BOOST_URL_DECL
     147             : std::size_t
     148             : remove_dot_segments(
     149             :     char* dest,
     150             :     char const* end,
     151             :     core::string_view input) noexcept;
     152             : 
     153             : void
     154             : pop_last_segment(
     155             :     core::string_view& s,
     156             :     core::string_view& c,
     157             :     std::size_t& level,
     158             :     bool r) noexcept;
     159             : 
     160             : char
     161             : path_pop_back( core::string_view& s );
     162             : 
     163             : void
     164             : normalized_path_digest(
     165             :     core::string_view s,
     166             :     bool remove_unmatched,
     167             :     fnv_1a& hasher) noexcept;
     168             : 
     169             : int
     170             : segments_compare(
     171             :     segments_encoded_view seg0,
     172             :     segments_encoded_view seg1) noexcept;
     173             : 
     174             : } // detail
     175             : } // urls
     176             : } // boost
     177             : 
     178             : #endif

Generated by: LCOV version 1.15