1 1.1 mrg // <functional> -*- C++ -*- 2 1.1 mrg 3 1.14 mrg // Copyright (C) 2001-2022 Free Software Foundation, Inc. 4 1.1 mrg // 5 1.1 mrg // This file is part of the GNU ISO C++ Library. This library is free 6 1.1 mrg // software; you can redistribute it and/or modify it under the 7 1.1 mrg // terms of the GNU General Public License as published by the 8 1.1 mrg // Free Software Foundation; either version 3, or (at your option) 9 1.1 mrg // any later version. 10 1.1 mrg 11 1.1 mrg // This library is distributed in the hope that it will be useful, 12 1.1 mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 mrg // GNU General Public License for more details. 15 1.1 mrg 16 1.1 mrg // Under Section 7 of GPL version 3, you are granted additional 17 1.1 mrg // permissions described in the GCC Runtime Library Exception, version 18 1.1 mrg // 3.1, as published by the Free Software Foundation. 19 1.1 mrg 20 1.1 mrg // You should have received a copy of the GNU General Public License and 21 1.1 mrg // a copy of the GCC Runtime Library Exception along with this program; 22 1.1 mrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 1.1 mrg // <http://www.gnu.org/licenses/>. 24 1.1 mrg 25 1.1 mrg /* 26 1.1 mrg * Copyright (c) 1997 27 1.1 mrg * Silicon Graphics Computer Systems, Inc. 28 1.1 mrg * 29 1.1 mrg * Permission to use, copy, modify, distribute and sell this software 30 1.1 mrg * and its documentation for any purpose is hereby granted without fee, 31 1.1 mrg * provided that the above copyright notice appear in all copies and 32 1.1 mrg * that both that copyright notice and this permission notice appear 33 1.1 mrg * in supporting documentation. Silicon Graphics makes no 34 1.1 mrg * representations about the suitability of this software for any 35 1.1 mrg * purpose. It is provided "as is" without express or implied warranty. 36 1.1 mrg * 37 1.1 mrg */ 38 1.1 mrg 39 1.1 mrg /** @file include/functional 40 1.1 mrg * This is a Standard C++ Library header. 41 1.1 mrg */ 42 1.1 mrg 43 1.1 mrg #ifndef _GLIBCXX_FUNCTIONAL 44 1.1 mrg #define _GLIBCXX_FUNCTIONAL 1 45 1.1 mrg 46 1.1 mrg #pragma GCC system_header 47 1.1 mrg 48 1.1 mrg #include <bits/c++config.h> 49 1.1 mrg #include <bits/stl_function.h> 50 1.1 mrg 51 1.3 mrg #if __cplusplus >= 201103L 52 1.1 mrg 53 1.1 mrg #include <new> 54 1.1 mrg #include <tuple> 55 1.1 mrg #include <type_traits> 56 1.1 mrg #include <bits/functional_hash.h> 57 1.10 mrg #include <bits/invoke.h> 58 1.11 mrg #include <bits/refwrap.h> // std::reference_wrapper and _Mem_fn_traits 59 1.11 mrg #include <bits/std_function.h> // std::function 60 1.10 mrg #if __cplusplus > 201402L 61 1.10 mrg # include <unordered_map> 62 1.10 mrg # include <vector> 63 1.10 mrg # include <array> 64 1.10 mrg # include <bits/stl_algo.h> 65 1.10 mrg #endif 66 1.13 mrg #if __cplusplus > 201703L 67 1.14 mrg # include <bits/ranges_cmp.h> 68 1.13 mrg # include <compare> 69 1.13 mrg #endif 70 1.14 mrg #if __cplusplus > 202002L 71 1.14 mrg # include <bits/move_only_function.h> 72 1.14 mrg #endif 73 1.14 mrg 74 1.14 mrg #endif // C++11 75 1.1 mrg 76 1.3 mrg namespace std _GLIBCXX_VISIBILITY(default) 77 1.1 mrg { 78 1.3 mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION 79 1.3 mrg 80 1.14 mrg /** @brief The type of placeholder objects defined by libstdc++. 81 1.14 mrg * @ingroup binders 82 1.14 mrg * @since C++11 83 1.14 mrg */ 84 1.14 mrg template<int _Num> struct _Placeholder { }; 85 1.14 mrg 86 1.14 mrg #if __cplusplus >= 201103L 87 1.14 mrg 88 1.13 mrg #if __cplusplus >= 201703L 89 1.13 mrg # define __cpp_lib_invoke 201411L 90 1.13 mrg # if __cplusplus > 201703L 91 1.13 mrg # define __cpp_lib_constexpr_functional 201907L 92 1.13 mrg # endif 93 1.7 mrg 94 1.14 mrg /** Invoke a callable object. 95 1.14 mrg * 96 1.14 mrg * `std::invoke` takes a callable object as its first argument and calls it 97 1.14 mrg * with the remaining arguments. The callable object can be a pointer or 98 1.14 mrg * reference to a function, a lambda closure, a class with `operator()`, 99 1.14 mrg * or even a pointer-to-member. For a pointer-to-member the first argument 100 1.14 mrg * must be a reference or pointer to the object that the pointer-to-member 101 1.14 mrg * will be applied to. 102 1.14 mrg * 103 1.14 mrg * @since C++17 104 1.14 mrg */ 105 1.7 mrg template<typename _Callable, typename... _Args> 106 1.13 mrg inline _GLIBCXX20_CONSTEXPR invoke_result_t<_Callable, _Args...> 107 1.7 mrg invoke(_Callable&& __fn, _Args&&... __args) 108 1.10 mrg noexcept(is_nothrow_invocable_v<_Callable, _Args...>) 109 1.1 mrg { 110 1.7 mrg return std::__invoke(std::forward<_Callable>(__fn), 111 1.7 mrg std::forward<_Args>(__args)...); 112 1.1 mrg } 113 1.14 mrg 114 1.14 mrg #if __cplusplus > 202002L 115 1.14 mrg # define __cpp_lib_invoke_r 202106L 116 1.14 mrg 117 1.14 mrg /** Invoke a callable object and convert the result to `_Res`. 118 1.14 mrg * 119 1.14 mrg * `std::invoke_r<R>(f, args...)` is equivalent to `std::invoke(f, args...)` 120 1.14 mrg * with the result implicitly converted to `R`. 121 1.14 mrg * 122 1.14 mrg * @since C++23 123 1.14 mrg */ 124 1.14 mrg template<typename _Res, typename _Callable, typename... _Args> 125 1.14 mrg requires is_invocable_r_v<_Res, _Callable, _Args...> 126 1.14 mrg constexpr _Res 127 1.14 mrg invoke_r(_Callable&& __fn, _Args&&... __args) 128 1.14 mrg noexcept(is_nothrow_invocable_r_v<_Res, _Callable, _Args...>) 129 1.14 mrg { 130 1.14 mrg return std::__invoke_r<_Res>(std::forward<_Callable>(__fn), 131 1.14 mrg std::forward<_Args>(__args)...); 132 1.14 mrg } 133 1.14 mrg #endif // C++23 134 1.13 mrg #endif // C++17 135 1.1 mrg 136 1.14 mrg /// @cond undocumented 137 1.14 mrg 138 1.5 mrg template<typename _MemFunPtr, 139 1.5 mrg bool __is_mem_fn = is_member_function_pointer<_MemFunPtr>::value> 140 1.5 mrg class _Mem_fn_base 141 1.5 mrg : public _Mem_fn_traits<_MemFunPtr>::__maybe_type 142 1.5 mrg { 143 1.5 mrg using _Traits = _Mem_fn_traits<_MemFunPtr>; 144 1.5 mrg 145 1.5 mrg using _Arity = typename _Traits::__arity; 146 1.5 mrg using _Varargs = typename _Traits::__vararg; 147 1.5 mrg 148 1.5 mrg template<typename _Func, typename... _BoundArgs> 149 1.5 mrg friend struct _Bind_check_arity; 150 1.5 mrg 151 1.7 mrg _MemFunPtr _M_pmf; 152 1.1 mrg 153 1.1 mrg public: 154 1.7 mrg 155 1.5 mrg using result_type = typename _Traits::__result_type; 156 1.1 mrg 157 1.7 mrg explicit constexpr 158 1.7 mrg _Mem_fn_base(_MemFunPtr __pmf) noexcept : _M_pmf(__pmf) { } 159 1.1 mrg 160 1.7 mrg template<typename... _Args> 161 1.13 mrg _GLIBCXX20_CONSTEXPR 162 1.7 mrg auto 163 1.7 mrg operator()(_Args&&... __args) const 164 1.7 mrg noexcept(noexcept( 165 1.7 mrg std::__invoke(_M_pmf, std::forward<_Args>(__args)...))) 166 1.7 mrg -> decltype(std::__invoke(_M_pmf, std::forward<_Args>(__args)...)) 167 1.7 mrg { return std::__invoke(_M_pmf, std::forward<_Args>(__args)...); } 168 1.3 mrg }; 169 1.3 mrg 170 1.5 mrg // Partial specialization for member object pointers. 171 1.7 mrg template<typename _MemObjPtr> 172 1.7 mrg class _Mem_fn_base<_MemObjPtr, false> 173 1.1 mrg { 174 1.5 mrg using _Arity = integral_constant<size_t, 0>; 175 1.5 mrg using _Varargs = false_type; 176 1.5 mrg 177 1.5 mrg template<typename _Func, typename... _BoundArgs> 178 1.5 mrg friend struct _Bind_check_arity; 179 1.1 mrg 180 1.7 mrg _MemObjPtr _M_pm; 181 1.7 mrg 182 1.1 mrg public: 183 1.7 mrg explicit constexpr 184 1.7 mrg _Mem_fn_base(_MemObjPtr __pm) noexcept : _M_pm(__pm) { } 185 1.1 mrg 186 1.7 mrg template<typename _Tp> 187 1.13 mrg _GLIBCXX20_CONSTEXPR 188 1.3 mrg auto 189 1.7 mrg operator()(_Tp&& __obj) const 190 1.7 mrg noexcept(noexcept(std::__invoke(_M_pm, std::forward<_Tp>(__obj)))) 191 1.7 mrg -> decltype(std::__invoke(_M_pm, std::forward<_Tp>(__obj))) 192 1.7 mrg { return std::__invoke(_M_pm, std::forward<_Tp>(__obj)); } 193 1.5 mrg }; 194 1.5 mrg 195 1.10 mrg template<typename _MemberPointer> 196 1.10 mrg struct _Mem_fn; // undefined 197 1.10 mrg 198 1.5 mrg template<typename _Res, typename _Class> 199 1.5 mrg struct _Mem_fn<_Res _Class::*> 200 1.5 mrg : _Mem_fn_base<_Res _Class::*> 201 1.5 mrg { 202 1.5 mrg using _Mem_fn_base<_Res _Class::*>::_Mem_fn_base; 203 1.1 mrg }; 204 1.14 mrg /// @endcond 205 1.1 mrg 206 1.3 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 207 1.3 mrg // 2048. Unnecessary mem_fn overloads 208 1.1 mrg /** 209 1.14 mrg * @brief Returns a function object that forwards to the member pointer 210 1.14 mrg * pointer `pm`. 211 1.14 mrg * 212 1.14 mrg * This allows a pointer-to-member to be transformed into a function object 213 1.14 mrg * that can be called with an object expression as its first argument. 214 1.14 mrg * 215 1.14 mrg * For a pointer-to-data-member the result must be called with exactly one 216 1.14 mrg * argument, the object expression that would be used as the first operand 217 1.14 mrg * in a `obj.*memptr` or `objp->*memptr` expression. 218 1.14 mrg * 219 1.14 mrg * For a pointer-to-member-function the result must be called with an object 220 1.14 mrg * expression and any additional arguments to pass to the member function, 221 1.14 mrg * as in an expression like `(obj.*memfun)(args...)` or 222 1.14 mrg * `(objp->*memfun)(args...)`. 223 1.14 mrg * 224 1.14 mrg * The object expression can be a pointer, reference, `reference_wrapper`, 225 1.14 mrg * or smart pointer, and the call wrapper will dereference it as needed 226 1.14 mrg * to apply the pointer-to-member. 227 1.14 mrg * 228 1.14 mrg * @ingroup functors 229 1.14 mrg * @since C++11 230 1.1 mrg */ 231 1.1 mrg template<typename _Tp, typename _Class> 232 1.13 mrg _GLIBCXX20_CONSTEXPR 233 1.1 mrg inline _Mem_fn<_Tp _Class::*> 234 1.3 mrg mem_fn(_Tp _Class::* __pm) noexcept 235 1.1 mrg { 236 1.1 mrg return _Mem_fn<_Tp _Class::*>(__pm); 237 1.1 mrg } 238 1.1 mrg 239 1.1 mrg /** 240 1.14 mrg * @brief Trait that identifies a bind expression. 241 1.14 mrg * 242 1.14 mrg * Determines if the given type `_Tp` is a function object that 243 1.14 mrg * should be treated as a subexpression when evaluating calls to 244 1.14 mrg * function objects returned by `std::bind`. 245 1.7 mrg * 246 1.14 mrg * C++11 [func.bind.isbind]. 247 1.14 mrg * @ingroup binders 248 1.14 mrg * @since C++11 249 1.1 mrg */ 250 1.1 mrg template<typename _Tp> 251 1.1 mrg struct is_bind_expression 252 1.1 mrg : public false_type { }; 253 1.1 mrg 254 1.1 mrg /** 255 1.1 mrg * @brief Determines if the given type _Tp is a placeholder in a 256 1.7 mrg * bind() expression and, if so, which placeholder it is. 257 1.7 mrg * 258 1.7 mrg * C++11 [func.bind.isplace]. 259 1.1 mrg * @ingroup binders 260 1.14 mrg * @since C++11 261 1.1 mrg */ 262 1.1 mrg template<typename _Tp> 263 1.1 mrg struct is_placeholder 264 1.1 mrg : public integral_constant<int, 0> 265 1.1 mrg { }; 266 1.1 mrg 267 1.10 mrg #if __cplusplus > 201402L 268 1.10 mrg template <typename _Tp> inline constexpr bool is_bind_expression_v 269 1.10 mrg = is_bind_expression<_Tp>::value; 270 1.10 mrg template <typename _Tp> inline constexpr int is_placeholder_v 271 1.10 mrg = is_placeholder<_Tp>::value; 272 1.10 mrg #endif // C++17 273 1.10 mrg 274 1.1 mrg /** @namespace std::placeholders 275 1.13 mrg * @brief ISO C++ 2011 namespace for std::bind placeholders. 276 1.1 mrg * @ingroup binders 277 1.14 mrg * @since C++11 278 1.3 mrg */ 279 1.3 mrg namespace placeholders 280 1.3 mrg { 281 1.3 mrg /* Define a large number of placeholders. There is no way to 282 1.3 mrg * simplify this with variadic templates, because we're introducing 283 1.3 mrg * unique names for each. 284 1.3 mrg */ 285 1.3 mrg extern const _Placeholder<1> _1; 286 1.3 mrg extern const _Placeholder<2> _2; 287 1.3 mrg extern const _Placeholder<3> _3; 288 1.3 mrg extern const _Placeholder<4> _4; 289 1.3 mrg extern const _Placeholder<5> _5; 290 1.3 mrg extern const _Placeholder<6> _6; 291 1.3 mrg extern const _Placeholder<7> _7; 292 1.3 mrg extern const _Placeholder<8> _8; 293 1.3 mrg extern const _Placeholder<9> _9; 294 1.3 mrg extern const _Placeholder<10> _10; 295 1.3 mrg extern const _Placeholder<11> _11; 296 1.3 mrg extern const _Placeholder<12> _12; 297 1.3 mrg extern const _Placeholder<13> _13; 298 1.3 mrg extern const _Placeholder<14> _14; 299 1.3 mrg extern const _Placeholder<15> _15; 300 1.3 mrg extern const _Placeholder<16> _16; 301 1.3 mrg extern const _Placeholder<17> _17; 302 1.3 mrg extern const _Placeholder<18> _18; 303 1.3 mrg extern const _Placeholder<19> _19; 304 1.3 mrg extern const _Placeholder<20> _20; 305 1.3 mrg extern const _Placeholder<21> _21; 306 1.3 mrg extern const _Placeholder<22> _22; 307 1.3 mrg extern const _Placeholder<23> _23; 308 1.3 mrg extern const _Placeholder<24> _24; 309 1.3 mrg extern const _Placeholder<25> _25; 310 1.3 mrg extern const _Placeholder<26> _26; 311 1.3 mrg extern const _Placeholder<27> _27; 312 1.3 mrg extern const _Placeholder<28> _28; 313 1.3 mrg extern const _Placeholder<29> _29; 314 1.1 mrg } 315 1.1 mrg 316 1.1 mrg /** 317 1.1 mrg * Partial specialization of is_placeholder that provides the placeholder 318 1.1 mrg * number for the placeholder objects defined by libstdc++. 319 1.1 mrg * @ingroup binders 320 1.14 mrg * @since C++11 321 1.1 mrg */ 322 1.1 mrg template<int _Num> 323 1.1 mrg struct is_placeholder<_Placeholder<_Num> > 324 1.1 mrg : public integral_constant<int, _Num> 325 1.1 mrg { }; 326 1.1 mrg 327 1.3 mrg template<int _Num> 328 1.3 mrg struct is_placeholder<const _Placeholder<_Num> > 329 1.3 mrg : public integral_constant<int, _Num> 330 1.3 mrg { }; 331 1.3 mrg 332 1.14 mrg /// @cond undocumented 333 1.1 mrg 334 1.7 mrg // Like tuple_element_t but SFINAE-friendly. 335 1.10 mrg template<std::size_t __i, typename _Tuple> 336 1.10 mrg using _Safe_tuple_element_t 337 1.10 mrg = typename enable_if<(__i < tuple_size<_Tuple>::value), 338 1.10 mrg tuple_element<__i, _Tuple>>::type::type; 339 1.1 mrg 340 1.1 mrg /** 341 1.1 mrg * Maps an argument to bind() into an actual argument to the bound 342 1.7 mrg * function object [func.bind.bind]/10. Only the first parameter should 343 1.1 mrg * be specified: the rest are used to determine among the various 344 1.1 mrg * implementations. Note that, although this class is a function 345 1.1 mrg * object, it isn't entirely normal because it takes only two 346 1.1 mrg * parameters regardless of the number of parameters passed to the 347 1.1 mrg * bind expression. The first parameter is the bound argument and 348 1.1 mrg * the second parameter is a tuple containing references to the 349 1.1 mrg * rest of the arguments. 350 1.1 mrg */ 351 1.1 mrg template<typename _Arg, 352 1.3 mrg bool _IsBindExp = is_bind_expression<_Arg>::value, 353 1.3 mrg bool _IsPlaceholder = (is_placeholder<_Arg>::value > 0)> 354 1.1 mrg class _Mu; 355 1.1 mrg 356 1.1 mrg /** 357 1.1 mrg * If the argument is reference_wrapper<_Tp>, returns the 358 1.7 mrg * underlying reference. 359 1.7 mrg * C++11 [func.bind.bind] p10 bullet 1. 360 1.1 mrg */ 361 1.1 mrg template<typename _Tp> 362 1.1 mrg class _Mu<reference_wrapper<_Tp>, false, false> 363 1.1 mrg { 364 1.1 mrg public: 365 1.1 mrg /* Note: This won't actually work for const volatile 366 1.1 mrg * reference_wrappers, because reference_wrapper::get() is const 367 1.1 mrg * but not volatile-qualified. This might be a defect in the TR. 368 1.1 mrg */ 369 1.1 mrg template<typename _CVRef, typename _Tuple> 370 1.13 mrg _GLIBCXX20_CONSTEXPR 371 1.7 mrg _Tp& 372 1.3 mrg operator()(_CVRef& __arg, _Tuple&) const volatile 373 1.3 mrg { return __arg.get(); } 374 1.1 mrg }; 375 1.1 mrg 376 1.1 mrg /** 377 1.1 mrg * If the argument is a bind expression, we invoke the underlying 378 1.1 mrg * function object with the same cv-qualifiers as we are given and 379 1.7 mrg * pass along all of our arguments (unwrapped). 380 1.7 mrg * C++11 [func.bind.bind] p10 bullet 2. 381 1.1 mrg */ 382 1.1 mrg template<typename _Arg> 383 1.1 mrg class _Mu<_Arg, true, false> 384 1.1 mrg { 385 1.1 mrg public: 386 1.1 mrg template<typename _CVArg, typename... _Args> 387 1.13 mrg _GLIBCXX20_CONSTEXPR 388 1.3 mrg auto 389 1.3 mrg operator()(_CVArg& __arg, 390 1.3 mrg tuple<_Args...>& __tuple) const volatile 391 1.3 mrg -> decltype(__arg(declval<_Args>()...)) 392 1.3 mrg { 393 1.1 mrg // Construct an index tuple and forward to __call 394 1.1 mrg typedef typename _Build_index_tuple<sizeof...(_Args)>::__type 395 1.1 mrg _Indexes; 396 1.3 mrg return this->__call(__arg, __tuple, _Indexes()); 397 1.1 mrg } 398 1.1 mrg 399 1.1 mrg private: 400 1.1 mrg // Invokes the underlying function object __arg by unpacking all 401 1.3 mrg // of the arguments in the tuple. 402 1.3 mrg template<typename _CVArg, typename... _Args, std::size_t... _Indexes> 403 1.13 mrg _GLIBCXX20_CONSTEXPR 404 1.3 mrg auto 405 1.3 mrg __call(_CVArg& __arg, tuple<_Args...>& __tuple, 406 1.1 mrg const _Index_tuple<_Indexes...>&) const volatile 407 1.3 mrg -> decltype(__arg(declval<_Args>()...)) 408 1.3 mrg { 409 1.10 mrg return __arg(std::get<_Indexes>(std::move(__tuple))...); 410 1.1 mrg } 411 1.1 mrg }; 412 1.1 mrg 413 1.1 mrg /** 414 1.1 mrg * If the argument is a placeholder for the Nth argument, returns 415 1.1 mrg * a reference to the Nth argument to the bind function object. 416 1.7 mrg * C++11 [func.bind.bind] p10 bullet 3. 417 1.1 mrg */ 418 1.1 mrg template<typename _Arg> 419 1.1 mrg class _Mu<_Arg, false, true> 420 1.1 mrg { 421 1.1 mrg public: 422 1.1 mrg template<typename _Tuple> 423 1.13 mrg _GLIBCXX20_CONSTEXPR 424 1.7 mrg _Safe_tuple_element_t<(is_placeholder<_Arg>::value - 1), _Tuple>&& 425 1.3 mrg operator()(const volatile _Arg&, _Tuple& __tuple) const volatile 426 1.3 mrg { 427 1.10 mrg return 428 1.10 mrg ::std::get<(is_placeholder<_Arg>::value - 1)>(std::move(__tuple)); 429 1.1 mrg } 430 1.1 mrg }; 431 1.1 mrg 432 1.1 mrg /** 433 1.1 mrg * If the argument is just a value, returns a reference to that 434 1.7 mrg * value. The cv-qualifiers on the reference are determined by the caller. 435 1.7 mrg * C++11 [func.bind.bind] p10 bullet 4. 436 1.1 mrg */ 437 1.1 mrg template<typename _Arg> 438 1.1 mrg class _Mu<_Arg, false, false> 439 1.1 mrg { 440 1.1 mrg public: 441 1.1 mrg template<typename _CVArg, typename _Tuple> 442 1.13 mrg _GLIBCXX20_CONSTEXPR 443 1.3 mrg _CVArg&& 444 1.3 mrg operator()(_CVArg&& __arg, _Tuple&) const volatile 445 1.3 mrg { return std::forward<_CVArg>(__arg); } 446 1.1 mrg }; 447 1.1 mrg 448 1.3 mrg // std::get<I> for volatile-qualified tuples 449 1.3 mrg template<std::size_t _Ind, typename... _Tp> 450 1.3 mrg inline auto 451 1.3 mrg __volget(volatile tuple<_Tp...>& __tuple) 452 1.5 mrg -> __tuple_element_t<_Ind, tuple<_Tp...>> volatile& 453 1.3 mrg { return std::get<_Ind>(const_cast<tuple<_Tp...>&>(__tuple)); } 454 1.3 mrg 455 1.3 mrg // std::get<I> for const-volatile-qualified tuples 456 1.3 mrg template<std::size_t _Ind, typename... _Tp> 457 1.3 mrg inline auto 458 1.3 mrg __volget(const volatile tuple<_Tp...>& __tuple) 459 1.5 mrg -> __tuple_element_t<_Ind, tuple<_Tp...>> const volatile& 460 1.3 mrg { return std::get<_Ind>(const_cast<const tuple<_Tp...>&>(__tuple)); } 461 1.3 mrg 462 1.14 mrg /// @endcond 463 1.14 mrg 464 1.14 mrg #if __cplusplus == 201703L && _GLIBCXX_USE_DEPRECATED 465 1.14 mrg # define _GLIBCXX_VOLATILE_BIND 466 1.14 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 467 1.14 mrg // 2487. bind() should be const-overloaded, not cv-overloaded 468 1.14 mrg # define _GLIBCXX_DEPR_BIND \ 469 1.14 mrg [[deprecated("std::bind does not support volatile in C++17")]] 470 1.14 mrg #elif __cplusplus < 201703L 471 1.14 mrg # define _GLIBCXX_VOLATILE_BIND 472 1.14 mrg # define _GLIBCXX_DEPR_BIND 473 1.14 mrg #endif 474 1.14 mrg 475 1.1 mrg /// Type of the function object returned from bind(). 476 1.1 mrg template<typename _Signature> 477 1.14 mrg class _Bind; 478 1.1 mrg 479 1.1 mrg template<typename _Functor, typename... _Bound_args> 480 1.1 mrg class _Bind<_Functor(_Bound_args...)> 481 1.1 mrg : public _Weak_result_type<_Functor> 482 1.1 mrg { 483 1.3 mrg typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type 484 1.3 mrg _Bound_indexes; 485 1.1 mrg 486 1.1 mrg _Functor _M_f; 487 1.1 mrg tuple<_Bound_args...> _M_bound_args; 488 1.1 mrg 489 1.1 mrg // Call unqualified 490 1.3 mrg template<typename _Result, typename... _Args, std::size_t... _Indexes> 491 1.13 mrg _GLIBCXX20_CONSTEXPR 492 1.3 mrg _Result 493 1.3 mrg __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>) 494 1.3 mrg { 495 1.10 mrg return std::__invoke(_M_f, 496 1.10 mrg _Mu<_Bound_args>()(std::get<_Indexes>(_M_bound_args), __args)... 497 1.10 mrg ); 498 1.3 mrg } 499 1.1 mrg 500 1.1 mrg // Call as const 501 1.3 mrg template<typename _Result, typename... _Args, std::size_t... _Indexes> 502 1.13 mrg _GLIBCXX20_CONSTEXPR 503 1.3 mrg _Result 504 1.3 mrg __call_c(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>) const 505 1.3 mrg { 506 1.10 mrg return std::__invoke(_M_f, 507 1.10 mrg _Mu<_Bound_args>()(std::get<_Indexes>(_M_bound_args), __args)... 508 1.10 mrg ); 509 1.3 mrg } 510 1.1 mrg 511 1.14 mrg #ifdef _GLIBCXX_VOLATILE_BIND 512 1.1 mrg // Call as volatile 513 1.3 mrg template<typename _Result, typename... _Args, std::size_t... _Indexes> 514 1.3 mrg _Result 515 1.3 mrg __call_v(tuple<_Args...>&& __args, 516 1.1 mrg _Index_tuple<_Indexes...>) volatile 517 1.3 mrg { 518 1.10 mrg return std::__invoke(_M_f, 519 1.10 mrg _Mu<_Bound_args>()(__volget<_Indexes>(_M_bound_args), __args)... 520 1.10 mrg ); 521 1.3 mrg } 522 1.1 mrg 523 1.1 mrg // Call as const volatile 524 1.3 mrg template<typename _Result, typename... _Args, std::size_t... _Indexes> 525 1.3 mrg _Result 526 1.3 mrg __call_c_v(tuple<_Args...>&& __args, 527 1.1 mrg _Index_tuple<_Indexes...>) const volatile 528 1.3 mrg { 529 1.10 mrg return std::__invoke(_M_f, 530 1.10 mrg _Mu<_Bound_args>()(__volget<_Indexes>(_M_bound_args), __args)... 531 1.10 mrg ); 532 1.10 mrg } 533 1.14 mrg #endif // volatile 534 1.10 mrg 535 1.10 mrg template<typename _BoundArg, typename _CallArgs> 536 1.10 mrg using _Mu_type = decltype( 537 1.10 mrg _Mu<typename remove_cv<_BoundArg>::type>()( 538 1.10 mrg std::declval<_BoundArg&>(), std::declval<_CallArgs&>()) ); 539 1.10 mrg 540 1.10 mrg template<typename _Fn, typename _CallArgs, typename... _BArgs> 541 1.10 mrg using _Res_type_impl 542 1.10 mrg = typename result_of< _Fn&(_Mu_type<_BArgs, _CallArgs>&&...) >::type; 543 1.10 mrg 544 1.10 mrg template<typename _CallArgs> 545 1.10 mrg using _Res_type = _Res_type_impl<_Functor, _CallArgs, _Bound_args...>; 546 1.10 mrg 547 1.10 mrg template<typename _CallArgs> 548 1.10 mrg using __dependent = typename 549 1.10 mrg enable_if<bool(tuple_size<_CallArgs>::value+1), _Functor>::type; 550 1.10 mrg 551 1.10 mrg template<typename _CallArgs, template<class> class __cv_quals> 552 1.10 mrg using _Res_type_cv = _Res_type_impl< 553 1.10 mrg typename __cv_quals<__dependent<_CallArgs>>::type, 554 1.10 mrg _CallArgs, 555 1.10 mrg typename __cv_quals<_Bound_args>::type...>; 556 1.1 mrg 557 1.1 mrg public: 558 1.3 mrg template<typename... _Args> 559 1.13 mrg explicit _GLIBCXX20_CONSTEXPR 560 1.13 mrg _Bind(const _Functor& __f, _Args&&... __args) 561 1.3 mrg : _M_f(__f), _M_bound_args(std::forward<_Args>(__args)...) 562 1.3 mrg { } 563 1.3 mrg 564 1.3 mrg template<typename... _Args> 565 1.13 mrg explicit _GLIBCXX20_CONSTEXPR 566 1.13 mrg _Bind(_Functor&& __f, _Args&&... __args) 567 1.3 mrg : _M_f(std::move(__f)), _M_bound_args(std::forward<_Args>(__args)...) 568 1.3 mrg { } 569 1.3 mrg 570 1.3 mrg _Bind(const _Bind&) = default; 571 1.13 mrg _Bind(_Bind&&) = default; 572 1.1 mrg 573 1.1 mrg // Call unqualified 574 1.10 mrg template<typename... _Args, 575 1.10 mrg typename _Result = _Res_type<tuple<_Args...>>> 576 1.13 mrg _GLIBCXX20_CONSTEXPR 577 1.3 mrg _Result 578 1.3 mrg operator()(_Args&&... __args) 579 1.3 mrg { 580 1.3 mrg return this->__call<_Result>( 581 1.3 mrg std::forward_as_tuple(std::forward<_Args>(__args)...), 582 1.3 mrg _Bound_indexes()); 583 1.3 mrg } 584 1.1 mrg 585 1.1 mrg // Call as const 586 1.10 mrg template<typename... _Args, 587 1.10 mrg typename _Result = _Res_type_cv<tuple<_Args...>, add_const>> 588 1.13 mrg _GLIBCXX20_CONSTEXPR 589 1.3 mrg _Result 590 1.3 mrg operator()(_Args&&... __args) const 591 1.3 mrg { 592 1.3 mrg return this->__call_c<_Result>( 593 1.3 mrg std::forward_as_tuple(std::forward<_Args>(__args)...), 594 1.3 mrg _Bound_indexes()); 595 1.3 mrg } 596 1.1 mrg 597 1.14 mrg #ifdef _GLIBCXX_VOLATILE_BIND 598 1.1 mrg // Call as volatile 599 1.10 mrg template<typename... _Args, 600 1.10 mrg typename _Result = _Res_type_cv<tuple<_Args...>, add_volatile>> 601 1.10 mrg _GLIBCXX_DEPR_BIND 602 1.3 mrg _Result 603 1.3 mrg operator()(_Args&&... __args) volatile 604 1.3 mrg { 605 1.3 mrg return this->__call_v<_Result>( 606 1.3 mrg std::forward_as_tuple(std::forward<_Args>(__args)...), 607 1.3 mrg _Bound_indexes()); 608 1.3 mrg } 609 1.1 mrg 610 1.1 mrg // Call as const volatile 611 1.10 mrg template<typename... _Args, 612 1.10 mrg typename _Result = _Res_type_cv<tuple<_Args...>, add_cv>> 613 1.10 mrg _GLIBCXX_DEPR_BIND 614 1.3 mrg _Result 615 1.3 mrg operator()(_Args&&... __args) const volatile 616 1.3 mrg { 617 1.3 mrg return this->__call_c_v<_Result>( 618 1.3 mrg std::forward_as_tuple(std::forward<_Args>(__args)...), 619 1.3 mrg _Bound_indexes()); 620 1.3 mrg } 621 1.14 mrg #endif // volatile 622 1.1 mrg }; 623 1.1 mrg 624 1.1 mrg /// Type of the function object returned from bind<R>(). 625 1.1 mrg template<typename _Result, typename _Signature> 626 1.14 mrg class _Bind_result; 627 1.1 mrg 628 1.1 mrg template<typename _Result, typename _Functor, typename... _Bound_args> 629 1.1 mrg class _Bind_result<_Result, _Functor(_Bound_args...)> 630 1.1 mrg { 631 1.3 mrg typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type 632 1.3 mrg _Bound_indexes; 633 1.1 mrg 634 1.1 mrg _Functor _M_f; 635 1.1 mrg tuple<_Bound_args...> _M_bound_args; 636 1.1 mrg 637 1.1 mrg // Call unqualified 638 1.3 mrg template<typename _Res, typename... _Args, std::size_t... _Indexes> 639 1.13 mrg _GLIBCXX20_CONSTEXPR 640 1.13 mrg _Res 641 1.10 mrg __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>) 642 1.3 mrg { 643 1.13 mrg return std::__invoke_r<_Res>(_M_f, _Mu<_Bound_args>() 644 1.5 mrg (std::get<_Indexes>(_M_bound_args), __args)...); 645 1.3 mrg } 646 1.1 mrg 647 1.1 mrg // Call as const 648 1.3 mrg template<typename _Res, typename... _Args, std::size_t... _Indexes> 649 1.13 mrg _GLIBCXX20_CONSTEXPR 650 1.13 mrg _Res 651 1.10 mrg __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>) const 652 1.3 mrg { 653 1.13 mrg return std::__invoke_r<_Res>(_M_f, _Mu<_Bound_args>() 654 1.5 mrg (std::get<_Indexes>(_M_bound_args), __args)...); 655 1.3 mrg } 656 1.1 mrg 657 1.14 mrg #ifdef _GLIBCXX_VOLATILE_BIND 658 1.1 mrg // Call as volatile 659 1.3 mrg template<typename _Res, typename... _Args, std::size_t... _Indexes> 660 1.13 mrg _Res 661 1.10 mrg __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>) volatile 662 1.3 mrg { 663 1.13 mrg return std::__invoke_r<_Res>(_M_f, _Mu<_Bound_args>() 664 1.3 mrg (__volget<_Indexes>(_M_bound_args), __args)...); 665 1.3 mrg } 666 1.1 mrg 667 1.1 mrg // Call as const volatile 668 1.3 mrg template<typename _Res, typename... _Args, std::size_t... _Indexes> 669 1.13 mrg _Res 670 1.10 mrg __call(tuple<_Args...>&& __args, 671 1.10 mrg _Index_tuple<_Indexes...>) const volatile 672 1.3 mrg { 673 1.13 mrg return std::__invoke_r<_Res>(_M_f, _Mu<_Bound_args>() 674 1.3 mrg (__volget<_Indexes>(_M_bound_args), __args)...); 675 1.3 mrg } 676 1.14 mrg #endif // volatile 677 1.1 mrg 678 1.1 mrg public: 679 1.1 mrg typedef _Result result_type; 680 1.1 mrg 681 1.3 mrg template<typename... _Args> 682 1.13 mrg explicit _GLIBCXX20_CONSTEXPR 683 1.13 mrg _Bind_result(const _Functor& __f, _Args&&... __args) 684 1.3 mrg : _M_f(__f), _M_bound_args(std::forward<_Args>(__args)...) 685 1.3 mrg { } 686 1.3 mrg 687 1.3 mrg template<typename... _Args> 688 1.13 mrg explicit _GLIBCXX20_CONSTEXPR 689 1.13 mrg _Bind_result(_Functor&& __f, _Args&&... __args) 690 1.3 mrg : _M_f(std::move(__f)), _M_bound_args(std::forward<_Args>(__args)...) 691 1.3 mrg { } 692 1.3 mrg 693 1.3 mrg _Bind_result(const _Bind_result&) = default; 694 1.13 mrg _Bind_result(_Bind_result&&) = default; 695 1.1 mrg 696 1.1 mrg // Call unqualified 697 1.1 mrg template<typename... _Args> 698 1.13 mrg _GLIBCXX20_CONSTEXPR 699 1.3 mrg result_type 700 1.3 mrg operator()(_Args&&... __args) 701 1.3 mrg { 702 1.3 mrg return this->__call<_Result>( 703 1.3 mrg std::forward_as_tuple(std::forward<_Args>(__args)...), 704 1.3 mrg _Bound_indexes()); 705 1.3 mrg } 706 1.1 mrg 707 1.1 mrg // Call as const 708 1.1 mrg template<typename... _Args> 709 1.13 mrg _GLIBCXX20_CONSTEXPR 710 1.3 mrg result_type 711 1.3 mrg operator()(_Args&&... __args) const 712 1.3 mrg { 713 1.3 mrg return this->__call<_Result>( 714 1.3 mrg std::forward_as_tuple(std::forward<_Args>(__args)...), 715 1.3 mrg _Bound_indexes()); 716 1.3 mrg } 717 1.1 mrg 718 1.14 mrg #ifdef _GLIBCXX_VOLATILE_BIND 719 1.1 mrg // Call as volatile 720 1.1 mrg template<typename... _Args> 721 1.10 mrg _GLIBCXX_DEPR_BIND 722 1.3 mrg result_type 723 1.3 mrg operator()(_Args&&... __args) volatile 724 1.3 mrg { 725 1.3 mrg return this->__call<_Result>( 726 1.3 mrg std::forward_as_tuple(std::forward<_Args>(__args)...), 727 1.3 mrg _Bound_indexes()); 728 1.3 mrg } 729 1.1 mrg 730 1.1 mrg // Call as const volatile 731 1.1 mrg template<typename... _Args> 732 1.10 mrg _GLIBCXX_DEPR_BIND 733 1.3 mrg result_type 734 1.3 mrg operator()(_Args&&... __args) const volatile 735 1.3 mrg { 736 1.3 mrg return this->__call<_Result>( 737 1.3 mrg std::forward_as_tuple(std::forward<_Args>(__args)...), 738 1.3 mrg _Bound_indexes()); 739 1.3 mrg } 740 1.14 mrg #else 741 1.14 mrg template<typename... _Args> 742 1.14 mrg void operator()(_Args&&...) const volatile = delete; 743 1.14 mrg #endif // volatile 744 1.1 mrg }; 745 1.14 mrg 746 1.14 mrg #undef _GLIBCXX_VOLATILE_BIND 747 1.10 mrg #undef _GLIBCXX_DEPR_BIND 748 1.1 mrg 749 1.1 mrg /** 750 1.1 mrg * @brief Class template _Bind is always a bind expression. 751 1.1 mrg * @ingroup binders 752 1.1 mrg */ 753 1.1 mrg template<typename _Signature> 754 1.1 mrg struct is_bind_expression<_Bind<_Signature> > 755 1.1 mrg : public true_type { }; 756 1.1 mrg 757 1.1 mrg /** 758 1.1 mrg * @brief Class template _Bind is always a bind expression. 759 1.1 mrg * @ingroup binders 760 1.1 mrg */ 761 1.3 mrg template<typename _Signature> 762 1.3 mrg struct is_bind_expression<const _Bind<_Signature> > 763 1.3 mrg : public true_type { }; 764 1.3 mrg 765 1.3 mrg /** 766 1.3 mrg * @brief Class template _Bind is always a bind expression. 767 1.3 mrg * @ingroup binders 768 1.3 mrg */ 769 1.3 mrg template<typename _Signature> 770 1.3 mrg struct is_bind_expression<volatile _Bind<_Signature> > 771 1.3 mrg : public true_type { }; 772 1.3 mrg 773 1.3 mrg /** 774 1.3 mrg * @brief Class template _Bind is always a bind expression. 775 1.3 mrg * @ingroup binders 776 1.3 mrg */ 777 1.3 mrg template<typename _Signature> 778 1.3 mrg struct is_bind_expression<const volatile _Bind<_Signature>> 779 1.3 mrg : public true_type { }; 780 1.3 mrg 781 1.3 mrg /** 782 1.3 mrg * @brief Class template _Bind_result is always a bind expression. 783 1.3 mrg * @ingroup binders 784 1.3 mrg */ 785 1.3 mrg template<typename _Result, typename _Signature> 786 1.3 mrg struct is_bind_expression<_Bind_result<_Result, _Signature>> 787 1.3 mrg : public true_type { }; 788 1.3 mrg 789 1.3 mrg /** 790 1.3 mrg * @brief Class template _Bind_result is always a bind expression. 791 1.3 mrg * @ingroup binders 792 1.3 mrg */ 793 1.3 mrg template<typename _Result, typename _Signature> 794 1.3 mrg struct is_bind_expression<const _Bind_result<_Result, _Signature>> 795 1.3 mrg : public true_type { }; 796 1.3 mrg 797 1.3 mrg /** 798 1.3 mrg * @brief Class template _Bind_result is always a bind expression. 799 1.3 mrg * @ingroup binders 800 1.3 mrg */ 801 1.1 mrg template<typename _Result, typename _Signature> 802 1.3 mrg struct is_bind_expression<volatile _Bind_result<_Result, _Signature>> 803 1.1 mrg : public true_type { }; 804 1.1 mrg 805 1.1 mrg /** 806 1.3 mrg * @brief Class template _Bind_result is always a bind expression. 807 1.3 mrg * @ingroup binders 808 1.3 mrg */ 809 1.3 mrg template<typename _Result, typename _Signature> 810 1.3 mrg struct is_bind_expression<const volatile _Bind_result<_Result, _Signature>> 811 1.3 mrg : public true_type { }; 812 1.3 mrg 813 1.5 mrg template<typename _Func, typename... _BoundArgs> 814 1.5 mrg struct _Bind_check_arity { }; 815 1.5 mrg 816 1.5 mrg template<typename _Ret, typename... _Args, typename... _BoundArgs> 817 1.5 mrg struct _Bind_check_arity<_Ret (*)(_Args...), _BoundArgs...> 818 1.5 mrg { 819 1.5 mrg static_assert(sizeof...(_BoundArgs) == sizeof...(_Args), 820 1.5 mrg "Wrong number of arguments for function"); 821 1.5 mrg }; 822 1.5 mrg 823 1.5 mrg template<typename _Ret, typename... _Args, typename... _BoundArgs> 824 1.5 mrg struct _Bind_check_arity<_Ret (*)(_Args......), _BoundArgs...> 825 1.5 mrg { 826 1.5 mrg static_assert(sizeof...(_BoundArgs) >= sizeof...(_Args), 827 1.5 mrg "Wrong number of arguments for function"); 828 1.5 mrg }; 829 1.5 mrg 830 1.5 mrg template<typename _Tp, typename _Class, typename... _BoundArgs> 831 1.5 mrg struct _Bind_check_arity<_Tp _Class::*, _BoundArgs...> 832 1.5 mrg { 833 1.5 mrg using _Arity = typename _Mem_fn<_Tp _Class::*>::_Arity; 834 1.5 mrg using _Varargs = typename _Mem_fn<_Tp _Class::*>::_Varargs; 835 1.5 mrg static_assert(_Varargs::value 836 1.5 mrg ? sizeof...(_BoundArgs) >= _Arity::value + 1 837 1.5 mrg : sizeof...(_BoundArgs) == _Arity::value + 1, 838 1.5 mrg "Wrong number of arguments for pointer-to-member"); 839 1.5 mrg }; 840 1.5 mrg 841 1.3 mrg // Trait type used to remove std::bind() from overload set via SFINAE 842 1.3 mrg // when first argument has integer type, so that std::bind() will 843 1.3 mrg // not be a better match than ::bind() from the BSD Sockets API. 844 1.3 mrg template<typename _Tp, typename _Tp2 = typename decay<_Tp>::type> 845 1.3 mrg using __is_socketlike = __or_<is_integral<_Tp2>, is_enum<_Tp2>>; 846 1.3 mrg 847 1.3 mrg template<bool _SocketLike, typename _Func, typename... _BoundArgs> 848 1.3 mrg struct _Bind_helper 849 1.5 mrg : _Bind_check_arity<typename decay<_Func>::type, _BoundArgs...> 850 1.3 mrg { 851 1.10 mrg typedef typename decay<_Func>::type __func_type; 852 1.3 mrg typedef _Bind<__func_type(typename decay<_BoundArgs>::type...)> type; 853 1.3 mrg }; 854 1.3 mrg 855 1.3 mrg // Partial specialization for is_socketlike == true, does not define 856 1.3 mrg // nested type so std::bind() will not participate in overload resolution 857 1.3 mrg // when the first argument might be a socket file descriptor. 858 1.3 mrg template<typename _Func, typename... _BoundArgs> 859 1.3 mrg struct _Bind_helper<true, _Func, _BoundArgs...> 860 1.3 mrg { }; 861 1.3 mrg 862 1.3 mrg /** 863 1.1 mrg * @brief Function template for std::bind. 864 1.1 mrg * @ingroup binders 865 1.14 mrg * @since C++11 866 1.1 mrg */ 867 1.3 mrg template<typename _Func, typename... _BoundArgs> 868 1.13 mrg inline _GLIBCXX20_CONSTEXPR typename 869 1.3 mrg _Bind_helper<__is_socketlike<_Func>::value, _Func, _BoundArgs...>::type 870 1.3 mrg bind(_Func&& __f, _BoundArgs&&... __args) 871 1.3 mrg { 872 1.3 mrg typedef _Bind_helper<false, _Func, _BoundArgs...> __helper_type; 873 1.10 mrg return typename __helper_type::type(std::forward<_Func>(__f), 874 1.10 mrg std::forward<_BoundArgs>(__args)...); 875 1.3 mrg } 876 1.3 mrg 877 1.3 mrg template<typename _Result, typename _Func, typename... _BoundArgs> 878 1.3 mrg struct _Bindres_helper 879 1.5 mrg : _Bind_check_arity<typename decay<_Func>::type, _BoundArgs...> 880 1.1 mrg { 881 1.10 mrg typedef typename decay<_Func>::type __functor_type; 882 1.3 mrg typedef _Bind_result<_Result, 883 1.3 mrg __functor_type(typename decay<_BoundArgs>::type...)> 884 1.3 mrg type; 885 1.3 mrg }; 886 1.1 mrg 887 1.1 mrg /** 888 1.3 mrg * @brief Function template for std::bind<R>. 889 1.1 mrg * @ingroup binders 890 1.14 mrg * @since C++11 891 1.1 mrg */ 892 1.3 mrg template<typename _Result, typename _Func, typename... _BoundArgs> 893 1.13 mrg inline _GLIBCXX20_CONSTEXPR 894 1.3 mrg typename _Bindres_helper<_Result, _Func, _BoundArgs...>::type 895 1.3 mrg bind(_Func&& __f, _BoundArgs&&... __args) 896 1.3 mrg { 897 1.3 mrg typedef _Bindres_helper<_Result, _Func, _BoundArgs...> __helper_type; 898 1.10 mrg return typename __helper_type::type(std::forward<_Func>(__f), 899 1.10 mrg std::forward<_BoundArgs>(__args)...); 900 1.3 mrg } 901 1.3 mrg 902 1.12 mrg #if __cplusplus > 201703L 903 1.12 mrg #define __cpp_lib_bind_front 201907L 904 1.12 mrg 905 1.12 mrg template<typename _Fd, typename... _BoundArgs> 906 1.12 mrg struct _Bind_front 907 1.12 mrg { 908 1.12 mrg static_assert(is_move_constructible_v<_Fd>); 909 1.12 mrg static_assert((is_move_constructible_v<_BoundArgs> && ...)); 910 1.12 mrg 911 1.12 mrg // First parameter is to ensure this constructor is never used 912 1.12 mrg // instead of the copy/move constructor. 913 1.12 mrg template<typename _Fn, typename... _Args> 914 1.12 mrg explicit constexpr 915 1.12 mrg _Bind_front(int, _Fn&& __fn, _Args&&... __args) 916 1.12 mrg noexcept(__and_<is_nothrow_constructible<_Fd, _Fn>, 917 1.12 mrg is_nothrow_constructible<_BoundArgs, _Args>...>::value) 918 1.12 mrg : _M_fd(std::forward<_Fn>(__fn)), 919 1.12 mrg _M_bound_args(std::forward<_Args>(__args)...) 920 1.12 mrg { static_assert(sizeof...(_Args) == sizeof...(_BoundArgs)); } 921 1.12 mrg 922 1.12 mrg _Bind_front(const _Bind_front&) = default; 923 1.12 mrg _Bind_front(_Bind_front&&) = default; 924 1.12 mrg _Bind_front& operator=(const _Bind_front&) = default; 925 1.12 mrg _Bind_front& operator=(_Bind_front&&) = default; 926 1.12 mrg ~_Bind_front() = default; 927 1.12 mrg 928 1.12 mrg template<typename... _CallArgs> 929 1.12 mrg constexpr 930 1.12 mrg invoke_result_t<_Fd&, _BoundArgs&..., _CallArgs...> 931 1.12 mrg operator()(_CallArgs&&... __call_args) & 932 1.12 mrg noexcept(is_nothrow_invocable_v<_Fd&, _BoundArgs&..., _CallArgs...>) 933 1.12 mrg { 934 1.12 mrg return _S_call(*this, _BoundIndices(), 935 1.12 mrg std::forward<_CallArgs>(__call_args)...); 936 1.12 mrg } 937 1.12 mrg 938 1.12 mrg template<typename... _CallArgs> 939 1.12 mrg constexpr 940 1.12 mrg invoke_result_t<const _Fd&, const _BoundArgs&..., _CallArgs...> 941 1.12 mrg operator()(_CallArgs&&... __call_args) const & 942 1.12 mrg noexcept(is_nothrow_invocable_v<const _Fd&, const _BoundArgs&..., 943 1.12 mrg _CallArgs...>) 944 1.12 mrg { 945 1.12 mrg return _S_call(*this, _BoundIndices(), 946 1.12 mrg std::forward<_CallArgs>(__call_args)...); 947 1.12 mrg } 948 1.12 mrg 949 1.12 mrg template<typename... _CallArgs> 950 1.12 mrg constexpr 951 1.12 mrg invoke_result_t<_Fd, _BoundArgs..., _CallArgs...> 952 1.12 mrg operator()(_CallArgs&&... __call_args) && 953 1.12 mrg noexcept(is_nothrow_invocable_v<_Fd, _BoundArgs..., _CallArgs...>) 954 1.12 mrg { 955 1.12 mrg return _S_call(std::move(*this), _BoundIndices(), 956 1.12 mrg std::forward<_CallArgs>(__call_args)...); 957 1.12 mrg } 958 1.12 mrg 959 1.12 mrg template<typename... _CallArgs> 960 1.12 mrg constexpr 961 1.12 mrg invoke_result_t<const _Fd, const _BoundArgs..., _CallArgs...> 962 1.12 mrg operator()(_CallArgs&&... __call_args) const && 963 1.12 mrg noexcept(is_nothrow_invocable_v<const _Fd, const _BoundArgs..., 964 1.12 mrg _CallArgs...>) 965 1.12 mrg { 966 1.12 mrg return _S_call(std::move(*this), _BoundIndices(), 967 1.12 mrg std::forward<_CallArgs>(__call_args)...); 968 1.12 mrg } 969 1.12 mrg 970 1.12 mrg private: 971 1.12 mrg using _BoundIndices = index_sequence_for<_BoundArgs...>; 972 1.12 mrg 973 1.12 mrg template<typename _Tp, size_t... _Ind, typename... _CallArgs> 974 1.12 mrg static constexpr 975 1.12 mrg decltype(auto) 976 1.12 mrg _S_call(_Tp&& __g, index_sequence<_Ind...>, _CallArgs&&... __call_args) 977 1.12 mrg { 978 1.12 mrg return std::invoke(std::forward<_Tp>(__g)._M_fd, 979 1.12 mrg std::get<_Ind>(std::forward<_Tp>(__g)._M_bound_args)..., 980 1.12 mrg std::forward<_CallArgs>(__call_args)...); 981 1.12 mrg } 982 1.12 mrg 983 1.12 mrg _Fd _M_fd; 984 1.12 mrg std::tuple<_BoundArgs...> _M_bound_args; 985 1.12 mrg }; 986 1.12 mrg 987 1.12 mrg template<typename _Fn, typename... _Args> 988 1.12 mrg using _Bind_front_t 989 1.12 mrg = _Bind_front<decay_t<_Fn>, decay_t<_Args>...>; 990 1.12 mrg 991 1.14 mrg /** Create call wrapper by partial application of arguments to function. 992 1.14 mrg * 993 1.14 mrg * The result of `std::bind_front(f, args...)` is a function object that 994 1.14 mrg * stores `f` and the bound arguments, `args...`. When that function 995 1.14 mrg * object is invoked with `call_args...` it returns the result of calling 996 1.14 mrg * `f(args..., call_args...)`. 997 1.14 mrg * 998 1.14 mrg * @since C++20 999 1.14 mrg */ 1000 1.12 mrg template<typename _Fn, typename... _Args> 1001 1.13 mrg constexpr _Bind_front_t<_Fn, _Args...> 1002 1.12 mrg bind_front(_Fn&& __fn, _Args&&... __args) 1003 1.13 mrg noexcept(is_nothrow_constructible_v<_Bind_front_t<_Fn, _Args...>, 1004 1.13 mrg int, _Fn, _Args...>) 1005 1.12 mrg { 1006 1.12 mrg return _Bind_front_t<_Fn, _Args...>(0, std::forward<_Fn>(__fn), 1007 1.12 mrg std::forward<_Args>(__args)...); 1008 1.12 mrg } 1009 1.14 mrg #endif // C++20 1010 1.12 mrg 1011 1.10 mrg #if __cplusplus >= 201402L 1012 1.10 mrg /// Generalized negator. 1013 1.10 mrg template<typename _Fn> 1014 1.10 mrg class _Not_fn 1015 1.3 mrg { 1016 1.10 mrg template<typename _Fn2, typename... _Args> 1017 1.10 mrg using __inv_res_t = typename __invoke_result<_Fn2, _Args...>::type; 1018 1.3 mrg 1019 1.10 mrg template<typename _Tp> 1020 1.10 mrg static decltype(!std::declval<_Tp>()) 1021 1.10 mrg _S_not() noexcept(noexcept(!std::declval<_Tp>())); 1022 1.3 mrg 1023 1.10 mrg public: 1024 1.10 mrg template<typename _Fn2> 1025 1.13 mrg constexpr 1026 1.10 mrg _Not_fn(_Fn2&& __fn, int) 1027 1.10 mrg : _M_fn(std::forward<_Fn2>(__fn)) { } 1028 1.10 mrg 1029 1.10 mrg _Not_fn(const _Not_fn& __fn) = default; 1030 1.10 mrg _Not_fn(_Not_fn&& __fn) = default; 1031 1.10 mrg ~_Not_fn() = default; 1032 1.10 mrg 1033 1.10 mrg // Macro to define operator() with given cv-qualifiers ref-qualifiers, 1034 1.10 mrg // forwarding _M_fn and the function arguments with the same qualifiers, 1035 1.10 mrg // and deducing the return type and exception-specification. 1036 1.10 mrg #define _GLIBCXX_NOT_FN_CALL_OP( _QUALS ) \ 1037 1.10 mrg template<typename... _Args> \ 1038 1.13 mrg _GLIBCXX20_CONSTEXPR \ 1039 1.10 mrg decltype(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>()) \ 1040 1.10 mrg operator()(_Args&&... __args) _QUALS \ 1041 1.10 mrg noexcept(__is_nothrow_invocable<_Fn _QUALS, _Args...>::value \ 1042 1.10 mrg && noexcept(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>())) \ 1043 1.10 mrg { \ 1044 1.10 mrg return !std::__invoke(std::forward< _Fn _QUALS >(_M_fn), \ 1045 1.10 mrg std::forward<_Args>(__args)...); \ 1046 1.10 mrg } 1047 1.10 mrg _GLIBCXX_NOT_FN_CALL_OP( & ) 1048 1.10 mrg _GLIBCXX_NOT_FN_CALL_OP( const & ) 1049 1.10 mrg _GLIBCXX_NOT_FN_CALL_OP( && ) 1050 1.10 mrg _GLIBCXX_NOT_FN_CALL_OP( const && ) 1051 1.13 mrg #undef _GLIBCXX_NOT_FN_CALL_OP 1052 1.3 mrg 1053 1.3 mrg private: 1054 1.10 mrg _Fn _M_fn; 1055 1.3 mrg }; 1056 1.3 mrg 1057 1.11 mrg template<typename _Tp, typename _Pred> 1058 1.11 mrg struct __is_byte_like : false_type { }; 1059 1.11 mrg 1060 1.11 mrg template<typename _Tp> 1061 1.11 mrg struct __is_byte_like<_Tp, equal_to<_Tp>> 1062 1.11 mrg : __bool_constant<sizeof(_Tp) == 1 && is_integral<_Tp>::value> { }; 1063 1.11 mrg 1064 1.11 mrg template<typename _Tp> 1065 1.11 mrg struct __is_byte_like<_Tp, equal_to<void>> 1066 1.11 mrg : __bool_constant<sizeof(_Tp) == 1 && is_integral<_Tp>::value> { }; 1067 1.11 mrg 1068 1.11 mrg #if __cplusplus >= 201703L 1069 1.11 mrg // Declare std::byte (full definition is in <cstddef>). 1070 1.11 mrg enum class byte : unsigned char; 1071 1.11 mrg 1072 1.11 mrg template<> 1073 1.11 mrg struct __is_byte_like<byte, equal_to<byte>> 1074 1.11 mrg : true_type { }; 1075 1.11 mrg 1076 1.11 mrg template<> 1077 1.11 mrg struct __is_byte_like<byte, equal_to<void>> 1078 1.11 mrg : true_type { }; 1079 1.11 mrg 1080 1.14 mrg // [func.not_fn] Function template not_fn 1081 1.14 mrg #define __cpp_lib_not_fn 201603L 1082 1.14 mrg /** Wrap a function object to create one that negates its result. 1083 1.14 mrg * 1084 1.14 mrg * The function template `std::not_fn` creates a "forwarding call wrapper", 1085 1.14 mrg * which is a function object that wraps another function object and 1086 1.14 mrg * when called, forwards its arguments to the wrapped function object. 1087 1.14 mrg * 1088 1.14 mrg * The result of invoking the wrapper is the negation (using `!`) of 1089 1.14 mrg * the wrapped function object. 1090 1.14 mrg * 1091 1.14 mrg * @ingroup functors 1092 1.14 mrg * @since C++17 1093 1.14 mrg */ 1094 1.10 mrg template<typename _Fn> 1095 1.13 mrg _GLIBCXX20_CONSTEXPR 1096 1.10 mrg inline auto 1097 1.10 mrg not_fn(_Fn&& __fn) 1098 1.10 mrg noexcept(std::is_nothrow_constructible<std::decay_t<_Fn>, _Fn&&>::value) 1099 1.1 mrg { 1100 1.10 mrg return _Not_fn<std::decay_t<_Fn>>{std::forward<_Fn>(__fn), 0}; 1101 1.1 mrg } 1102 1.1 mrg 1103 1.10 mrg // Searchers 1104 1.14 mrg #define __cpp_lib_boyer_moore_searcher 201603L 1105 1.1 mrg 1106 1.10 mrg template<typename _ForwardIterator1, typename _BinaryPredicate = equal_to<>> 1107 1.10 mrg class default_searcher 1108 1.10 mrg { 1109 1.10 mrg public: 1110 1.13 mrg _GLIBCXX20_CONSTEXPR 1111 1.10 mrg default_searcher(_ForwardIterator1 __pat_first, 1112 1.10 mrg _ForwardIterator1 __pat_last, 1113 1.10 mrg _BinaryPredicate __pred = _BinaryPredicate()) 1114 1.10 mrg : _M_m(__pat_first, __pat_last, std::move(__pred)) 1115 1.10 mrg { } 1116 1.1 mrg 1117 1.10 mrg template<typename _ForwardIterator2> 1118 1.13 mrg _GLIBCXX20_CONSTEXPR 1119 1.13 mrg pair<_ForwardIterator2, _ForwardIterator2> 1120 1.10 mrg operator()(_ForwardIterator2 __first, _ForwardIterator2 __last) const 1121 1.10 mrg { 1122 1.10 mrg _ForwardIterator2 __first_ret = 1123 1.10 mrg std::search(__first, __last, std::get<0>(_M_m), std::get<1>(_M_m), 1124 1.10 mrg std::get<2>(_M_m)); 1125 1.10 mrg auto __ret = std::make_pair(__first_ret, __first_ret); 1126 1.10 mrg if (__ret.first != __last) 1127 1.10 mrg std::advance(__ret.second, std::distance(std::get<0>(_M_m), 1128 1.10 mrg std::get<1>(_M_m))); 1129 1.10 mrg return __ret; 1130 1.10 mrg } 1131 1.1 mrg 1132 1.10 mrg private: 1133 1.10 mrg tuple<_ForwardIterator1, _ForwardIterator1, _BinaryPredicate> _M_m; 1134 1.10 mrg }; 1135 1.1 mrg 1136 1.10 mrg template<typename _Key, typename _Tp, typename _Hash, typename _Pred> 1137 1.10 mrg struct __boyer_moore_map_base 1138 1.1 mrg { 1139 1.10 mrg template<typename _RAIter> 1140 1.10 mrg __boyer_moore_map_base(_RAIter __pat, size_t __patlen, 1141 1.10 mrg _Hash&& __hf, _Pred&& __pred) 1142 1.10 mrg : _M_bad_char{ __patlen, std::move(__hf), std::move(__pred) } 1143 1.1 mrg { 1144 1.10 mrg if (__patlen > 0) 1145 1.10 mrg for (__diff_type __i = 0; __i < __patlen - 1; ++__i) 1146 1.10 mrg _M_bad_char[__pat[__i]] = __patlen - 1 - __i; 1147 1.1 mrg } 1148 1.1 mrg 1149 1.10 mrg using __diff_type = _Tp; 1150 1.1 mrg 1151 1.10 mrg __diff_type 1152 1.10 mrg _M_lookup(_Key __key, __diff_type __not_found) const 1153 1.10 mrg { 1154 1.10 mrg auto __iter = _M_bad_char.find(__key); 1155 1.10 mrg if (__iter == _M_bad_char.end()) 1156 1.10 mrg return __not_found; 1157 1.10 mrg return __iter->second; 1158 1.10 mrg } 1159 1.1 mrg 1160 1.10 mrg _Pred 1161 1.10 mrg _M_pred() const { return _M_bad_char.key_eq(); } 1162 1.3 mrg 1163 1.10 mrg _GLIBCXX_STD_C::unordered_map<_Key, _Tp, _Hash, _Pred> _M_bad_char; 1164 1.10 mrg }; 1165 1.3 mrg 1166 1.10 mrg template<typename _Tp, size_t _Len, typename _Pred> 1167 1.10 mrg struct __boyer_moore_array_base 1168 1.10 mrg { 1169 1.10 mrg template<typename _RAIter, typename _Unused> 1170 1.10 mrg __boyer_moore_array_base(_RAIter __pat, size_t __patlen, 1171 1.10 mrg _Unused&&, _Pred&& __pred) 1172 1.14 mrg : _M_bad_char{ array<_Tp, _Len>{}, std::move(__pred) } 1173 1.1 mrg { 1174 1.10 mrg std::get<0>(_M_bad_char).fill(__patlen); 1175 1.10 mrg if (__patlen > 0) 1176 1.10 mrg for (__diff_type __i = 0; __i < __patlen - 1; ++__i) 1177 1.10 mrg { 1178 1.10 mrg auto __ch = __pat[__i]; 1179 1.10 mrg using _UCh = make_unsigned_t<decltype(__ch)>; 1180 1.10 mrg auto __uch = static_cast<_UCh>(__ch); 1181 1.10 mrg std::get<0>(_M_bad_char)[__uch] = __patlen - 1 - __i; 1182 1.10 mrg } 1183 1.1 mrg } 1184 1.1 mrg 1185 1.10 mrg using __diff_type = _Tp; 1186 1.3 mrg 1187 1.10 mrg template<typename _Key> 1188 1.10 mrg __diff_type 1189 1.10 mrg _M_lookup(_Key __key, __diff_type __not_found) const 1190 1.1 mrg { 1191 1.10 mrg auto __ukey = static_cast<make_unsigned_t<_Key>>(__key); 1192 1.10 mrg if (__ukey >= _Len) 1193 1.10 mrg return __not_found; 1194 1.10 mrg return std::get<0>(_M_bad_char)[__ukey]; 1195 1.1 mrg } 1196 1.1 mrg 1197 1.10 mrg const _Pred& 1198 1.10 mrg _M_pred() const { return std::get<1>(_M_bad_char); } 1199 1.3 mrg 1200 1.14 mrg tuple<array<_Tp, _Len>, _Pred> _M_bad_char; 1201 1.10 mrg }; 1202 1.1 mrg 1203 1.10 mrg // Use __boyer_moore_array_base when pattern consists of narrow characters 1204 1.11 mrg // (or std::byte) and uses std::equal_to as the predicate. 1205 1.10 mrg template<typename _RAIter, typename _Hash, typename _Pred, 1206 1.10 mrg typename _Val = typename iterator_traits<_RAIter>::value_type, 1207 1.10 mrg typename _Diff = typename iterator_traits<_RAIter>::difference_type> 1208 1.10 mrg using __boyer_moore_base_t 1209 1.14 mrg = __conditional_t<__is_byte_like<_Val, _Pred>::value, 1210 1.14 mrg __boyer_moore_array_base<_Diff, 256, _Pred>, 1211 1.14 mrg __boyer_moore_map_base<_Val, _Diff, _Hash, _Pred>>; 1212 1.10 mrg 1213 1.10 mrg template<typename _RAIter, typename _Hash 1214 1.10 mrg = hash<typename iterator_traits<_RAIter>::value_type>, 1215 1.10 mrg typename _BinaryPredicate = equal_to<>> 1216 1.10 mrg class boyer_moore_searcher 1217 1.10 mrg : __boyer_moore_base_t<_RAIter, _Hash, _BinaryPredicate> 1218 1.1 mrg { 1219 1.10 mrg using _Base = __boyer_moore_base_t<_RAIter, _Hash, _BinaryPredicate>; 1220 1.10 mrg using typename _Base::__diff_type; 1221 1.1 mrg 1222 1.1 mrg public: 1223 1.10 mrg boyer_moore_searcher(_RAIter __pat_first, _RAIter __pat_last, 1224 1.10 mrg _Hash __hf = _Hash(), 1225 1.10 mrg _BinaryPredicate __pred = _BinaryPredicate()); 1226 1.10 mrg 1227 1.10 mrg template<typename _RandomAccessIterator2> 1228 1.10 mrg pair<_RandomAccessIterator2, _RandomAccessIterator2> 1229 1.10 mrg operator()(_RandomAccessIterator2 __first, 1230 1.10 mrg _RandomAccessIterator2 __last) const; 1231 1.1 mrg 1232 1.10 mrg private: 1233 1.10 mrg bool 1234 1.10 mrg _M_is_prefix(_RAIter __word, __diff_type __len, 1235 1.10 mrg __diff_type __pos) 1236 1.1 mrg { 1237 1.10 mrg const auto& __pred = this->_M_pred(); 1238 1.10 mrg __diff_type __suffixlen = __len - __pos; 1239 1.10 mrg for (__diff_type __i = 0; __i < __suffixlen; ++__i) 1240 1.10 mrg if (!__pred(__word[__i], __word[__pos + __i])) 1241 1.10 mrg return false; 1242 1.10 mrg return true; 1243 1.1 mrg } 1244 1.1 mrg 1245 1.10 mrg __diff_type 1246 1.10 mrg _M_suffix_length(_RAIter __word, __diff_type __len, 1247 1.10 mrg __diff_type __pos) 1248 1.1 mrg { 1249 1.10 mrg const auto& __pred = this->_M_pred(); 1250 1.10 mrg __diff_type __i = 0; 1251 1.10 mrg while (__pred(__word[__pos - __i], __word[__len - 1 - __i]) 1252 1.10 mrg && __i < __pos) 1253 1.1 mrg { 1254 1.10 mrg ++__i; 1255 1.1 mrg } 1256 1.10 mrg return __i; 1257 1.1 mrg } 1258 1.1 mrg 1259 1.10 mrg template<typename _Tp> 1260 1.10 mrg __diff_type 1261 1.10 mrg _M_bad_char_shift(_Tp __c) const 1262 1.10 mrg { return this->_M_lookup(__c, _M_pat_end - _M_pat); } 1263 1.10 mrg 1264 1.10 mrg _RAIter _M_pat; 1265 1.10 mrg _RAIter _M_pat_end; 1266 1.10 mrg _GLIBCXX_STD_C::vector<__diff_type> _M_good_suffix; 1267 1.10 mrg }; 1268 1.10 mrg 1269 1.10 mrg template<typename _RAIter, typename _Hash 1270 1.10 mrg = hash<typename iterator_traits<_RAIter>::value_type>, 1271 1.10 mrg typename _BinaryPredicate = equal_to<>> 1272 1.10 mrg class boyer_moore_horspool_searcher 1273 1.10 mrg : __boyer_moore_base_t<_RAIter, _Hash, _BinaryPredicate> 1274 1.1 mrg { 1275 1.10 mrg using _Base = __boyer_moore_base_t<_RAIter, _Hash, _BinaryPredicate>; 1276 1.10 mrg using typename _Base::__diff_type; 1277 1.3 mrg 1278 1.1 mrg public: 1279 1.10 mrg boyer_moore_horspool_searcher(_RAIter __pat, 1280 1.10 mrg _RAIter __pat_end, 1281 1.10 mrg _Hash __hf = _Hash(), 1282 1.10 mrg _BinaryPredicate __pred 1283 1.10 mrg = _BinaryPredicate()) 1284 1.10 mrg : _Base(__pat, __pat_end - __pat, std::move(__hf), std::move(__pred)), 1285 1.10 mrg _M_pat(__pat), _M_pat_end(__pat_end) 1286 1.10 mrg { } 1287 1.3 mrg 1288 1.10 mrg template<typename _RandomAccessIterator2> 1289 1.10 mrg pair<_RandomAccessIterator2, _RandomAccessIterator2> 1290 1.10 mrg operator()(_RandomAccessIterator2 __first, 1291 1.10 mrg _RandomAccessIterator2 __last) const 1292 1.10 mrg { 1293 1.10 mrg const auto& __pred = this->_M_pred(); 1294 1.10 mrg auto __patlen = _M_pat_end - _M_pat; 1295 1.10 mrg if (__patlen == 0) 1296 1.10 mrg return std::make_pair(__first, __first); 1297 1.10 mrg auto __len = __last - __first; 1298 1.10 mrg while (__len >= __patlen) 1299 1.10 mrg { 1300 1.10 mrg for (auto __scan = __patlen - 1; 1301 1.10 mrg __pred(__first[__scan], _M_pat[__scan]); --__scan) 1302 1.10 mrg if (__scan == 0) 1303 1.10 mrg return std::make_pair(__first, __first + __patlen); 1304 1.10 mrg auto __shift = _M_bad_char_shift(__first[__patlen - 1]); 1305 1.10 mrg __len -= __shift; 1306 1.10 mrg __first += __shift; 1307 1.10 mrg } 1308 1.10 mrg return std::make_pair(__last, __last); 1309 1.1 mrg } 1310 1.1 mrg 1311 1.1 mrg private: 1312 1.10 mrg template<typename _Tp> 1313 1.10 mrg __diff_type 1314 1.10 mrg _M_bad_char_shift(_Tp __c) const 1315 1.10 mrg { return this->_M_lookup(__c, _M_pat_end - _M_pat); } 1316 1.10 mrg 1317 1.10 mrg _RAIter _M_pat; 1318 1.10 mrg _RAIter _M_pat_end; 1319 1.10 mrg }; 1320 1.10 mrg 1321 1.10 mrg template<typename _RAIter, typename _Hash, typename _BinaryPredicate> 1322 1.10 mrg boyer_moore_searcher<_RAIter, _Hash, _BinaryPredicate>:: 1323 1.10 mrg boyer_moore_searcher(_RAIter __pat, _RAIter __pat_end, 1324 1.10 mrg _Hash __hf, _BinaryPredicate __pred) 1325 1.10 mrg : _Base(__pat, __pat_end - __pat, std::move(__hf), std::move(__pred)), 1326 1.10 mrg _M_pat(__pat), _M_pat_end(__pat_end), _M_good_suffix(__pat_end - __pat) 1327 1.10 mrg { 1328 1.10 mrg auto __patlen = __pat_end - __pat; 1329 1.10 mrg if (__patlen == 0) 1330 1.10 mrg return; 1331 1.10 mrg __diff_type __last_prefix = __patlen - 1; 1332 1.10 mrg for (__diff_type __p = __patlen - 1; __p >= 0; --__p) 1333 1.10 mrg { 1334 1.10 mrg if (_M_is_prefix(__pat, __patlen, __p + 1)) 1335 1.10 mrg __last_prefix = __p + 1; 1336 1.10 mrg _M_good_suffix[__p] = __last_prefix + (__patlen - 1 - __p); 1337 1.10 mrg } 1338 1.10 mrg for (__diff_type __p = 0; __p < __patlen - 1; ++__p) 1339 1.10 mrg { 1340 1.10 mrg auto __slen = _M_suffix_length(__pat, __patlen, __p); 1341 1.10 mrg auto __pos = __patlen - 1 - __slen; 1342 1.10 mrg if (!__pred(__pat[__p - __slen], __pat[__pos])) 1343 1.10 mrg _M_good_suffix[__pos] = __patlen - 1 - __p + __slen; 1344 1.1 mrg } 1345 1.1 mrg } 1346 1.1 mrg 1347 1.10 mrg template<typename _RAIter, typename _Hash, typename _BinaryPredicate> 1348 1.10 mrg template<typename _RandomAccessIterator2> 1349 1.10 mrg pair<_RandomAccessIterator2, _RandomAccessIterator2> 1350 1.10 mrg boyer_moore_searcher<_RAIter, _Hash, _BinaryPredicate>:: 1351 1.10 mrg operator()(_RandomAccessIterator2 __first, 1352 1.10 mrg _RandomAccessIterator2 __last) const 1353 1.10 mrg { 1354 1.10 mrg auto __patlen = _M_pat_end - _M_pat; 1355 1.10 mrg if (__patlen == 0) 1356 1.10 mrg return std::make_pair(__first, __first); 1357 1.10 mrg const auto& __pred = this->_M_pred(); 1358 1.10 mrg __diff_type __i = __patlen - 1; 1359 1.10 mrg auto __stringlen = __last - __first; 1360 1.10 mrg while (__i < __stringlen) 1361 1.10 mrg { 1362 1.10 mrg __diff_type __j = __patlen - 1; 1363 1.10 mrg while (__j >= 0 && __pred(__first[__i], _M_pat[__j])) 1364 1.10 mrg { 1365 1.10 mrg --__i; 1366 1.10 mrg --__j; 1367 1.10 mrg } 1368 1.10 mrg if (__j < 0) 1369 1.10 mrg { 1370 1.10 mrg const auto __match = __first + __i + 1; 1371 1.10 mrg return std::make_pair(__match, __match + __patlen); 1372 1.10 mrg } 1373 1.10 mrg __i += std::max(_M_bad_char_shift(__first[__i]), 1374 1.10 mrg _M_good_suffix[__j]); 1375 1.3 mrg } 1376 1.10 mrg return std::make_pair(__last, __last); 1377 1.1 mrg } 1378 1.1 mrg 1379 1.10 mrg #endif // C++17 1380 1.10 mrg #endif // C++14 1381 1.14 mrg #endif // C++11 1382 1.1 mrg 1383 1.3 mrg _GLIBCXX_END_NAMESPACE_VERSION 1384 1.3 mrg } // namespace std 1385 1.3 mrg 1386 1.1 mrg #endif // _GLIBCXX_FUNCTIONAL 1387