Arcane  v3.14.10.0
Documentation utilisateur
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/*---------------------------------------------------------------------------*/
28/*!
29 * \brief Fonctor sur un interval d'itération.
30 */
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/*---------------------------------------------------------------------------*/
59/*!
60 * \brief Fonctor sur un interval d'itération instancié via une lambda fonction.
61 *
62 * Cette classe est utilisée avec le mécanisme des lambda fonctions du C++11.
63 */
64template<typename LambdaType>
66: public IRangeFunctor
67{
68 public:
69 LambdaRangeFunctorT(const LambdaType& lambda_function)
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/*---------------------------------------------------------------------------*/
87/*!
88 * \brief Fonctor sur un interval d'itération instancié via une lambda fonction.
89 *
90 * Cette classe est utilisée avec le mécanisme des lambda fonctions du C++11.
91 */
92template<int RankValue,typename LambdaType>
94: public IMDRangeFunctor<RankValue>
95{
96 public:
97 LambdaMDRangeFunctor(const LambdaType& lambda_function)
98 : m_lambda_function(lambda_function)
99 {
100 }
101
102 public:
103
104 void executeFunctor(const ComplexForLoopRanges<RankValue>& loop_range) override
105 {
106 m_lambda_function(loop_range);
107 }
108
109 private:
110 const LambdaType& m_lambda_function;
111};
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115/*!
116 * \brief Fonctor sur un interval d'itération instancié via une lambda fonction.
117 *
118 * Cette classe est utilisée avec le mécanisme des lambda fonctions du C++1x.
119 * Elle permet la gestion de plusieurs vues en paramètres de la lambda
120 *
121 */
122template<typename LambdaType, typename... Views>
124: public IRangeFunctor
125{
126 public:
127 LambdaRangeFunctorTVa(Views... views, const LambdaType& lambda_function)
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:
141 //! méthode interne pour découper les vues
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 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.
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 -*-