LCOV - code coverage report
Current view: top level - boost/url/grammar/delim_rule.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 16 16
Test Date: 2025-11-10 19:06:20 Functions: 100.0 % 6 6

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot 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_GRAMMAR_DELIM_RULE_HPP
      11              : #define BOOST_URL_GRAMMAR_DELIM_RULE_HPP
      12              : 
      13              : #include <boost/url/detail/config.hpp>
      14              : #include <boost/core/detail/string_view.hpp>
      15              : #include <boost/url/grammar/charset.hpp>
      16              : #include <boost/url/grammar/error.hpp>
      17              : #include <boost/url/grammar/type_traits.hpp>
      18              : #include <type_traits>
      19              : 
      20              : namespace boost {
      21              : namespace urls {
      22              : namespace grammar {
      23              : 
      24              : namespace implementation_defined {
      25              : struct ch_delim_rule
      26              : {
      27              :     using value_type = core::string_view;
      28              : 
      29              :     constexpr
      30        11652 :     ch_delim_rule(char ch) noexcept
      31        11652 :         : ch_(ch)
      32              :     {
      33        11652 :     }
      34              : 
      35              :     BOOST_URL_DECL
      36              :     system::result<value_type>
      37              :     parse(
      38              :         char const*& it,
      39              :         char const* end) const noexcept;
      40              : 
      41              : private:
      42              :     char ch_;
      43              : };
      44              : } // implementation_defined
      45              : 
      46              : /** Match a character literal
      47              : 
      48              :     This matches the specified character.
      49              :     The value is a reference to the character
      50              :     in the underlying buffer, expressed as a
      51              :     `core::string_view`. The function @ref squelch
      52              :     may be used to turn this into `void` instead.
      53              :     If there is no more input, the error code
      54              :     @ref error::need_more is returned.
      55              : 
      56              :     @par Value Type
      57              :     @code
      58              :     using value_type = core::string_view;
      59              :     @endcode
      60              : 
      61              :     @par Example
      62              :     Rules are used with the function @ref parse.
      63              :     @code
      64              :     system::result< core::string_view > rv = parse( ".", delim_rule('.') );
      65              :     @endcode
      66              : 
      67              :     @par BNF
      68              :     @code
      69              :     char        = %00-FF
      70              :     @endcode
      71              : 
      72              :     @param ch The character to match
      73              :     @return A rule which matches the character.
      74              : 
      75              :     @see
      76              :         @ref parse,
      77              :         @ref squelch.
      78              : */
      79              : constexpr
      80              : implementation_defined::ch_delim_rule
      81        11652 : delim_rule( char ch ) noexcept
      82              : {
      83        11652 :     return {ch};
      84              : }
      85              : 
      86              : //------------------------------------------------
      87              : 
      88              : namespace implementation_defined {
      89              : template<class CharSet>
      90              : struct cs_delim_rule
      91              : {
      92              :     using value_type = core::string_view;
      93              : 
      94              :     constexpr
      95            3 :     cs_delim_rule(
      96              :         CharSet const& cs) noexcept
      97              :         : cs_(cs)
      98              :     {
      99            3 :     }
     100              : 
     101              :     system::result<value_type>
     102          877 :     parse(
     103              :         char const*& it,
     104              :         char const* end) const noexcept
     105              :     {
     106          877 :         if(it == end)
     107              :         {
     108              :             // end
     109            1 :             BOOST_URL_RETURN_EC(
     110              :                 error::need_more);
     111              :         }
     112          876 :         if(! cs_(*it))
     113              :         {
     114              :             // wrong character
     115          350 :             BOOST_URL_RETURN_EC(
     116              :                 error::mismatch);
     117              :         }
     118         1052 :         return core::string_view{
     119          526 :             it++, 1 };
     120              :     }
     121              : 
     122              : private:
     123              :     CharSet cs_;
     124              : };
     125              : } // implementation_defined
     126              : 
     127              : /** Match a single character from a character set
     128              : 
     129              :     This matches exactly one character which
     130              :     belongs to the specified character set.
     131              :     The value is a reference to the character
     132              :     in the underlying buffer, expressed as a
     133              :     `core::string_view`. The function @ref squelch
     134              :     may be used to turn this into `void` instead.
     135              :     If there is no more input, the error code
     136              :     @ref error::need_more is returned.
     137              : 
     138              :     @par Value Type
     139              :     @code
     140              :     using value_type = core::string_view;
     141              :     @endcode
     142              : 
     143              :     @par Example
     144              :     Rules are used with the function @ref parse.
     145              :     @code
     146              :     system::result< core::string_view > rv = parse( "X", delim_rule( alpha_chars ) );
     147              :     @endcode
     148              : 
     149              :     @param cs The character set to use.
     150              :     @return A rule which matches a single character from the set.
     151              : 
     152              :     @see
     153              :         @ref alpha_chars,
     154              :         @ref parse,
     155              :         @ref squelch.
     156              : */
     157              : template<BOOST_URL_CONSTRAINT(CharSet) CS>
     158              : constexpr
     159              : typename std::enable_if<
     160              :     ! std::is_convertible<
     161              :         CS, char>::value,
     162              :     implementation_defined::cs_delim_rule<CS>>::type
     163            3 : delim_rule(
     164              :     CS const& cs) noexcept
     165              : {
     166              :     // If you get a compile error here it
     167              :     // means that your type does not meet
     168              :     // the requirements for a CharSet.
     169              :     // Please consult the documentation.
     170              :     static_assert(
     171              :         is_charset<CS>::value,
     172              :         "CharSet requirements not met");
     173              : 
     174            3 :     return implementation_defined::cs_delim_rule<CS>(cs);
     175              : }
     176              : 
     177              : } // grammar
     178              : } // urls
     179              : } // boost
     180              : 
     181              : #endif
        

Generated by: LCOV version 2.1