16#ifndef TRUSTVect_tools_TPP_included
17#define TRUSTVect_tools_TPP_included
29template<
typename _SIZE_>
35 Block_Iter(
const ArrOfInt& items_blocs,
const ArrOfInt& items) :
int_ptr(items_blocs.addr())
61template <
typename _SIZE_>
62Block_Iter<_SIZE_> determine_blocks(Mp_vect_options opt,
const MD_Vector& md,
const _SIZE_ vect_size_tot,
const int line_size,
int& nblocs_left);
67template<
typename _TYPE_,
typename _SIZE_>
78template<
typename _TYPE_,
typename _SIZE_>
84template<
typename _TYPE_,
typename _SIZE_>
89enum class TYPE_OPERATION_VECT { IMAX_ , IMIN_ , MAX_ , MIN_ , MAX_ABS_ , MIN_ABS_ };
92inline double neutral_value_double_(
const bool IS_MAX)
94 return IS_MAX ? (-HUGE_VAL) : HUGE_VAL;
97inline float neutral_value_float_(
const bool IS_MAX)
99 return IS_MAX ? (-HUGE_VALF) : HUGE_VALF;
102inline int neutral_value_int_(
const bool IS_MAX)
104 return IS_MAX ? INT_MIN : INT_MAX;
107template <
typename _TYPE_, TYPE_OPERATION_VECT _TYPE_OP_ >
108inline _TYPE_ neutral_value()
110 static constexpr bool IS_MAX = ((_TYPE_OP_ == TYPE_OPERATION_VECT::IMAX_) || (_TYPE_OP_ == TYPE_OPERATION_VECT::MAX_)), IS_MAX_ABS = (_TYPE_OP_ == TYPE_OPERATION_VECT::MAX_ABS_);
117 if (std::is_same<_TYPE_, double>::value) neutral_val = (_TYPE_) neutral_value_double_(IS_MAX);
118 else if (std::is_same<_TYPE_, float>::value) neutral_val = (_TYPE_) neutral_value_float_(IS_MAX);
119 else neutral_val = (_TYPE_) neutral_value_int_(IS_MAX);
125template <
typename _TYPE_,
typename _SIZE_,
typename _TYPE_RETURN_, TYPE_OPERATION_VECT _TYPE_OP_ >
128template<
typename _TYPE_,
typename _SIZE_>
131 return local_extrema_vect_generic<_TYPE_,_SIZE_,int,TYPE_OPERATION_VECT::IMAX_>(vx,opt);
134template<
typename _TYPE_,
typename _SIZE_>
137 return local_extrema_vect_generic<_TYPE_,_SIZE_,int,TYPE_OPERATION_VECT::IMIN_>(vx,opt);
140template<
typename _TYPE_,
typename _SIZE_>
143 return local_max_vect(vx,opt);
146template<
typename _TYPE_,
typename _SIZE_>
149 return local_extrema_vect_generic<_TYPE_,_SIZE_,_TYPE_ ,TYPE_OPERATION_VECT::MAX_>(vx,opt);
152template<
typename _TYPE_,
typename _SIZE_>
155 return local_min_vect(vx,opt);
158template<
typename _TYPE_,
typename _SIZE_>
161 return local_extrema_vect_generic<_TYPE_,_SIZE_,_TYPE_ ,TYPE_OPERATION_VECT::MIN_>(vx, opt);
164template<
typename _TYPE_,
typename _SIZE_>
167 return mp_max_vect(x, opt);
170template<
typename _TYPE_,
typename _SIZE_>
173 _TYPE_ s = local_max_vect(x, opt);
178template<
typename _TYPE_,
typename _SIZE_>
181 return mp_min_vect(x, opt);
184template<
typename _TYPE_,
typename _SIZE_>
187 _TYPE_ s = local_min_vect(x, opt);
192template<
typename _SIZE_>
195 trustIdType x = local_somme_vect(vx);
200template<
typename _SIZE_>
203 return static_cast<double>(mp_somme_vect(vx));
207template<
typename _SIZE_>
210 int x = local_somme_vect(vx);
215template<
typename _SIZE_>
218 return static_cast<double>(mp_somme_vect(vx));
223template<
typename _SIZE_>
226 float x = local_somme_vect(vx);
231template<
typename _SIZE_>
234 double x = local_somme_vect(vx);
239template<
typename _TYPE_,
typename _SIZE_>
242 return local_max_abs_vect(vx,opt);
245template<
typename _TYPE_,
typename _SIZE_>
248 return local_extrema_vect_generic<_TYPE_,_SIZE_,_TYPE_ ,TYPE_OPERATION_VECT::MAX_ABS_>(vx, opt);
251template<
typename _TYPE_,
typename _SIZE_>
254 return local_min_abs_vect(vx,opt);
257template<
typename _TYPE_,
typename _SIZE_>
260 return local_extrema_vect_generic<_TYPE_,_SIZE_,_TYPE_ ,TYPE_OPERATION_VECT::MIN_ABS_>(vx, opt);
263template<
typename _TYPE_,
typename _SIZE_>
266 return mp_max_abs_vect(x, opt);
269template<
typename _TYPE_,
typename _SIZE_>
272 _TYPE_ s = local_max_abs_vect(x, opt);
277template<
typename _TYPE_,
typename _SIZE_>
280 return mp_min_abs_vect(x, opt);
283template<
typename _TYPE_,
typename _SIZE_>
286 _TYPE_ s = local_min_abs_vect(x, opt);
291template<
typename _TYPE_,
typename _SIZE_>
294enum class TYPE_OPERATION_VECT_BIS { SQUARE_ , SOMME_ };
296template <
typename _TYPE_,
typename _SIZE_, TYPE_OPERATION_VECT_BIS _TYPE_OP_ >
299template<
typename _TYPE_,
typename _SIZE_>
302 return local_operations_vect_bis_generic<_TYPE_,_SIZE_,TYPE_OPERATION_VECT_BIS::SQUARE_>(vx,opt);
305template<
typename _TYPE_,
typename _SIZE_>
311template<
typename _TYPE_,
typename _SIZE_>
314 return local_operations_vect_bis_generic<_TYPE_,_SIZE_,TYPE_OPERATION_VECT_BIS::SOMME_>(vx,opt);
317template<
typename _TYPE_,
typename _SIZE_>
323template <
typename _SIZE_>
326template<
typename _TYPE_,
typename _SIZE_>
329 _TYPE_ x = mp_carre_norme_vect(vx);
334template<
typename _TYPE_,
typename _SIZE_>
337 return mp_norme_vect(vx);
340template <
typename _SIZE_>
343template<
typename _TYPE_,
typename _SIZE_>
347 _TYPE_ s = mp_somme_vect(x);
356 return s / (_TYPE_)n;
366enum class TYPE_OPERATOR_VECT { ADD_ , SUB_ , MULT_ , DIV_ , EGAL_ };
368inline void error_divide(
const char * nom_funct)
370 Cerr <<
"What ??? Divide by 0 in " << nom_funct <<
" operator_divide() !!" << finl;
374template <
typename _TYPE_,
typename _SIZE_, TYPE_OPERATOR_VECT _TYPE_OP_ >
377template<
typename _TYPE_,
typename _SIZE_>
380 operator_vect_vect_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_VECT::ADD_>(resu,vx,opt);
383template<
typename _TYPE_,
typename _SIZE_>
386 operator_vect_vect_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_VECT::SUB_>(resu,vx,opt);
389template<
typename _TYPE_,
typename _SIZE_>
392 operator_vect_vect_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_VECT::MULT_>(resu,vx,opt);
395template<
typename _SIZE_>
398template<
typename _TYPE_,
typename _SIZE_>
401 operator_vect_vect_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_VECT::DIV_>(resu,vx,opt);
404template<
typename _TYPE_,
typename _SIZE_>
407 operator_vect_vect_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_VECT::EGAL_>(resu,vx,opt);
410enum class TYPE_OPERATOR_SINGLE { ADD_ , SUB_ , MULT_ , DIV_ , EGAL_ , NEGATE_ , INV_ , ABS_ , SQRT_ , SQUARE_ };
412template <
typename _TYPE_,
typename _SIZE_, TYPE_OPERATOR_SINGLE _TYPE_OP_ >
415template<
typename _TYPE_,
typename _SIZE_>
418 operator_vect_single_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_SINGLE::ADD_>(resu,x,opt);
421template<
typename _TYPE_,
typename _SIZE_>
424 operator_vect_single_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_SINGLE::SUB_>(resu,x,opt);
428template<
typename _TYPE_,
typename _SIZE_,
typename _SCALAR_TYPE_>
429typename std::enable_if<std::is_convertible<_SCALAR_TYPE_, _TYPE_>::value >::type
432 operator_vect_single_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_SINGLE::MULT_>(resu,x,opt);
435template<
typename _SIZE_>
436inline void operator_divide(
TRUSTVect<int,_SIZE_>& resu,
const int x, Mp_vect_options opt=VECT_ALL_ITEMS) =
delete;
438template<
typename _TYPE_,
typename _SIZE_>
441 operator_vect_single_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_SINGLE::DIV_>(resu,x,opt);
444template<
typename _TYPE_,
typename _SIZE_>
447 operator_vect_single_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_SINGLE::EGAL_>(resu,x,opt);
450template<
typename _TYPE_,
typename _SIZE_>
453 operator_vect_single_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_SINGLE::NEGATE_>(resu,(_TYPE_)0 ,opt);
456template<
typename _SIZE_>
457inline void operator_inverse(
TRUSTVect<int,_SIZE_>& resu, Mp_vect_options opt=VECT_ALL_ITEMS) =
delete;
459template<
typename _TYPE_,
typename _SIZE_>
462 operator_vect_single_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_SINGLE::INV_>(resu,0. ,opt);
465template<
typename _TYPE_,
typename _SIZE_>
468 operator_vect_single_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_SINGLE::ABS_>(resu,(_TYPE_)0 ,opt);
471template<
typename _SIZE_>
474template<
typename _TYPE_,
typename _SIZE_>
477 operator_vect_single_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_SINGLE::SQRT_>(resu,0. ,opt);
480template<
typename _SIZE_>
483template<
typename _TYPE_,
typename _SIZE_>
486 racine_carree(resu,opt);
489template<
typename _TYPE_,
typename _SIZE_>
492 operator_vect_single_generic<_TYPE_,_SIZE_,TYPE_OPERATOR_SINGLE::SQUARE_>(resu,0. ,opt);
495template<
typename _TYPE_,
typename _SIZE_>
506enum class TYPE_OPERATION_VECT_SPEC { ADD_ , SQUARE_ };
508template <TYPE_OPERATION_VECT_SPEC _TYPE_OP_,
typename _SIZE_>
511template <TYPE_OPERATION_VECT_SPEC _TYPE_OP_ ,
typename _TYPE_,
typename _SIZE_>
514template<
typename _TYPE_,
typename _SIZE_>
517 ajoute_operation_speciale_generic<TYPE_OPERATION_VECT_SPEC::ADD_,_TYPE_>(resu,alpha,vx,opt);
520template<
typename _TYPE_,
typename _SIZE_>
523 ajoute_operation_speciale_generic<TYPE_OPERATION_VECT_SPEC::SQUARE_,_TYPE_>(resu,alpha,vx,opt);
526template<
typename _TYPE_,
typename _SIZE_>
529enum class TYPE_OPERATION_VECT_SPEC_GENERIC { MUL_ , DIV_ };
531template <TYPE_OPERATION_VECT_SPEC_GENERIC _TYPE_OP_ ,
typename _TYPE_,
typename _SIZE_>
534template <TYPE_OPERATION_VECT_SPEC_GENERIC _TYPE_OP_,
typename _SIZE_>
537template<
typename _SIZE_>
540template<
typename _TYPE_,
typename _SIZE_>
543 operation_speciale_tres_generic<TYPE_OPERATION_VECT_SPEC_GENERIC::MUL_,_TYPE_>(resu,vx,opt);
546template<
typename _SIZE_>
549template<
typename _TYPE_,
typename _SIZE_>
552 operation_speciale_tres_generic<TYPE_OPERATION_VECT_SPEC_GENERIC::DIV_,_TYPE_>(resu,vx,opt);
559template<
typename _TYPE_,
typename _SIZE_>
564 const _TYPE_ x = vx[0];
565 operator_multiply(resu, x, opt);
568 operator_multiply(resu, vx, opt);
570 tab_multiply_any_shape_(resu, vx, opt);
573template<
typename _SIZE_>
577template<
typename _TYPE_,
typename _SIZE_>
582 if (vx[0] == 0) error_divide(__func__);
583 const _TYPE_ x = 1. / vx[0];
584 operator_multiply(resu, x, opt);
587 operator_divide(resu, vx, opt);
589 tab_divide_any_shape_(resu, vx, opt);
592template<
typename _SIZE_>
virtual trustIdType nb_items_seq_tot() const
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
static double mp_min(double)
static double mp_max(double)
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static bool is_sequential()
Represents a an array of int/int64/double/... values.
_SIZE_ size_array() const
_SIZE_ size_totale() const
virtual const MD_Vector & get_md_vector() const
Block_Iter(const ArrOfInt &items_blocs)
Block_Iter(const Block_Iter &other)=default
Block_Iter(_SIZE_ s, _SIZE_ e)
Block_Iter & operator=(const Block_Iter &other)=default
Block_Iter(const ArrOfInt &items_blocs, const ArrOfInt &items)
Block_Iter operator++(int)