File indexing completed on 2025-01-18 09:53:27
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef BOOST_URL_GRAMMAR_CHARSET_HPP
0011 #define BOOST_URL_GRAMMAR_CHARSET_HPP
0012
0013 #include <boost/url/detail/config.hpp>
0014 #include <boost/url/grammar/detail/charset.hpp>
0015 #include <boost/static_assert.hpp>
0016 #include <cstdint>
0017 #include <type_traits>
0018 #include <utility>
0019
0020 namespace boost {
0021 namespace urls {
0022 namespace grammar {
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046 #ifdef BOOST_URL_DOCS
0047 template<class T>
0048 using is_charset = __see_below__;
0049 #else
0050 template<class T, class = void>
0051 struct is_charset : std::false_type {};
0052
0053 template<class T>
0054 struct is_charset<T, void_t<
0055 decltype(
0056 std::declval<bool&>() =
0057 std::declval<T const&>().operator()(
0058 std::declval<char>())
0059 ) > > : std::true_type
0060 {
0061 };
0062 #endif
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085 template<class CharSet>
0086 char const*
0087 find_if(
0088 char const* const first,
0089 char const* const last,
0090 CharSet const& cs) noexcept
0091 {
0092
0093
0094
0095
0096 static_assert(
0097 is_charset<CharSet>::value,
0098 "CharSet requirements not met");
0099
0100 return detail::find_if(first, last, cs,
0101 detail::has_find_if<CharSet>{});
0102 }
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123 template<class CharSet>
0124 char const*
0125 find_if_not(
0126 char const* const first,
0127 char const* const last,
0128 CharSet const& cs) noexcept
0129 {
0130
0131
0132
0133
0134 static_assert(
0135 is_charset<CharSet>::value,
0136 "CharSet requirements not met");
0137
0138 return detail::find_if_not(first, last, cs,
0139 detail::has_find_if_not<CharSet>{});
0140 }
0141
0142
0143
0144 #ifndef BOOST_URL_DOCS
0145 namespace detail {
0146
0147 template<class CharSet>
0148 struct charset_ref
0149 {
0150 CharSet const& cs_;
0151
0152 constexpr
0153 bool
0154 operator()(char ch) const noexcept
0155 {
0156 return cs_(ch);
0157 }
0158
0159 char const*
0160 find_if(
0161 char const* first,
0162 char const* last) const noexcept
0163 {
0164 return grammar::find_if(
0165 first, last, cs_);
0166 }
0167
0168 char const*
0169 find_if_not(
0170 char const* first,
0171 char const* last) const noexcept
0172 {
0173 return grammar::find_if_not(
0174 first, last, cs_ );
0175 }
0176 };
0177
0178 }
0179 #endif
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196 template<class CharSet>
0197 constexpr
0198 #ifdef BOOST_URL_DOCS
0199 __implementation_defined__
0200 #else
0201 typename std::enable_if<
0202 is_charset<CharSet>::value &&
0203 ! std::is_same<CharSet,
0204 detail::charset_ref<CharSet> >::value,
0205 detail::charset_ref<CharSet> >::type
0206 #endif
0207 ref(CharSet const& cs) noexcept
0208 {
0209 return detail::charset_ref<
0210 CharSet>{cs};
0211 }
0212
0213 }
0214 }
0215 }
0216
0217 #endif