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

Generated by: LCOV version 2.1