1 // Default predicates for internal use -*- C++ -*-
2 
3 // Copyright (C) 2013-2014 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.
28  */
29 
30 #ifndef _GLIBCXX_PREDEFINED_OPS_H
31 #define _GLIBCXX_PREDEFINED_OPS_H	1
32 
33 namespace __gnu_cxx
34 {
35 namespace __ops
36 {
37   struct _Iter_less_iter
38   {
39     template<typename _Iterator1, typename _Iterator2>
40       bool
operator_Iter_less_iter41       operator()(_Iterator1 __it1, _Iterator2 __it2) const
42       { return *__it1 < *__it2; }
43   };
44 
45   inline _Iter_less_iter
__iter_less_iter()46   __iter_less_iter()
47   { return _Iter_less_iter(); }
48 
49   struct _Iter_less_val
50   {
51     template<typename _Iterator, typename _Value>
52       bool
operator_Iter_less_val53       operator()(_Iterator __it, _Value& __val) const
54       { return *__it < __val; }
55     };
56 
57   inline _Iter_less_val
__iter_less_val()58   __iter_less_val()
59   { return _Iter_less_val(); }
60 
61   inline _Iter_less_val
__iter_comp_val(_Iter_less_iter)62   __iter_comp_val(_Iter_less_iter)
63   { return _Iter_less_val(); }
64 
65   struct _Val_less_iter
66   {
67     template<typename _Value, typename _Iterator>
68       bool
operator_Val_less_iter69       operator()(_Value& __val, _Iterator __it) const
70       { return __val < *__it; }
71     };
72 
73   inline _Val_less_iter
__val_less_iter()74   __val_less_iter()
75   { return _Val_less_iter(); }
76 
77   inline _Val_less_iter
__val_comp_iter(_Iter_less_iter)78   __val_comp_iter(_Iter_less_iter)
79   { return _Val_less_iter(); }
80 
81   struct _Iter_equal_to_iter
82   {
83     template<typename _Iterator1, typename _Iterator2>
84       bool
operator_Iter_equal_to_iter85       operator()(_Iterator1 __it1, _Iterator2 __it2) const
86       { return *__it1 == *__it2; }
87     };
88 
89   inline _Iter_equal_to_iter
__iter_equal_to_iter()90   __iter_equal_to_iter()
91   { return _Iter_equal_to_iter(); }
92 
93   struct _Iter_equal_to_val
94   {
95     template<typename _Iterator, typename _Value>
96       bool
operator_Iter_equal_to_val97       operator()(_Iterator __it, _Value& __val) const
98       { return *__it == __val; }
99     };
100 
101   inline _Iter_equal_to_val
__iter_equal_to_val()102   __iter_equal_to_val()
103   { return _Iter_equal_to_val(); }
104 
105   inline _Iter_equal_to_val
__iter_comp_val(_Iter_equal_to_iter)106   __iter_comp_val(_Iter_equal_to_iter)
107   { return _Iter_equal_to_val(); }
108 
109   template<typename _Compare>
110     struct _Iter_comp_iter
111     {
112       _Compare _M_comp;
113 
_Iter_comp_iter_Iter_comp_iter114       _Iter_comp_iter(_Compare __comp)
115 	: _M_comp(__comp)
116       { }
117 
118       template<typename _Iterator1, typename _Iterator2>
119         bool
operator_Iter_comp_iter120         operator()(_Iterator1 __it1, _Iterator2 __it2)
121         { return bool(_M_comp(*__it1, *__it2)); }
122     };
123 
124   template<typename _Compare>
125     inline _Iter_comp_iter<_Compare>
__iter_comp_iter(_Compare __comp)126     __iter_comp_iter(_Compare __comp)
127     { return _Iter_comp_iter<_Compare>(__comp); }
128 
129   template<typename _Compare>
130     struct _Iter_comp_val
131     {
132       _Compare _M_comp;
133 
_Iter_comp_val_Iter_comp_val134       _Iter_comp_val(_Compare __comp)
135 	: _M_comp(__comp)
136       { }
137 
138       template<typename _Iterator, typename _Value>
139 	bool
operator_Iter_comp_val140 	operator()(_Iterator __it, _Value& __val)
141 	{ return bool(_M_comp(*__it, __val)); }
142     };
143 
144   template<typename _Compare>
145    inline _Iter_comp_val<_Compare>
__iter_comp_val(_Compare __comp)146     __iter_comp_val(_Compare __comp)
147     { return _Iter_comp_val<_Compare>(__comp); }
148 
149   template<typename _Compare>
150     inline _Iter_comp_val<_Compare>
__iter_comp_val(_Iter_comp_iter<_Compare> __comp)151     __iter_comp_val(_Iter_comp_iter<_Compare> __comp)
152     { return _Iter_comp_val<_Compare>(__comp._M_comp); }
153 
154   template<typename _Compare>
155     struct _Val_comp_iter
156     {
157       _Compare _M_comp;
158 
_Val_comp_iter_Val_comp_iter159       _Val_comp_iter(_Compare __comp)
160 	: _M_comp(__comp)
161       { }
162 
163       template<typename _Value, typename _Iterator>
164 	bool
operator_Val_comp_iter165 	operator()(_Value& __val, _Iterator __it)
166 	{ return bool(_M_comp(__val, *__it)); }
167     };
168 
169   template<typename _Compare>
170     inline _Val_comp_iter<_Compare>
__val_comp_iter(_Compare __comp)171     __val_comp_iter(_Compare __comp)
172     { return _Val_comp_iter<_Compare>(__comp); }
173 
174   template<typename _Compare>
175     inline _Val_comp_iter<_Compare>
__val_comp_iter(_Iter_comp_iter<_Compare> __comp)176     __val_comp_iter(_Iter_comp_iter<_Compare> __comp)
177     { return _Val_comp_iter<_Compare>(__comp._M_comp); }
178 
179   template<typename _Value>
180     struct _Iter_equals_val
181     {
182       _Value& _M_value;
183 
_Iter_equals_val_Iter_equals_val184       _Iter_equals_val(_Value& __value)
185 	: _M_value(__value)
186       { }
187 
188       template<typename _Iterator>
189 	bool
operator_Iter_equals_val190 	operator()(_Iterator __it)
191 	{ return *__it == _M_value; }
192     };
193 
194   template<typename _Value>
195     inline _Iter_equals_val<_Value>
__iter_equals_val(_Value & __val)196     __iter_equals_val(_Value& __val)
197     { return _Iter_equals_val<_Value>(__val); }
198 
199   template<typename _Iterator1>
200     struct _Iter_equals_iter
201     {
202       typename std::iterator_traits<_Iterator1>::reference _M_ref;
203 
_Iter_equals_iter_Iter_equals_iter204       _Iter_equals_iter(_Iterator1 __it1)
205 	: _M_ref(*__it1)
206       { }
207 
208       template<typename _Iterator2>
209 	bool
operator_Iter_equals_iter210 	operator()(_Iterator2 __it2)
211 	{ return *__it2 == _M_ref; }
212     };
213 
214   template<typename _Iterator>
215     inline _Iter_equals_iter<_Iterator>
__iter_comp_iter(_Iter_equal_to_iter,_Iterator __it)216     __iter_comp_iter(_Iter_equal_to_iter, _Iterator __it)
217     { return _Iter_equals_iter<_Iterator>(__it); }
218 
219   template<typename _Predicate>
220     struct _Iter_pred
221     {
222       _Predicate _M_pred;
223 
_Iter_pred_Iter_pred224       _Iter_pred(_Predicate __pred)
225 	: _M_pred(__pred)
226       { }
227 
228       template<typename _Iterator>
229 	bool
operator_Iter_pred230 	operator()(_Iterator __it)
231 	{ return bool(_M_pred(*__it)); }
232     };
233 
234   template<typename _Predicate>
235     inline _Iter_pred<_Predicate>
__pred_iter(_Predicate __pred)236     __pred_iter(_Predicate __pred)
237     { return _Iter_pred<_Predicate>(__pred); }
238 
239   template<typename _Compare, typename _Value>
240     struct _Iter_comp_to_val
241     {
242       _Compare _M_comp;
243       _Value& _M_value;
244 
_Iter_comp_to_val_Iter_comp_to_val245       _Iter_comp_to_val(_Compare __comp, _Value& __value)
246 	: _M_comp(__comp), _M_value(__value)
247       { }
248 
249       template<typename _Iterator>
250 	bool
operator_Iter_comp_to_val251 	operator()(_Iterator __it)
252 	{ return bool(_M_comp(*__it, _M_value)); }
253     };
254 
255   template<typename _Compare, typename _Value>
256     _Iter_comp_to_val<_Compare, _Value>
__iter_comp_val(_Compare __comp,_Value & __val)257     __iter_comp_val(_Compare __comp, _Value &__val)
258     { return _Iter_comp_to_val<_Compare, _Value>(__comp, __val); }
259 
260   template<typename _Compare, typename _Iterator1>
261     struct _Iter_comp_to_iter
262     {
263       _Compare _M_comp;
264       typename std::iterator_traits<_Iterator1>::reference _M_ref;
265 
_Iter_comp_to_iter_Iter_comp_to_iter266       _Iter_comp_to_iter(_Compare __comp, _Iterator1 __it1)
267 	: _M_comp(__comp), _M_ref(*__it1)
268       { }
269 
270       template<typename _Iterator2>
271 	bool
operator_Iter_comp_to_iter272 	operator()(_Iterator2 __it2)
273 	{ return bool(_M_comp(*__it2, _M_ref)); }
274     };
275 
276   template<typename _Compare, typename _Iterator>
277     inline _Iter_comp_to_iter<_Compare, _Iterator>
__iter_comp_iter(_Iter_comp_iter<_Compare> __comp,_Iterator __it)278     __iter_comp_iter(_Iter_comp_iter<_Compare> __comp, _Iterator __it)
279     { return _Iter_comp_to_iter<_Compare, _Iterator>(__comp._M_comp, __it); }
280 
281   template<typename _Predicate>
282     struct _Iter_negate
283     {
284       _Predicate _M_pred;
285 
_Iter_negate_Iter_negate286       _Iter_negate(_Predicate __pred)
287 	: _M_pred(__pred)
288       { }
289 
290       template<typename _Iterator>
291 	bool
operator_Iter_negate292 	operator()(_Iterator __it)
293 	{ return !bool(_M_pred(*__it)); }
294     };
295 
296   template<typename _Predicate>
297     inline _Iter_negate<_Predicate>
__negate(_Iter_pred<_Predicate> __pred)298     __negate(_Iter_pred<_Predicate> __pred)
299     { return _Iter_negate<_Predicate>(__pred._M_pred); }
300 
301 } // namespace __ops
302 } // namespace __gnu_cxx
303 
304 #endif
305