1  // Default predicates for internal use -*- C++ -*-
       2  
       3  // Copyright (C) 2013-2023 Free Software Foundation, Inc.
       4  //
       5  // This file is part of the GNU ISO C++ Library.  This library is free
       6  // software; you can redistribute it and/or modify it under the
       7  // terms of the GNU General Public License as published by the
       8  // Free Software Foundation; either version 3, or (at your option)
       9  // any later version.
      10  
      11  // This library is distributed in the hope that it will be useful,
      12  // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14  // GNU General Public License for more details.
      15  
      16  // Under Section 7 of GPL version 3, you are granted additional
      17  // permissions described in the GCC Runtime Library Exception, version
      18  // 3.1, as published by the Free Software Foundation.
      19  
      20  // You should have received a copy of the GNU General Public License and
      21  // a copy of the GCC Runtime Library Exception along with this program;
      22  // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      23  // <http://www.gnu.org/licenses/>.
      24  
      25  /** @file predefined_ops.h
      26   *  This is an internal header file, included by other library headers.
      27   *  You should not attempt to use it directly. @headername{algorithm}
      28   */
      29  
      30  #ifndef _GLIBCXX_PREDEFINED_OPS_H
      31  #define _GLIBCXX_PREDEFINED_OPS_H	1
      32  
      33  #include <bits/move.h>
      34  
      35  namespace __gnu_cxx
      36  {
      37  namespace __ops
      38  {
      39    struct _Iter_less_iter
      40    {
      41      template<typename _Iterator1, typename _Iterator2>
      42        _GLIBCXX14_CONSTEXPR
      43        bool
      44        operator()(_Iterator1 __it1, _Iterator2 __it2) const
      45        { return *__it1 < *__it2; }
      46    };
      47  
      48    _GLIBCXX14_CONSTEXPR
      49    inline _Iter_less_iter
      50    __iter_less_iter()
      51    { return _Iter_less_iter(); }
      52  
      53    struct _Iter_less_val
      54    {
      55  #if __cplusplus >= 201103L
      56      constexpr _Iter_less_val() = default;
      57  #else
      58      _Iter_less_val() { }
      59  #endif
      60  
      61      _GLIBCXX20_CONSTEXPR
      62      explicit
      63      _Iter_less_val(_Iter_less_iter) { }
      64  
      65      template<typename _Iterator, typename _Value>
      66        _GLIBCXX20_CONSTEXPR
      67        bool
      68        operator()(_Iterator __it, _Value& __val) const
      69        { return *__it < __val; }
      70    };
      71  
      72    _GLIBCXX20_CONSTEXPR
      73    inline _Iter_less_val
      74    __iter_less_val()
      75    { return _Iter_less_val(); }
      76  
      77    _GLIBCXX20_CONSTEXPR
      78    inline _Iter_less_val
      79    __iter_comp_val(_Iter_less_iter)
      80    { return _Iter_less_val(); }
      81  
      82    struct _Val_less_iter
      83    {
      84  #if __cplusplus >= 201103L
      85      constexpr _Val_less_iter() = default;
      86  #else
      87      _Val_less_iter() { }
      88  #endif
      89  
      90      _GLIBCXX20_CONSTEXPR
      91      explicit
      92      _Val_less_iter(_Iter_less_iter) { }
      93  
      94      template<typename _Value, typename _Iterator>
      95        _GLIBCXX20_CONSTEXPR
      96        bool
      97        operator()(_Value& __val, _Iterator __it) const
      98        { return __val < *__it; }
      99    };
     100  
     101    _GLIBCXX20_CONSTEXPR
     102    inline _Val_less_iter
     103    __val_less_iter()
     104    { return _Val_less_iter(); }
     105  
     106    _GLIBCXX20_CONSTEXPR
     107    inline _Val_less_iter
     108    __val_comp_iter(_Iter_less_iter)
     109    { return _Val_less_iter(); }
     110  
     111    struct _Iter_equal_to_iter
     112    {
     113      template<typename _Iterator1, typename _Iterator2>
     114        _GLIBCXX20_CONSTEXPR
     115        bool
     116        operator()(_Iterator1 __it1, _Iterator2 __it2) const
     117        { return *__it1 == *__it2; }
     118    };
     119  
     120    _GLIBCXX20_CONSTEXPR
     121    inline _Iter_equal_to_iter
     122    __iter_equal_to_iter()
     123    { return _Iter_equal_to_iter(); }
     124  
     125    struct _Iter_equal_to_val
     126    {
     127      template<typename _Iterator, typename _Value>
     128        _GLIBCXX20_CONSTEXPR
     129        bool
     130        operator()(_Iterator __it, _Value& __val) const
     131        { return *__it == __val; }
     132    };
     133  
     134    _GLIBCXX20_CONSTEXPR
     135    inline _Iter_equal_to_val
     136    __iter_equal_to_val()
     137    { return _Iter_equal_to_val(); }
     138  
     139    _GLIBCXX20_CONSTEXPR
     140    inline _Iter_equal_to_val
     141    __iter_comp_val(_Iter_equal_to_iter)
     142    { return _Iter_equal_to_val(); }
     143  
     144    template<typename _Compare>
     145      struct _Iter_comp_iter
     146      {
     147        _Compare _M_comp;
     148  
     149        explicit _GLIBCXX14_CONSTEXPR
     150        _Iter_comp_iter(_Compare __comp)
     151  	: _M_comp(_GLIBCXX_MOVE(__comp))
     152        { }
     153  
     154        template<typename _Iterator1, typename _Iterator2>
     155          _GLIBCXX14_CONSTEXPR
     156          bool
     157          operator()(_Iterator1 __it1, _Iterator2 __it2)
     158          { return bool(_M_comp(*__it1, *__it2)); }
     159      };
     160  
     161    template<typename _Compare>
     162      _GLIBCXX14_CONSTEXPR
     163      inline _Iter_comp_iter<_Compare>
     164      __iter_comp_iter(_Compare __comp)
     165      { return _Iter_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }
     166  
     167    template<typename _Compare>
     168      struct _Iter_comp_val
     169      {
     170        _Compare _M_comp;
     171  
     172        _GLIBCXX20_CONSTEXPR
     173        explicit
     174        _Iter_comp_val(_Compare __comp)
     175  	: _M_comp(_GLIBCXX_MOVE(__comp))
     176        { }
     177  
     178        _GLIBCXX20_CONSTEXPR
     179        explicit
     180        _Iter_comp_val(const _Iter_comp_iter<_Compare>& __comp)
     181  	: _M_comp(__comp._M_comp)
     182        { }
     183  
     184  #if __cplusplus >= 201103L
     185        _GLIBCXX20_CONSTEXPR
     186        explicit
     187        _Iter_comp_val(_Iter_comp_iter<_Compare>&& __comp)
     188  	: _M_comp(std::move(__comp._M_comp))
     189        { }
     190  #endif
     191  
     192        template<typename _Iterator, typename _Value>
     193  	_GLIBCXX20_CONSTEXPR
     194  	bool
     195  	operator()(_Iterator __it, _Value& __val)
     196  	{ return bool(_M_comp(*__it, __val)); }
     197      };
     198  
     199    template<typename _Compare>
     200      _GLIBCXX20_CONSTEXPR
     201      inline _Iter_comp_val<_Compare>
     202      __iter_comp_val(_Compare __comp)
     203      { return _Iter_comp_val<_Compare>(_GLIBCXX_MOVE(__comp)); }
     204  
     205    template<typename _Compare>
     206      _GLIBCXX20_CONSTEXPR
     207      inline _Iter_comp_val<_Compare>
     208      __iter_comp_val(_Iter_comp_iter<_Compare> __comp)
     209      { return _Iter_comp_val<_Compare>(_GLIBCXX_MOVE(__comp)); }
     210  
     211    template<typename _Compare>
     212      struct _Val_comp_iter
     213      {
     214        _Compare _M_comp;
     215  
     216        _GLIBCXX20_CONSTEXPR
     217        explicit
     218        _Val_comp_iter(_Compare __comp)
     219  	: _M_comp(_GLIBCXX_MOVE(__comp))
     220        { }
     221  
     222        _GLIBCXX20_CONSTEXPR
     223        explicit
     224        _Val_comp_iter(const _Iter_comp_iter<_Compare>& __comp)
     225  	: _M_comp(__comp._M_comp)
     226        { }
     227  
     228  #if __cplusplus >= 201103L
     229        _GLIBCXX20_CONSTEXPR
     230        explicit
     231        _Val_comp_iter(_Iter_comp_iter<_Compare>&& __comp)
     232  	: _M_comp(std::move(__comp._M_comp))
     233        { }
     234  #endif
     235  
     236        template<typename _Value, typename _Iterator>
     237  	_GLIBCXX20_CONSTEXPR
     238  	bool
     239  	operator()(_Value& __val, _Iterator __it)
     240  	{ return bool(_M_comp(__val, *__it)); }
     241      };
     242  
     243    template<typename _Compare>
     244      _GLIBCXX20_CONSTEXPR
     245      inline _Val_comp_iter<_Compare>
     246      __val_comp_iter(_Compare __comp)
     247      { return _Val_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }
     248  
     249    template<typename _Compare>
     250      _GLIBCXX20_CONSTEXPR
     251      inline _Val_comp_iter<_Compare>
     252      __val_comp_iter(_Iter_comp_iter<_Compare> __comp)
     253      { return _Val_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }
     254  
     255    template<typename _Value>
     256      struct _Iter_equals_val
     257      {
     258        _Value& _M_value;
     259  
     260        _GLIBCXX20_CONSTEXPR
     261        explicit
     262        _Iter_equals_val(_Value& __value)
     263  	: _M_value(__value)
     264        { }
     265  
     266        template<typename _Iterator>
     267  	_GLIBCXX20_CONSTEXPR
     268  	bool
     269  	operator()(_Iterator __it)
     270  	{ return *__it == _M_value; }
     271      };
     272  
     273    template<typename _Value>
     274      _GLIBCXX20_CONSTEXPR
     275      inline _Iter_equals_val<_Value>
     276      __iter_equals_val(_Value& __val)
     277      { return _Iter_equals_val<_Value>(__val); }
     278  
     279    template<typename _Iterator1>
     280      struct _Iter_equals_iter
     281      {
     282        _Iterator1 _M_it1;
     283  
     284        _GLIBCXX20_CONSTEXPR
     285        explicit
     286        _Iter_equals_iter(_Iterator1 __it1)
     287  	: _M_it1(__it1)
     288        { }
     289  
     290        template<typename _Iterator2>
     291  	_GLIBCXX20_CONSTEXPR
     292  	bool
     293  	operator()(_Iterator2 __it2)
     294  	{ return *__it2 == *_M_it1; }
     295      };
     296  
     297    template<typename _Iterator>
     298      _GLIBCXX20_CONSTEXPR
     299      inline _Iter_equals_iter<_Iterator>
     300      __iter_comp_iter(_Iter_equal_to_iter, _Iterator __it)
     301      { return _Iter_equals_iter<_Iterator>(__it); }
     302  
     303    template<typename _Predicate>
     304      struct _Iter_pred
     305      {
     306        _Predicate _M_pred;
     307  
     308        _GLIBCXX20_CONSTEXPR
     309        explicit
     310        _Iter_pred(_Predicate __pred)
     311  	: _M_pred(_GLIBCXX_MOVE(__pred))
     312        { }
     313  
     314        template<typename _Iterator>
     315  	_GLIBCXX20_CONSTEXPR
     316  	bool
     317  	operator()(_Iterator __it)
     318  	{ return bool(_M_pred(*__it)); }
     319      };
     320  
     321    template<typename _Predicate>
     322      _GLIBCXX20_CONSTEXPR
     323      inline _Iter_pred<_Predicate>
     324      __pred_iter(_Predicate __pred)
     325      { return _Iter_pred<_Predicate>(_GLIBCXX_MOVE(__pred)); }
     326  
     327    template<typename _Compare, typename _Value>
     328      struct _Iter_comp_to_val
     329      {
     330        _Compare _M_comp;
     331        _Value& _M_value;
     332  
     333        _GLIBCXX20_CONSTEXPR
     334        _Iter_comp_to_val(_Compare __comp, _Value& __value)
     335  	: _M_comp(_GLIBCXX_MOVE(__comp)), _M_value(__value)
     336        { }
     337  
     338        template<typename _Iterator>
     339  	_GLIBCXX20_CONSTEXPR
     340  	bool
     341  	operator()(_Iterator __it)
     342  	{ return bool(_M_comp(*__it, _M_value)); }
     343      };
     344  
     345    template<typename _Compare, typename _Value>
     346      _Iter_comp_to_val<_Compare, _Value>
     347      _GLIBCXX20_CONSTEXPR
     348      __iter_comp_val(_Compare __comp, _Value &__val)
     349      {
     350        return _Iter_comp_to_val<_Compare, _Value>(_GLIBCXX_MOVE(__comp), __val);
     351      }
     352  
     353    template<typename _Compare, typename _Iterator1>
     354      struct _Iter_comp_to_iter
     355      {
     356        _Compare _M_comp;
     357        _Iterator1 _M_it1;
     358  
     359        _GLIBCXX20_CONSTEXPR
     360        _Iter_comp_to_iter(_Compare __comp, _Iterator1 __it1)
     361  	: _M_comp(_GLIBCXX_MOVE(__comp)), _M_it1(__it1)
     362        { }
     363  
     364        template<typename _Iterator2>
     365  	_GLIBCXX20_CONSTEXPR
     366  	bool
     367  	operator()(_Iterator2 __it2)
     368  	{ return bool(_M_comp(*__it2, *_M_it1)); }
     369      };
     370  
     371    template<typename _Compare, typename _Iterator>
     372      _GLIBCXX20_CONSTEXPR
     373      inline _Iter_comp_to_iter<_Compare, _Iterator>
     374      __iter_comp_iter(_Iter_comp_iter<_Compare> __comp, _Iterator __it)
     375      {
     376        return _Iter_comp_to_iter<_Compare, _Iterator>(
     377  	  _GLIBCXX_MOVE(__comp._M_comp), __it);
     378      }
     379  
     380    template<typename _Predicate>
     381      struct _Iter_negate
     382      {
     383        _Predicate _M_pred;
     384  
     385        _GLIBCXX20_CONSTEXPR
     386        explicit
     387        _Iter_negate(_Predicate __pred)
     388  	: _M_pred(_GLIBCXX_MOVE(__pred))
     389        { }
     390  
     391        template<typename _Iterator>
     392  	_GLIBCXX20_CONSTEXPR
     393  	bool
     394  	operator()(_Iterator __it)
     395  	{ return !bool(_M_pred(*__it)); }
     396      };
     397  
     398    template<typename _Predicate>
     399      _GLIBCXX20_CONSTEXPR
     400      inline _Iter_negate<_Predicate>
     401      __negate(_Iter_pred<_Predicate> __pred)
     402      { return _Iter_negate<_Predicate>(_GLIBCXX_MOVE(__pred._M_pred)); }
     403  
     404  } // namespace __ops
     405  } // namespace __gnu_cxx
     406  
     407  #endif