xref: /netbsd-src/external/gpl3/gcc/dist/libstdc++-v3/include/bits/predefined_ops.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
14d5abbe8Smrg // Default predicates for internal use -*- C++ -*-
24d5abbe8Smrg 
3*b1e83836Smrg // Copyright (C) 2013-2022 Free Software Foundation, Inc.
44d5abbe8Smrg //
54d5abbe8Smrg // This file is part of the GNU ISO C++ Library.  This library is free
64d5abbe8Smrg // software; you can redistribute it and/or modify it under the
74d5abbe8Smrg // terms of the GNU General Public License as published by the
84d5abbe8Smrg // Free Software Foundation; either version 3, or (at your option)
94d5abbe8Smrg // any later version.
104d5abbe8Smrg 
114d5abbe8Smrg // This library is distributed in the hope that it will be useful,
124d5abbe8Smrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
134d5abbe8Smrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
144d5abbe8Smrg // GNU General Public License for more details.
154d5abbe8Smrg 
164d5abbe8Smrg // Under Section 7 of GPL version 3, you are granted additional
174d5abbe8Smrg // permissions described in the GCC Runtime Library Exception, version
184d5abbe8Smrg // 3.1, as published by the Free Software Foundation.
194d5abbe8Smrg 
204d5abbe8Smrg // You should have received a copy of the GNU General Public License and
214d5abbe8Smrg // a copy of the GCC Runtime Library Exception along with this program;
224d5abbe8Smrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
234d5abbe8Smrg // <http://www.gnu.org/licenses/>.
244d5abbe8Smrg 
254d5abbe8Smrg /** @file predefined_ops.h
264d5abbe8Smrg  *  This is an internal header file, included by other library headers.
273f4ceed9Smrg  *  You should not attempt to use it directly. @headername{algorithm}
284d5abbe8Smrg  */
294d5abbe8Smrg 
304d5abbe8Smrg #ifndef _GLIBCXX_PREDEFINED_OPS_H
314d5abbe8Smrg #define _GLIBCXX_PREDEFINED_OPS_H	1
324d5abbe8Smrg 
33*b1e83836Smrg #include <bits/move.h>
34*b1e83836Smrg 
354d5abbe8Smrg namespace __gnu_cxx
364d5abbe8Smrg {
374d5abbe8Smrg namespace __ops
384d5abbe8Smrg {
394d5abbe8Smrg   struct _Iter_less_iter
404d5abbe8Smrg   {
414d5abbe8Smrg     template<typename _Iterator1, typename _Iterator2>
424d5abbe8Smrg       _GLIBCXX14_CONSTEXPR
434d5abbe8Smrg       bool
operator_Iter_less_iter444d5abbe8Smrg       operator()(_Iterator1 __it1, _Iterator2 __it2) const
454d5abbe8Smrg       { return *__it1 < *__it2; }
464d5abbe8Smrg   };
473f4ceed9Smrg 
484d5abbe8Smrg   _GLIBCXX14_CONSTEXPR
494d5abbe8Smrg   inline _Iter_less_iter
__iter_less_iter()504d5abbe8Smrg   __iter_less_iter()
514d5abbe8Smrg   { return _Iter_less_iter(); }
524d5abbe8Smrg 
534d5abbe8Smrg   struct _Iter_less_val
544d5abbe8Smrg   {
55b17d1066Smrg #if __cplusplus >= 201103L
56b17d1066Smrg     constexpr _Iter_less_val() = default;
57b17d1066Smrg #else
58b17d1066Smrg     _Iter_less_val() { }
59b17d1066Smrg #endif
60b17d1066Smrg 
61fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
62b17d1066Smrg     explicit
_Iter_less_val_Iter_less_val63b17d1066Smrg     _Iter_less_val(_Iter_less_iter) { }
64b17d1066Smrg 
654d5abbe8Smrg     template<typename _Iterator, typename _Value>
66fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
674d5abbe8Smrg       bool
operator_Iter_less_val684d5abbe8Smrg       operator()(_Iterator __it, _Value& __val) const
694d5abbe8Smrg       { return *__it < __val; }
704d5abbe8Smrg   };
714d5abbe8Smrg 
72fb8a8121Smrg   _GLIBCXX20_CONSTEXPR
734d5abbe8Smrg   inline _Iter_less_val
__iter_less_val()744d5abbe8Smrg   __iter_less_val()
754d5abbe8Smrg   { return _Iter_less_val(); }
764d5abbe8Smrg 
77fb8a8121Smrg   _GLIBCXX20_CONSTEXPR
784d5abbe8Smrg   inline _Iter_less_val
__iter_comp_val(_Iter_less_iter)794d5abbe8Smrg   __iter_comp_val(_Iter_less_iter)
804d5abbe8Smrg   { return _Iter_less_val(); }
814d5abbe8Smrg 
824d5abbe8Smrg   struct _Val_less_iter
834d5abbe8Smrg   {
84b17d1066Smrg #if __cplusplus >= 201103L
85b17d1066Smrg     constexpr _Val_less_iter() = default;
86b17d1066Smrg #else
87b17d1066Smrg     _Val_less_iter() { }
88b17d1066Smrg #endif
89b17d1066Smrg 
90fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
91b17d1066Smrg     explicit
_Val_less_iter_Val_less_iter92b17d1066Smrg     _Val_less_iter(_Iter_less_iter) { }
93b17d1066Smrg 
944d5abbe8Smrg     template<typename _Value, typename _Iterator>
95fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
964d5abbe8Smrg       bool
operator_Val_less_iter974d5abbe8Smrg       operator()(_Value& __val, _Iterator __it) const
984d5abbe8Smrg       { return __val < *__it; }
994d5abbe8Smrg   };
1004d5abbe8Smrg 
101fb8a8121Smrg   _GLIBCXX20_CONSTEXPR
1024d5abbe8Smrg   inline _Val_less_iter
__val_less_iter()1034d5abbe8Smrg   __val_less_iter()
1044d5abbe8Smrg   { return _Val_less_iter(); }
1054d5abbe8Smrg 
106fb8a8121Smrg   _GLIBCXX20_CONSTEXPR
1074d5abbe8Smrg   inline _Val_less_iter
__val_comp_iter(_Iter_less_iter)1084d5abbe8Smrg   __val_comp_iter(_Iter_less_iter)
1094d5abbe8Smrg   { return _Val_less_iter(); }
1104d5abbe8Smrg 
1114d5abbe8Smrg   struct _Iter_equal_to_iter
1124d5abbe8Smrg   {
1134d5abbe8Smrg     template<typename _Iterator1, typename _Iterator2>
114fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
1154d5abbe8Smrg       bool
operator_Iter_equal_to_iter1164d5abbe8Smrg       operator()(_Iterator1 __it1, _Iterator2 __it2) const
1174d5abbe8Smrg       { return *__it1 == *__it2; }
1184d5abbe8Smrg   };
1194d5abbe8Smrg 
120fb8a8121Smrg   _GLIBCXX20_CONSTEXPR
1214d5abbe8Smrg   inline _Iter_equal_to_iter
__iter_equal_to_iter()1224d5abbe8Smrg   __iter_equal_to_iter()
1234d5abbe8Smrg   { return _Iter_equal_to_iter(); }
1244d5abbe8Smrg 
1254d5abbe8Smrg   struct _Iter_equal_to_val
1264d5abbe8Smrg   {
1274d5abbe8Smrg     template<typename _Iterator, typename _Value>
128fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
1294d5abbe8Smrg       bool
operator_Iter_equal_to_val1304d5abbe8Smrg       operator()(_Iterator __it, _Value& __val) const
1314d5abbe8Smrg       { return *__it == __val; }
1324d5abbe8Smrg   };
1334d5abbe8Smrg 
134fb8a8121Smrg   _GLIBCXX20_CONSTEXPR
1354d5abbe8Smrg   inline _Iter_equal_to_val
__iter_equal_to_val()1364d5abbe8Smrg   __iter_equal_to_val()
1374d5abbe8Smrg   { return _Iter_equal_to_val(); }
1384d5abbe8Smrg 
139fb8a8121Smrg   _GLIBCXX20_CONSTEXPR
1404d5abbe8Smrg   inline _Iter_equal_to_val
__iter_comp_val(_Iter_equal_to_iter)1414d5abbe8Smrg   __iter_comp_val(_Iter_equal_to_iter)
1424d5abbe8Smrg   { return _Iter_equal_to_val(); }
1434d5abbe8Smrg 
1444d5abbe8Smrg   template<typename _Compare>
1454d5abbe8Smrg     struct _Iter_comp_iter
1464d5abbe8Smrg     {
1474d5abbe8Smrg       _Compare _M_comp;
1483f4ceed9Smrg 
1493f4ceed9Smrg       explicit _GLIBCXX14_CONSTEXPR
_Iter_comp_iter_Iter_comp_iter1504d5abbe8Smrg       _Iter_comp_iter(_Compare __comp)
151b17d1066Smrg 	: _M_comp(_GLIBCXX_MOVE(__comp))
1524d5abbe8Smrg       { }
1534d5abbe8Smrg 
1544d5abbe8Smrg       template<typename _Iterator1, typename _Iterator2>
1554d5abbe8Smrg         _GLIBCXX14_CONSTEXPR
1564d5abbe8Smrg         bool
operator_Iter_comp_iter1574d5abbe8Smrg         operator()(_Iterator1 __it1, _Iterator2 __it2)
1584d5abbe8Smrg         { return bool(_M_comp(*__it1, *__it2)); }
1594d5abbe8Smrg     };
1604d5abbe8Smrg 
1614d5abbe8Smrg   template<typename _Compare>
1624d5abbe8Smrg     _GLIBCXX14_CONSTEXPR
1634d5abbe8Smrg     inline _Iter_comp_iter<_Compare>
__iter_comp_iter(_Compare __comp)1644d5abbe8Smrg     __iter_comp_iter(_Compare __comp)
165b17d1066Smrg     { return _Iter_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }
1664d5abbe8Smrg 
1674d5abbe8Smrg   template<typename _Compare>
1684d5abbe8Smrg     struct _Iter_comp_val
1694d5abbe8Smrg     {
1704d5abbe8Smrg       _Compare _M_comp;
1714d5abbe8Smrg 
172fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
1733f4ceed9Smrg       explicit
_Iter_comp_val_Iter_comp_val1744d5abbe8Smrg       _Iter_comp_val(_Compare __comp)
175b17d1066Smrg 	: _M_comp(_GLIBCXX_MOVE(__comp))
1764d5abbe8Smrg       { }
1774d5abbe8Smrg 
178fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
179b17d1066Smrg       explicit
_Iter_comp_val_Iter_comp_val180b17d1066Smrg       _Iter_comp_val(const _Iter_comp_iter<_Compare>& __comp)
181b17d1066Smrg 	: _M_comp(__comp._M_comp)
182b17d1066Smrg       { }
183b17d1066Smrg 
184b17d1066Smrg #if __cplusplus >= 201103L
185fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
186b17d1066Smrg       explicit
_Iter_comp_val_Iter_comp_val187b17d1066Smrg       _Iter_comp_val(_Iter_comp_iter<_Compare>&& __comp)
188b17d1066Smrg 	: _M_comp(std::move(__comp._M_comp))
189b17d1066Smrg       { }
190b17d1066Smrg #endif
191b17d1066Smrg 
1924d5abbe8Smrg       template<typename _Iterator, typename _Value>
193fb8a8121Smrg 	_GLIBCXX20_CONSTEXPR
1944d5abbe8Smrg 	bool
operator_Iter_comp_val1954d5abbe8Smrg 	operator()(_Iterator __it, _Value& __val)
1964d5abbe8Smrg 	{ return bool(_M_comp(*__it, __val)); }
1974d5abbe8Smrg     };
1984d5abbe8Smrg 
1994d5abbe8Smrg   template<typename _Compare>
200fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
2014d5abbe8Smrg     inline _Iter_comp_val<_Compare>
__iter_comp_val(_Compare __comp)2024d5abbe8Smrg     __iter_comp_val(_Compare __comp)
203b17d1066Smrg     { return _Iter_comp_val<_Compare>(_GLIBCXX_MOVE(__comp)); }
2044d5abbe8Smrg 
2054d5abbe8Smrg   template<typename _Compare>
206fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
2074d5abbe8Smrg     inline _Iter_comp_val<_Compare>
__iter_comp_val(_Iter_comp_iter<_Compare> __comp)2084d5abbe8Smrg     __iter_comp_val(_Iter_comp_iter<_Compare> __comp)
209b17d1066Smrg     { return _Iter_comp_val<_Compare>(_GLIBCXX_MOVE(__comp)); }
2104d5abbe8Smrg 
2114d5abbe8Smrg   template<typename _Compare>
2124d5abbe8Smrg     struct _Val_comp_iter
2134d5abbe8Smrg     {
2144d5abbe8Smrg       _Compare _M_comp;
2154d5abbe8Smrg 
216fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
2173f4ceed9Smrg       explicit
_Val_comp_iter_Val_comp_iter2184d5abbe8Smrg       _Val_comp_iter(_Compare __comp)
219b17d1066Smrg 	: _M_comp(_GLIBCXX_MOVE(__comp))
2204d5abbe8Smrg       { }
2214d5abbe8Smrg 
222fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
223b17d1066Smrg       explicit
_Val_comp_iter_Val_comp_iter224b17d1066Smrg       _Val_comp_iter(const _Iter_comp_iter<_Compare>& __comp)
225b17d1066Smrg 	: _M_comp(__comp._M_comp)
226b17d1066Smrg       { }
227b17d1066Smrg 
228b17d1066Smrg #if __cplusplus >= 201103L
229fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
230b17d1066Smrg       explicit
_Val_comp_iter_Val_comp_iter231b17d1066Smrg       _Val_comp_iter(_Iter_comp_iter<_Compare>&& __comp)
232b17d1066Smrg 	: _M_comp(std::move(__comp._M_comp))
233b17d1066Smrg       { }
234b17d1066Smrg #endif
235b17d1066Smrg 
2364d5abbe8Smrg       template<typename _Value, typename _Iterator>
237fb8a8121Smrg 	_GLIBCXX20_CONSTEXPR
2384d5abbe8Smrg 	bool
operator_Val_comp_iter2394d5abbe8Smrg 	operator()(_Value& __val, _Iterator __it)
2404d5abbe8Smrg 	{ return bool(_M_comp(__val, *__it)); }
2414d5abbe8Smrg     };
2424d5abbe8Smrg 
2434d5abbe8Smrg   template<typename _Compare>
244fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
2454d5abbe8Smrg     inline _Val_comp_iter<_Compare>
__val_comp_iter(_Compare __comp)2464d5abbe8Smrg     __val_comp_iter(_Compare __comp)
247b17d1066Smrg     { return _Val_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }
2484d5abbe8Smrg 
2494d5abbe8Smrg   template<typename _Compare>
250fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
2514d5abbe8Smrg     inline _Val_comp_iter<_Compare>
__val_comp_iter(_Iter_comp_iter<_Compare> __comp)2524d5abbe8Smrg     __val_comp_iter(_Iter_comp_iter<_Compare> __comp)
253b17d1066Smrg     { return _Val_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }
2544d5abbe8Smrg 
2554d5abbe8Smrg   template<typename _Value>
2564d5abbe8Smrg     struct _Iter_equals_val
2574d5abbe8Smrg     {
2584d5abbe8Smrg       _Value& _M_value;
2594d5abbe8Smrg 
260fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
2613f4ceed9Smrg       explicit
_Iter_equals_val_Iter_equals_val2624d5abbe8Smrg       _Iter_equals_val(_Value& __value)
2634d5abbe8Smrg 	: _M_value(__value)
2644d5abbe8Smrg       { }
2654d5abbe8Smrg 
2664d5abbe8Smrg       template<typename _Iterator>
267fb8a8121Smrg 	_GLIBCXX20_CONSTEXPR
2684d5abbe8Smrg 	bool
operator_Iter_equals_val2694d5abbe8Smrg 	operator()(_Iterator __it)
2704d5abbe8Smrg 	{ return *__it == _M_value; }
2714d5abbe8Smrg     };
2724d5abbe8Smrg 
2734d5abbe8Smrg   template<typename _Value>
274fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
2754d5abbe8Smrg     inline _Iter_equals_val<_Value>
__iter_equals_val(_Value & __val)2764d5abbe8Smrg     __iter_equals_val(_Value& __val)
2774d5abbe8Smrg     { return _Iter_equals_val<_Value>(__val); }
2784d5abbe8Smrg 
2794d5abbe8Smrg   template<typename _Iterator1>
2804d5abbe8Smrg     struct _Iter_equals_iter
2814d5abbe8Smrg     {
2823f4ceed9Smrg       _Iterator1 _M_it1;
2834d5abbe8Smrg 
284fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
2853f4ceed9Smrg       explicit
_Iter_equals_iter_Iter_equals_iter2864d5abbe8Smrg       _Iter_equals_iter(_Iterator1 __it1)
2873f4ceed9Smrg 	: _M_it1(__it1)
2884d5abbe8Smrg       { }
2894d5abbe8Smrg 
2904d5abbe8Smrg       template<typename _Iterator2>
291fb8a8121Smrg 	_GLIBCXX20_CONSTEXPR
2924d5abbe8Smrg 	bool
operator_Iter_equals_iter2934d5abbe8Smrg 	operator()(_Iterator2 __it2)
2943f4ceed9Smrg 	{ return *__it2 == *_M_it1; }
2954d5abbe8Smrg     };
2964d5abbe8Smrg 
2974d5abbe8Smrg   template<typename _Iterator>
298fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
2994d5abbe8Smrg     inline _Iter_equals_iter<_Iterator>
__iter_comp_iter(_Iter_equal_to_iter,_Iterator __it)3004d5abbe8Smrg     __iter_comp_iter(_Iter_equal_to_iter, _Iterator __it)
3014d5abbe8Smrg     { return _Iter_equals_iter<_Iterator>(__it); }
3024d5abbe8Smrg 
3034d5abbe8Smrg   template<typename _Predicate>
3044d5abbe8Smrg     struct _Iter_pred
3054d5abbe8Smrg     {
3064d5abbe8Smrg       _Predicate _M_pred;
3074d5abbe8Smrg 
308fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
3093f4ceed9Smrg       explicit
_Iter_pred_Iter_pred3104d5abbe8Smrg       _Iter_pred(_Predicate __pred)
311b17d1066Smrg 	: _M_pred(_GLIBCXX_MOVE(__pred))
3124d5abbe8Smrg       { }
3134d5abbe8Smrg 
3144d5abbe8Smrg       template<typename _Iterator>
315fb8a8121Smrg 	_GLIBCXX20_CONSTEXPR
3164d5abbe8Smrg 	bool
operator_Iter_pred3174d5abbe8Smrg 	operator()(_Iterator __it)
3184d5abbe8Smrg 	{ return bool(_M_pred(*__it)); }
3194d5abbe8Smrg     };
3204d5abbe8Smrg 
3214d5abbe8Smrg   template<typename _Predicate>
322fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
3234d5abbe8Smrg     inline _Iter_pred<_Predicate>
__pred_iter(_Predicate __pred)3244d5abbe8Smrg     __pred_iter(_Predicate __pred)
325b17d1066Smrg     { return _Iter_pred<_Predicate>(_GLIBCXX_MOVE(__pred)); }
3264d5abbe8Smrg 
3274d5abbe8Smrg   template<typename _Compare, typename _Value>
3284d5abbe8Smrg     struct _Iter_comp_to_val
3294d5abbe8Smrg     {
3304d5abbe8Smrg       _Compare _M_comp;
3314d5abbe8Smrg       _Value& _M_value;
3324d5abbe8Smrg 
333fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
_Iter_comp_to_val_Iter_comp_to_val3344d5abbe8Smrg       _Iter_comp_to_val(_Compare __comp, _Value& __value)
335b17d1066Smrg 	: _M_comp(_GLIBCXX_MOVE(__comp)), _M_value(__value)
3364d5abbe8Smrg       { }
3374d5abbe8Smrg 
3384d5abbe8Smrg       template<typename _Iterator>
339fb8a8121Smrg 	_GLIBCXX20_CONSTEXPR
3404d5abbe8Smrg 	bool
operator_Iter_comp_to_val3414d5abbe8Smrg 	operator()(_Iterator __it)
3424d5abbe8Smrg 	{ return bool(_M_comp(*__it, _M_value)); }
3434d5abbe8Smrg     };
3444d5abbe8Smrg 
3454d5abbe8Smrg   template<typename _Compare, typename _Value>
3464d5abbe8Smrg     _Iter_comp_to_val<_Compare, _Value>
347fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
__iter_comp_val(_Compare __comp,_Value & __val)3484d5abbe8Smrg     __iter_comp_val(_Compare __comp, _Value &__val)
349b17d1066Smrg     {
350b17d1066Smrg       return _Iter_comp_to_val<_Compare, _Value>(_GLIBCXX_MOVE(__comp), __val);
351b17d1066Smrg     }
3524d5abbe8Smrg 
3534d5abbe8Smrg   template<typename _Compare, typename _Iterator1>
3544d5abbe8Smrg     struct _Iter_comp_to_iter
3554d5abbe8Smrg     {
3564d5abbe8Smrg       _Compare _M_comp;
3573f4ceed9Smrg       _Iterator1 _M_it1;
3584d5abbe8Smrg 
359fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
_Iter_comp_to_iter_Iter_comp_to_iter3604d5abbe8Smrg       _Iter_comp_to_iter(_Compare __comp, _Iterator1 __it1)
361b17d1066Smrg 	: _M_comp(_GLIBCXX_MOVE(__comp)), _M_it1(__it1)
3624d5abbe8Smrg       { }
3634d5abbe8Smrg 
3644d5abbe8Smrg       template<typename _Iterator2>
365fb8a8121Smrg 	_GLIBCXX20_CONSTEXPR
3664d5abbe8Smrg 	bool
operator_Iter_comp_to_iter3674d5abbe8Smrg 	operator()(_Iterator2 __it2)
3683f4ceed9Smrg 	{ return bool(_M_comp(*__it2, *_M_it1)); }
3694d5abbe8Smrg     };
3704d5abbe8Smrg 
3714d5abbe8Smrg   template<typename _Compare, typename _Iterator>
372fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
3734d5abbe8Smrg     inline _Iter_comp_to_iter<_Compare, _Iterator>
__iter_comp_iter(_Iter_comp_iter<_Compare> __comp,_Iterator __it)3744d5abbe8Smrg     __iter_comp_iter(_Iter_comp_iter<_Compare> __comp, _Iterator __it)
375b17d1066Smrg     {
376b17d1066Smrg       return _Iter_comp_to_iter<_Compare, _Iterator>(
377b17d1066Smrg 	  _GLIBCXX_MOVE(__comp._M_comp), __it);
378b17d1066Smrg     }
3794d5abbe8Smrg 
3804d5abbe8Smrg   template<typename _Predicate>
3814d5abbe8Smrg     struct _Iter_negate
3824d5abbe8Smrg     {
3834d5abbe8Smrg       _Predicate _M_pred;
3844d5abbe8Smrg 
385fb8a8121Smrg       _GLIBCXX20_CONSTEXPR
3863f4ceed9Smrg       explicit
_Iter_negate_Iter_negate3874d5abbe8Smrg       _Iter_negate(_Predicate __pred)
388b17d1066Smrg 	: _M_pred(_GLIBCXX_MOVE(__pred))
3894d5abbe8Smrg       { }
3904d5abbe8Smrg 
3914d5abbe8Smrg       template<typename _Iterator>
392fb8a8121Smrg 	_GLIBCXX20_CONSTEXPR
3934d5abbe8Smrg 	bool
operator_Iter_negate3944d5abbe8Smrg 	operator()(_Iterator __it)
3954d5abbe8Smrg 	{ return !bool(_M_pred(*__it)); }
3964d5abbe8Smrg     };
3974d5abbe8Smrg 
3984d5abbe8Smrg   template<typename _Predicate>
399fb8a8121Smrg     _GLIBCXX20_CONSTEXPR
4004d5abbe8Smrg     inline _Iter_negate<_Predicate>
__negate(_Iter_pred<_Predicate> __pred)4014d5abbe8Smrg     __negate(_Iter_pred<_Predicate> __pred)
402b17d1066Smrg     { return _Iter_negate<_Predicate>(_GLIBCXX_MOVE(__pred._M_pred)); }
4034d5abbe8Smrg 
4044d5abbe8Smrg } // namespace __ops
4054d5abbe8Smrg } // namespace __gnu_cxx
4064d5abbe8Smrg 
4074d5abbe8Smrg #endif
408