Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
RangeFunctor.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* RangeFunctor.h (C) 2000-2021 */
9/* */
10/* Fonctor sur un interval d'itération. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_RANGEFUNCTOR_H
13#define ARCANE_UTILS_RANGEFUNCTOR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/IRangeFunctor.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
31template<typename InstanceType>
33: public IRangeFunctor
34{
35 private:
36
37 typedef void (InstanceType::*FunctionType)(Integer i0,Integer size);
38
39 public:
40 RangeFunctorT(InstanceType* instance,FunctionType function)
41 : m_instance(instance), m_function(function)
42 {
43 }
44
45 public:
46
47 virtual void executeFunctor(Integer begin,Integer size)
48 {
49 (m_instance->*m_function)(begin,size);
50 }
51
52 private:
53 InstanceType* m_instance;
54 FunctionType m_function;
55};
56
57/*---------------------------------------------------------------------------*/
58/*---------------------------------------------------------------------------*/
64template<typename LambdaType>
66: public IRangeFunctor
67{
68 public:
70 : m_lambda_function(lambda_function)
71 {
72 }
73
74 public:
75
76 void executeFunctor(Integer begin,Integer size) override
77 {
78 m_lambda_function(begin,size);
79 }
80
81 private:
82 const LambdaType& m_lambda_function;
83};
84
85/*---------------------------------------------------------------------------*/
86/*---------------------------------------------------------------------------*/
92template<int RankValue,typename LambdaType>
94: public IMDRangeFunctor<RankValue>
95{
96 public:
98 : m_lambda_function(lambda_function)
99 {
100 }
101
102 public:
103
105 {
106 m_lambda_function(loop_range);
107 }
108
109 private:
110 const LambdaType& m_lambda_function;
111};
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
122template<typename LambdaType, typename... Views>
124: public IRangeFunctor
125{
126 public:
128 : m_lambda_function(lambda_function), m_views(std::forward_as_tuple(views...))
129 {
130 }
131
132 public:
133 void executeFunctor(Integer begin,Integer size) override
134 {
135 std::tuple<Views...> sub_views;
136 getSubView(sub_views, begin, size, std::make_index_sequence<sizeof...(Views)>{});
137 std::apply(m_lambda_function, sub_views);
138 }
139
140 private:
142 template <size_t... I>
143 void getSubView(std::tuple<Views...>& sub_views, Integer begin, Integer size, std::index_sequence<I...>)
144 {
145 ((std::get<I>(std::forward<decltype(sub_views)>(sub_views)) =
146 std::get<I>(std::forward<decltype(m_views)>(m_views)).subView(begin,size)), ...);
147 }
148
149 private:
150 const LambdaType& m_lambda_function;
151 std::tuple<Views...> m_views;
152};
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
157} // End namespace Arcane
158
159/*---------------------------------------------------------------------------*/
160/*---------------------------------------------------------------------------*/
161
162#endif
163
Fonctions mathématiques diverses.
Interface d'un fonctor sur un interval d'itération multi-dimensionnel de dimension RankValue.
Interface d'un fonctor sur un interval d'itération.
Fonctor sur un interval d'itération instancié via une lambda fonction.
void executeFunctor(const ComplexForLoopRanges< RankValue > &loop_range) override
Exécute la méthode associée.
Fonctor sur un interval d'itération instancié via une lambda fonction.
void getSubView(std::tuple< Views... > &sub_views, Integer begin, Integer size, std::index_sequence< I... >)
méthode interne pour découper les vues
void executeFunctor(Integer begin, Integer size) override
Exécute la méthode associée.
Fonctor sur un interval d'itération instancié via une lambda fonction.
void executeFunctor(Integer begin, Integer size) override
Exécute la méthode associée.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Fonctor sur un interval d'itération.
virtual void executeFunctor(Integer begin, Integer size)
Exécute la méthode associée.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-