PFUNC  1.0
pfunc/predicate.hpp
Go to the documentation of this file.
00001 #ifndef PFUNC_PREDICATE_T_HPP
00002 #define PFUNC_PREDICATE_T_HPP
00003 
00010 #include <pfunc/task_queue_set.hpp>
00011 
00012 namespace pfunc { namespace detail {
00013 
00018   template <typename PolicyName, typename ValueType>
00019   struct regular_predicate_pair {
00020     typedef bool result_type;
00021     typedef ValueType* value_type;
00022 
00026     regular_predicate_pair (value_type previous_task=NULL) {}
00027 
00033     bool own_pred (value_type current_task) const { return true; }
00034 
00039     bool steal_pred (value_type current_task) const { 
00040       return own_pred (current_task); 
00041     }
00042   };
00043 
00047   template <typename PolicyName, typename ValueType>
00048   struct waiting_predicate_pair {
00049     typedef bool result_type;
00050     typedef ValueType* value_type;
00051 
00055     waiting_predicate_pair (value_type previous_task=NULL) {}
00056 
00062     bool own_pred (value_type current_task) const { return true; }
00063 
00068     bool steal_pred (value_type current_task) const { 
00069       return own_pred (current_task); 
00070     }
00071   };
00072 
00076   template <typename PolicyName, typename ValueType>
00077   struct group_predicate_pair {
00078     typedef bool result_type;
00079     typedef ValueType* value_type;
00080     value_type previous_task;
00081 
00085     group_predicate_pair (value_type previous_task) : 
00086                                   previous_task (previous_task) {}
00087 
00094     bool own_pred (value_type current_task) const {
00095       return !(previous_task->get_group() == current_task->get_group()) ; 
00096     } 
00097 
00102     bool steal_pred (value_type current_task) const { 
00103       return own_pred (current_task); 
00104     } 
00105   };
00106 
00107   /*************************************************************************
00108    * MODIFICATIONS FOR CILKS 
00109    *************************************************************************/
00110 
00114   template <typename ValueType> 
00115   struct waiting_predicate_pair <cilkS, ValueType> { 
00116     typedef typename task_traits<ValueType>::attribute attribute; 
00117     typedef typename attribute::level_type level_type; 
00118     typedef bool result_type;
00119     typedef ValueType* value_type; 
00120    
00121     value_type previous_task; 
00122   
00126     waiting_predicate_pair (value_type previous_task) : 
00127                                   previous_task (previous_task) {}
00128 
00135     bool own_pred (value_type current_task) const { 
00136       bool ret_val = false; 
00137       level_type previous_task_level = previous_task->get_attr().get_level (); 
00138       level_type current_task_level = current_task->get_attr().get_level (); 
00139       if (previous_task_level <= current_task_level) ret_val = true; 
00140       return ret_val; 
00141     } 
00142 
00147     bool steal_pred (value_type current_task) const { 
00148       return own_pred (current_task); 
00149     }
00150   };
00151 
00159   template <typename ValueType> 
00160   struct group_predicate_pair <cilkS, ValueType> { 
00161     typedef typename task_traits<ValueType>::attribute attribute; 
00162     typedef typename attribute::level_type level_type; 
00163     typedef bool result_type;
00164     typedef ValueType* value_type; 
00165    
00166     value_type previous_task; 
00167   
00171     group_predicate_pair (value_type previous_task) : 
00172                                   previous_task (previous_task) {}
00173 
00180     bool own_pred (value_type current_task) const { 
00181       bool ret_val = false; 
00182       level_type previous_task_level = previous_task->get_attr().get_level (); 
00183       level_type current_task_level = current_task->get_attr().get_level (); 
00184       if (previous_task_level <= current_task_level) 
00185         if (previous_task->get_group() != current_task->get_group()) 
00186           ret_val = true; 
00187       return ret_val; 
00188     } 
00189 
00194     bool steal_pred (value_type current_task) const { 
00195       return own_pred (current_task); 
00196     }
00197   };
00198 
00199   /*************************************************************************
00200    * MODIFICATIONS FOR PRIOS
00201    *************************************************************************/
00202   
00209   template <typename ValueType> 
00210   struct waiting_predicate_pair <prioS, ValueType> { 
00211     typedef typename task_traits<ValueType>::attribute attribute; 
00212     typedef typename task_traits<ValueType>::functor functor; 
00213     typedef compare_task_ptr<attribute, functor> compare_type; 
00214     typedef bool result_type;
00215     typedef ValueType* value_type; 
00216    
00217     value_type previous_task; 
00218     compare_type comp;  
00219   
00223     waiting_predicate_pair (value_type previous_task) : 
00224                                   previous_task (previous_task) {}
00225    
00231     bool own_pred (value_type current_task) const { 
00232       bool ret_val = false; 
00233       if (comp (previous_task, current_task)) 
00234         ret_val = true; 
00235       return ret_val; 
00236     } 
00237 
00242     bool steal_pred (value_type current_task) const { 
00243       return own_pred (current_task); 
00244     }
00245   };
00246 
00247 
00254   template <typename ValueType> 
00255   struct group_predicate_pair <prioS, ValueType> { 
00256     typedef typename task_traits<ValueType>::attribute attribute; 
00257     typedef typename task_traits<ValueType>::functor functor; 
00258     typedef compare_task_ptr<attribute, functor> compare_type; 
00259     typedef bool result_type;
00260     typedef ValueType* value_type; 
00261    
00262     value_type previous_task; 
00263     compare_type comp;  
00264 
00268     group_predicate_pair (value_type previous_task) : 
00269                                   previous_task (previous_task) {}
00270   
00277     bool own_pred (value_type current_task) const { 
00278       bool ret_val = false; 
00279       if (comp (previous_task, current_task)) 
00280         if (previous_task->get_group() != current_task->get_group()) 
00281           ret_val = true; 
00282       return ret_val; 
00283     } 
00284 
00289     bool steal_pred (value_type current_task) const { 
00290       return own_pred (current_task); 
00291     }
00292   };
00293 
00294 } /* namespace detail */ } /* namespace pfunc */
00295 
00296 #endif // PFUNC_PREDICATE_T_HPP