PFUNC
1.0
|
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