Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00030 #ifndef __CLAW_FUNCTIONAL_HPP__
00031 #define __CLAW_FUNCTIONAL_HPP__
00032
00033 #include <utility>
00034 #include <functional>
00035
00036 namespace claw
00037 {
00038
00043 template <class T1, class T2>
00044 class first: public std::unary_function< std::pair<T1, T2>, T1& >
00045 {
00046 public:
00047 T1& operator()( std::pair<T1, T2>& p ) const
00048 {
00049 return p.first;
00050 }
00051 };
00052
00053
00058 template <class T1, class T2>
00059 class const_first:
00060 public std::unary_function<const std::pair<T1, T2>, const T1&>
00061 {
00062 public:
00063 const T1& operator()( const std::pair<T1, T2>& p ) const
00064 {
00065 return p.first;
00066 }
00067
00068 };
00069
00070
00077 template<class Pair>
00078 class pair_first:
00079 public first<typename Pair::first_type, typename Pair::second_type>
00080 {
00081
00082 };
00083
00084
00091 template<class Pair>
00092 class const_pair_first:
00093 public const_first<typename Pair::first_type, typename Pair::second_type>
00094 {
00095
00096 };
00097
00098
00103 template <class T1, class T2>
00104 class second: public std::unary_function< std::pair<T1, T2>, T2& >
00105 {
00106 public:
00107 T2& operator()( std::pair<T1, T2>& p ) const
00108 {
00109 return p.second;
00110 }
00111 };
00112
00113
00118 template <class T1, class T2>
00119 class const_second:
00120 public std::unary_function< const std::pair<T1, T2>, const T2& >
00121 {
00122 public:
00123 const T2& operator()( const std::pair<T1, T2>& p ) const
00124 {
00125 return p.second;
00126 }
00127
00128 };
00129
00130
00137 template< class Pair >
00138 class pair_second: public second< typename Pair::first_type,
00139 typename Pair::second_type >
00140 {
00141
00142 };
00143
00144
00151 template<class Pair>
00152 class const_pair_second:
00153 public const_second<typename Pair::first_type, typename Pair::second_type>
00154 {
00155 public:
00156 const_pair_second() {}
00157
00158 template<typename F, typename S>
00159 const_pair_second( const second<F, S>& )
00160 {}
00161
00162 };
00163
00164
00175 template<class T>
00176 class unary_true: public std::unary_function<T, bool>
00177 {
00178 public:
00179 bool operator()( const T& t ) const { return true; }
00180 };
00181
00182
00194 template<class T, class U>
00195 class binary_true: public std::binary_function<T, U, bool>
00196 {
00197 public:
00198 bool operator()( const T& t, const U& u ) const
00199 {
00200 return true;
00201 }
00202 };
00203
00204
00216 template<typename F1, typename F2>
00217 class unary_compose
00218 : public std::unary_function< typename F2::argument_type,
00219 typename F1::result_type >
00220 {
00221 public:
00222 unary_compose() {}
00223
00231 template<typename G1, typename G2>
00232 unary_compose( const unary_compose<G1, G2>& that ) { }
00233
00237 typename F1::result_type
00238 operator()( typename F2::argument_type& a ) const
00239 {
00240 return F1()( F2()(a) );
00241 }
00242 };
00243
00244
00254 template<typename T>
00255 class delete_function: public std::unary_function<T, void>
00256 {
00257 public:
00258 void operator()( const T& a ) const
00259 {
00260 delete a;
00261 }
00262 };
00263
00264
00274 template<typename T>
00275 class clone: public std::unary_function<T*, T*>
00276 {
00277 public:
00278 T* operator()( const T* a ) const
00279 {
00280 return new T(*a);
00281 }
00282 };
00283
00284
00293 template<typename T>
00294 class dereference:
00295 public std::unary_function<T*, T&>
00296 {
00297 public:
00298 T& operator()( T* a ) const
00299 {
00300 return *a;
00301 }
00302
00303 };
00304
00305
00314 template<typename T>
00315 class const_dereference:
00316 public std::unary_function<const T*, const T&>
00317 {
00318 public:
00319 const_dereference() { }
00320 const_dereference( const dereference<T>& ) { }
00321 const_dereference( const const_dereference<T>& ) { }
00322
00323 const T& operator()( const T* a ) const
00324 {
00325 return *a;
00326 }
00327
00328 };
00329 }
00330
00331 #endif // __CLAW_FUNCTIONAL_HPP__