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_NOT_EMPTY_RULE_HPP 11 : #define BOOST_URL_GRAMMAR_NOT_EMPTY_RULE_HPP 12 : 13 : #include <boost/url/detail/config.hpp> 14 : #include <boost/url/error_types.hpp> 15 : #include <boost/url/grammar/type_traits.hpp> 16 : 17 : namespace boost { 18 : namespace urls { 19 : namespace grammar { 20 : 21 : /** Match another rule, if the result is not empty 22 : 23 : This adapts another rule such that 24 : when an empty string is successfully 25 : parsed, the result is an error. 26 : 27 : @par Value Type 28 : @code 29 : using value_type = typename Rule::value_type; 30 : @endcode 31 : 32 : @par Example 33 : Rules are used with the function @ref parse. 34 : @code 35 : system::result< decode_view > rv = parse( "Program%20Files", 36 : not_empty_rule( pct_encoded_rule( unreserved_chars ) ) ); 37 : @endcode 38 : 39 : @param r The rule to match 40 : 41 : @see 42 : @ref parse, 43 : @ref pct_encoded_rule, 44 : @ref unreserved_chars. 45 : */ 46 : #ifdef BOOST_URL_DOCS 47 : template<class Rule> 48 : constexpr 49 : __implementation_defined__ 50 : not_empty_rule( Rule r ); 51 : #else 52 : template<class R> 53 : struct not_empty_rule_t 54 : { 55 : using value_type = 56 : typename R::value_type; 57 : 58 : auto 59 : parse( 60 : char const*& it, 61 : char const* end) const -> 62 : system::result<value_type>; 63 : 64 : template<class R_> 65 : friend 66 : constexpr 67 : auto 68 : not_empty_rule( 69 : R_ const& r) -> 70 : not_empty_rule_t<R_>; 71 : 72 : private: 73 : constexpr 74 1 : not_empty_rule_t( 75 : R const& r) noexcept 76 1 : : r_(r) 77 : { 78 1 : } 79 : 80 : R r_; 81 : }; 82 : 83 : template<class Rule> 84 : auto 85 : constexpr 86 1 : not_empty_rule( 87 : Rule const& r) -> 88 : not_empty_rule_t<Rule> 89 : { 90 : // If you get a compile error here it 91 : // means that your rule does not meet 92 : // the type requirements. Please check 93 : // the documentation. 94 : static_assert( 95 : is_rule<Rule>::value, 96 : "Rule requirements not met"); 97 : 98 1 : return { r }; 99 : } 100 : #endif 101 : 102 : } // grammar 103 : } // urls 104 : } // boost 105 : 106 : #include <boost/url/grammar/impl/not_empty_rule.hpp> 107 : 108 : #endif