Arcane  v4.1.1.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
SequentialFor.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* SequentialFor.h (C) 2000-2025 */
9/* */
10/* Gestion des boucles for en séquentiel. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_COMMON_SEQUENTIALFOR_H
13#define ARCCORE_COMMON_SEQUENTIALFOR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/common/HostKernelRemainingArgsHelper.h"
18#include "arccore/base/ForLoopRanges.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28//! Applique le functor \a func sur une boucle 1D.
29template <typename IndexType, template <int T, typename> class LoopBoundType,
30 typename Lambda, typename... RemainingArgs>
31void arccoreSequentialFor(LoopBoundType<1, IndexType> bounds, const Lambda& func,
32 RemainingArgs... remaining_args)
33{
35 for (Int32 i0 = bounds.template lowerBound<0>(); i0 < bounds.template upperBound<0>(); ++i0)
36 func(MDIndex<1>(i0), remaining_args...);
38}
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
43//! Applique le functor \a func sur une boucle 2D.
44template <typename IndexType, template <int T, typename> class LoopBoundType, typename Lambda> void
45arccoreSequentialFor(LoopBoundType<2, IndexType> bounds, const Lambda& func)
46{
47 for (Int32 i0 = bounds.template lowerBound<0>(); i0 < bounds.template upperBound<0>(); ++i0)
48 for (Int32 i1 = bounds.template lowerBound<1>(); i1 < bounds.template upperBound<1>(); ++i1)
49 func(MDIndex<2>(i0, i1));
50}
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
54
55//! Applique le functor \a func sur une boucle 3D.
56template <typename IndexType, template <int T, typename> class LoopBoundType, typename Lambda> void
57arccoreSequentialFor(LoopBoundType<3, IndexType> bounds, const Lambda& func)
58{
59 for (Int32 i0 = bounds.template lowerBound<0>(); i0 < bounds.template upperBound<0>(); ++i0)
60 for (Int32 i1 = bounds.template lowerBound<1>(); i1 < bounds.template upperBound<1>(); ++i1)
61 for (Int32 i2 = bounds.template lowerBound<2>(); i2 < bounds.template upperBound<2>(); ++i2)
62 func(MDIndex<3>(i0, i1, i2));
63}
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
68//! Applique le functor \a func sur une boucle 4D.
69template <typename IndexType, template <int, typename> class LoopBoundType, typename Lambda> void
70arccoreSequentialFor(LoopBoundType<4, IndexType> bounds, const Lambda& func)
71{
72 for (Int32 i0 = bounds.template lowerBound<0>(); i0 < bounds.template upperBound<0>(); ++i0)
73 for (Int32 i1 = bounds.template lowerBound<1>(); i1 < bounds.template upperBound<1>(); ++i1)
74 for (Int32 i2 = bounds.template lowerBound<2>(); i2 < bounds.template upperBound<2>(); ++i2)
75 for (Int32 i3 = bounds.template lowerBound<3>(); i3 < bounds.template upperBound<3>(); ++i3)
76 func(MDIndex<4>(i0, i1, i2, i3));
77}
78
79/*---------------------------------------------------------------------------*/
80/*---------------------------------------------------------------------------*/
81
82} // End namespace Arcane
83
84/*---------------------------------------------------------------------------*/
85/*---------------------------------------------------------------------------*/
86
87#endif
static void applyAtEnd(RemainingArgs &... remaining_args)
Applique les functors des arguments additionnels à la fin de l'itération.
static void applyAtBegin(RemainingArgs &... remaining_args)
Applique les functors des arguments additionnels au début de l'itération.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
void arccoreSequentialFor(LoopBoundType< 1, IndexType > bounds, const Lambda &func, RemainingArgs... remaining_args)
Applique le functor func sur une boucle 1D.
std::int32_t Int32
Type entier signé sur 32 bits.