libzypp  13.10.6
Functional.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_BASE_FUNCTIONAL_H
13 #define ZYPP_BASE_FUNCTIONAL_H
14 
15 #include <boost/functional.hpp>
16 
17 #include "zypp/base/Function.h"
18 
20 namespace zypp
21 {
22 
23  /* http://www.boost.org/libs/functional/mem_fun.html
24 
25  The header functional.hpp includes improved versions of
26  the full range of member function adapters from the
27  C++ Standard Library.
28  */
29  using boost::mem_fun;
30  using boost::mem_fun_ref;
31 
33  namespace functor
34  {
35 
77  namespace functor_detail
79  {
80  template <class _Functor, class res_type>
81  struct FunctorRef0
82  {
83  FunctorRef0( _Functor & f_r )
84  : _f( f_r )
85  {}
86 
87  res_type operator()() const
88  {
89  return _f();
90  }
91 
92  private:
93  _Functor & _f;
94  };
95 
96  template <class _Functor, class res_type, class arg1_type>
97  struct FunctorRef1 : public std::unary_function<arg1_type, res_type>
98  {
99  FunctorRef1( _Functor & f_r )
100  : _f( f_r )
101  {}
102 
103  res_type operator()( arg1_type a1 ) const
104  {
105  return _f( a1 );
106  }
107 
108  private:
109  _Functor & _f;
110  };
111 
112  template <class _Functor, class res_type, class arg1_type, class arg2_type>
113  struct FunctorRef2 : public std::binary_function<arg1_type, arg2_type, res_type>
114  {
115  FunctorRef2( _Functor & f_r )
116  : _f( f_r )
117  {}
118 
119  res_type operator()( arg1_type a1, arg2_type a2 ) const
120  {
121  return _f( a1, a2 );
122  }
123 
124  private:
125  _Functor & _f;
126  };
127 
128  struct nil
129  {};
130  }
132 
136  template <class _Functor, class res_type, class arg1_type = functor_detail::nil,
137  class arg2_type = functor_detail::nil>
138  struct FunctorRef
139  : public functor_detail::FunctorRef2<_Functor, res_type, arg1_type, arg2_type>
140  {
141  FunctorRef( _Functor & f_r )
142  : functor_detail::FunctorRef2<_Functor, res_type, arg1_type, arg2_type>( f_r )
143  {}
144  };
145 
149  template <class _Functor, class res_type, class arg1_type>
150  struct FunctorRef<_Functor, res_type, arg1_type>
151  : public functor_detail::FunctorRef1<_Functor, res_type, arg1_type>
152  {
153  FunctorRef( _Functor & f_r )
154  : functor_detail::FunctorRef1<_Functor, res_type, arg1_type>( f_r )
155  {}
156  };
157 
161  template <class _Functor, class res_type>
162  struct FunctorRef<_Functor, res_type>
163  : public functor_detail::FunctorRef0<_Functor, res_type>
164  {
165  FunctorRef( _Functor & f_r )
166  : functor_detail::FunctorRef0<_Functor, res_type>( f_r )
167  {}
168  };
169 
171  template <class res_type, class arg1_type, class arg2_type, class _Functor>
172  FunctorRef<_Functor, res_type, arg1_type, arg2_type>
173  functorRef( _Functor & f_r )
175  template <class res_type, class arg1_type, class _Functor>
176  FunctorRef<_Functor, res_type, arg1_type>
177  functorRef( _Functor & f_r )
179  template <class res_type, class _Functor>
180  FunctorRef<_Functor, res_type>
181  functorRef( _Functor & f_r )
182  { return FunctorRef<_Functor, res_type>( f_r ); }
183 
185 
216 
217  /* functor that always returns a copied
218  value */
219  template<class T>
220  struct Constant
221  {
222  Constant( const T &value )
223  : _value(value)
224  {}
225 
226  template<class _Tp>
227  T operator()( _Tp ) const
228  { return _value; }
229 
230  T operator()() const
231  { return _value; }
232 
234  };
235 
236  template<class T>
237  inline Constant<T> constant( const T &value )
238  { return Constant<T>(value); }
239 
242  struct True
243  {
244  template<class _Tp>
245  bool operator()( _Tp ) const
246  {
247  return true;
248  }
249  };
250 
252  inline True true_c()
253  { return True(); }
254 
257  struct False
258  {
259  template<class _Tp>
260  bool operator()( _Tp ) const
261  {
262  return false;
263  }
264  };
265 
267  inline False false_c()
268  { return False(); }
269 
272  template<class _Condition>
273  struct Not
274  {
275  Not( _Condition cond_r )
276  : _cond( cond_r )
277  {}
278 
279  template<class _Tp>
280  bool operator()( _Tp t ) const
281  {
282  return ! _cond( t );
283  }
284 
285  _Condition _cond;
286  };
287 
289  template<class _Condition>
290  inline Not<_Condition> not_c( _Condition cond_r )
291  {
292  return Not<_Condition>( cond_r );
293  }
294 
297  template<class _ACondition, class _BCondition>
298  struct Or
299  {
300  Or( _ACondition conda_r, _BCondition condb_r )
301  : _conda( conda_r )
302  , _condb( condb_r )
303  {}
304 
305  template<class _Tp>
306  bool operator()( _Tp t ) const
307  {
308  return _conda( t ) || _condb( t );
309  }
310 
311  _ACondition _conda;
312  _BCondition _condb;
313  };
314 
318  template<class _ACondition, class _BCondition>
319  inline Or<_ACondition, _BCondition> or_c( _ACondition conda_r, _BCondition condb_r )
320  {
321  return Or<_ACondition, _BCondition>( conda_r, condb_r );
322  }
323 
326  template<class _ACondition, class _BCondition>
327  struct Chain
328  {
329  Chain( _ACondition conda_r, _BCondition condb_r )
330  : _conda( conda_r )
331  , _condb( condb_r )
332  {}
333 
334  template<class _Tp>
335  bool operator()( _Tp t ) const
336  {
337  return _conda( t ) && _condb( t );
338  }
339 
340  _ACondition _conda;
341  _BCondition _condb;
342  };
343 
347  template<class _ACondition, class _BCondition>
348  inline Chain<_ACondition, _BCondition> chain( _ACondition conda_r, _BCondition condb_r )
349  {
350  return Chain<_ACondition, _BCondition>( conda_r, condb_r );
351  }
352 
354 
360 
369  template<class _Tp>
370  struct GetFirst
371  {
372  GetFirst( _Tp & result_r )
373  : _result( &result_r )
374  {}
375  bool operator()( const _Tp & val_r )
376  { *_result = val_r; return false; }
377 
378  private:
379  _Tp * _result;
380  };
381 
383  template<class _Tp>
384  GetFirst<_Tp> getFirst( _Tp & result_r )
385  { return GetFirst<_Tp>( result_r ); }
386 
387 
390  template<class _Tp>
391  struct GetLast
392  {
393  GetLast( _Tp & result_r )
394  : _result( &result_r )
395  {}
396  bool operator()( const _Tp & val_r )
397  { *_result = val_r; return true; }
398 
399  private:
400  _Tp * _result;
401  };
402 
404  template<class _Tp>
405  GetLast<_Tp> getLast( _Tp & result_r )
406  { return GetLast<_Tp>( result_r ); }
407 
408 
416  template<class _OutputIterator>
417  struct GetAll
418  {
419  GetAll( _OutputIterator result_r )
420  : _result( result_r )
421  {}
422 
423  template<class _Tp>
424  bool operator()( const _Tp & val_r ) const
425  { *(_result++) = val_r; return true; }
426 
427  private:
428  mutable _OutputIterator _result;
429  };
430 
432  template<class _OutputIterator>
433  GetAll<_OutputIterator> getAll( _OutputIterator result_r )
434  { return GetAll<_OutputIterator>( result_r ); }
435 
437 
440  } // namespace functor
443 } // namespace zypp
445 #endif // ZYPP_BASE_FUNCTIONAL_H
Or< _ACondition, _BCondition > or_c(_ACondition conda_r, _BCondition condb_r)
Convenience function for creating a Or from two conditions conda_r OR condb_r.
Definition: Functional.h:319
T operator()(_Tp) const
Definition: Functional.h:227
Logical functor chaining _ACondition OR _BCondition.
Definition: Functional.h:298
_BCondition _condb
Definition: Functional.h:341
bool operator()(_Tp) const
Definition: Functional.h:260
Store all results found to some output_iterator.
Definition: Functional.h:417
GetLast< _Tp > getLast(_Tp &result_r)
Convenience function for creating GetLast.
Definition: Functional.h:405
GetAll(_OutputIterator result_r)
Definition: Functional.h:419
GetFirst< _Tp > getFirst(_Tp &result_r)
Convenience function for creating GetFirst.
Definition: Functional.h:384
GetAll< _OutputIterator > getAll(_OutputIterator result_r)
Convenience function for creating GetAll.
Definition: Functional.h:433
_OutputIterator _result
Definition: Functional.h:428
Constant(const T &value)
Definition: Functional.h:222
False false_c()
Convenience function for creating a False.
Definition: Functional.h:267
Chain(_ACondition conda_r, _BCondition condb_r)
Definition: Functional.h:329
res_type operator()(arg1_type a1, arg2_type a2) const
Definition: Functional.h:119
A binary FunctorRef.
Definition: Functional.h:138
Chain< _ACondition, _BCondition > chain(_ACondition conda_r, _BCondition condb_r)
Convenience function for creating a Chain from two conditions conda_r and condb_r.
Definition: Functional.h:348
Logical functor always false.
Definition: Functional.h:257
Constant< T > constant(const T &value)
Definition: Functional.h:237
GetLast(_Tp &result_r)
Definition: Functional.h:393
bool operator()(_Tp) const
Definition: Functional.h:245
True true_c()
Convenience function for creating a True.
Definition: Functional.h:252
bool operator()(_Tp t) const
Definition: Functional.h:280
bool operator()(const _Tp &val_r)
Definition: Functional.h:375
FunctorRef< _Functor, res_type, arg1_type, arg2_type > functorRef(_Functor &f_r)
Convenience function creating a binary FunctorRef.
Definition: Functional.h:173
_Condition _cond
Definition: Functional.h:285
Strore the 1st result found in the variable passed to the ctor.
Definition: Functional.h:370
Logical functor chaining _ACondition AND _BCondition.
Definition: Functional.h:327
bool operator()(_Tp t) const
Definition: Functional.h:306
_ACondition _conda
Definition: Functional.h:311
Strore the last result found in the variable passed to the ctor.
Definition: Functional.h:391
bool operator()(_Tp t) const
Definition: Functional.h:335
_BCondition _condb
Definition: Functional.h:312
bool operator()(const _Tp &val_r) const
Definition: Functional.h:424
Not< _Condition > not_c(_Condition cond_r)
Convenience function for creating a Not from _Condition.
Definition: Functional.h:290
_ACondition _conda
Definition: Functional.h:340
GetFirst(_Tp &result_r)
Definition: Functional.h:372
Not(_Condition cond_r)
Definition: Functional.h:275
Or(_ACondition conda_r, _BCondition condb_r)
Definition: Functional.h:300
Logical functor inverting _Condition.
Definition: Functional.h:273
Logical functor always true.
Definition: Functional.h:242
bool operator()(const _Tp &val_r)
Definition: Functional.h:396
FunctorRef(_Functor &f_r)
Definition: Functional.h:141
res_type operator()(arg1_type a1) const
Definition: Functional.h:103