Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemFunctor.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* ItemFunctor.h (C) 2000-2024 */
9/* */
10/* Fonctor sur les entités. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ITEMFUNCTOR_H
13#define ARCANE_ITEMFUNCTOR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/RangeFunctor.h"
18#include "arcane/utils/Functor.h"
19
20#include "arcane/core/Item.h"
21#include "arcane/core/ItemVectorView.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \brief Classe de base des fonctors sur une liste d'entités.
33 *
34 * Cette classe permet de scinder une itération sur un ItemVector en
35 * garantissant que les itérations se font sur un multiple de \a m_block_size.
36 * Pour l'instant cette valeur vaut toujours 8 et donc les itérations sur
37 * entités se font par bloc de 8 valeurs. Cela permet de garantir pour la
38 * vectorisation que les sous-vues de \a m_items seront correctement alignées.
39 */
40class ARCANE_CORE_EXPORT AbstractItemRangeFunctor
41: public IRangeFunctor
42{
43 public:
44
45 static const Integer DEFAULT_GRAIN_SIZE = 400;
46
47 AbstractItemRangeFunctor(ItemVectorView items_view, Int32 grain_size);
48
49 public:
50
51 //! Nombre de blocs.
52 Int32 nbBlock() const { return m_nb_block; }
53
54 //! Taille souhaitée d'un intervalle d'itération.
55 Int32 blockGrainSize() const { return m_block_grain_size; }
56
57 protected:
58
59 ItemVectorView m_items;
60 Int32 m_block_size = 0;
61 Int32 m_nb_block = 0;
62 Int32 m_block_grain_size = 0;
63
64 protected:
65
66 ItemVectorView _view(Int32 begin_block, Int32 nb_block, Int32* true_begin = nullptr) const;
67
68 private:
69};
70
71/*---------------------------------------------------------------------------*/
72/*---------------------------------------------------------------------------*/
73/*!
74 * \brief Fonctor pour itérer sur une liste d'entités.
75 */
76template<typename InstanceType,typename ItemType>
79{
80 private:
81
82 typedef void (InstanceType::*FunctionType)(ItemVectorViewT<ItemType>);
83
84 public:
85 ItemRangeFunctorT(ItemVectorView items_view,InstanceType* instance,
86 FunctionType function,Integer grain_size = DEFAULT_GRAIN_SIZE)
87 : AbstractItemRangeFunctor(items_view,grain_size), m_instance(instance),
88 m_function(function)
89 {
90 }
91
92 private:
93
94 InstanceType* m_instance;
95 FunctionType m_function;
96
97 public:
98
99 virtual void executeFunctor(Int32 begin, Int32 size)
100 {
101 //cout << "** BLOCKED RANGE! range=" << range.begin() << " end=" << range.end() << " size=" << range.size() << "\n";
102 //CellVectorView sub_view = m_cells.subView(range.begin(),range.size());
103 ItemVectorViewT<ItemType> sub_view(this->_view(begin,size));
104 //cout << "** SUB_VIEW v=" << sub_view.size();
105 (m_instance->*m_function)(sub_view);
106 }
107};
108
109/*---------------------------------------------------------------------------*/
110/*---------------------------------------------------------------------------*/
111/*!
112 * \brief Fonctor sur un interval d'itération instancié via une lambda fonction.
113 *
114 * Cette classe est utilisée avec le mécanisme des lambda fonctions du C++1x.
115 */
116template<typename LambdaType>
119{
120 public:
121 LambdaItemRangeFunctorT(ItemVectorView items_view,const LambdaType& lambda_function,
122 Int32 grain_size = DEFAULT_GRAIN_SIZE)
123 : AbstractItemRangeFunctor(items_view,grain_size), m_lambda_function(lambda_function)
124 {
125 }
126
127 public:
128
129 void executeFunctor(Int32 begin, Int32 size) override
130 {
131 Int32 true_begin = 0;
132 ItemVectorView sub_view(this->_view(begin, size, &true_begin));
133 // La lambda peut avoir deux prototypes :
134 // - elle prend uniquement un ItemVectorView en argument (version historique)
135 // - elle prend un ItemVectorView et l'indice du début du vecteur. Cela
136 // permet de connaitre l'index de l'itération
137 if constexpr (std::is_invocable_v<LambdaType, ItemVectorView>)
138 m_lambda_function(sub_view);
139 else
140 m_lambda_function(sub_view, true_begin);
141 }
142
143 private:
144
145 const LambdaType& m_lambda_function;
146};
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150/*!
151 * \brief Fonctor pour le calcul des éléments d'un groupe.
152 */
154: public IFunctor
155{
156 public:
157
158 ItemGroupComputeFunctor() = default;
159
160 public:
161
162 void setGroup(ItemGroupImpl* group) { m_group = group; }
163
164 protected:
165
166 ItemGroupImpl* m_group = nullptr;
167};
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171
172}
173
174/*---------------------------------------------------------------------------*/
175/*---------------------------------------------------------------------------*/
176
177#endif
178
Classe de base des fonctors sur une liste d'entités.
Definition ItemFunctor.h:42
Int32 nbBlock() const
Nombre de blocs.
Definition ItemFunctor.h:52
Int32 blockGrainSize() const
Taille souhaitée d'un intervalle d'itération.
Definition ItemFunctor.h:55
Interface d'un fonctor sur un interval d'itération.
Fonctor pour le calcul des éléments d'un groupe.
Fonctor pour itérer sur une liste d'entités.
Definition ItemFunctor.h:79
Vue sur un tableau typé d'entités.
Vue sur un vecteur d'entités.
Fonctor sur un interval d'itération instancié via une lambda fonction.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-